mirror of
https://github.com/Anarios/return-youtube-dislike.git
synced 2026-10-28 07:44:31 +01:00
Merge upstream main for the 4.1.0 release
This commit is contained in:
@@ -56,10 +56,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version-file: .nvmrc
|
||||
cache: npm
|
||||
@@ -98,19 +98,19 @@ jobs:
|
||||
run: npm run test:e2e:userscript:run
|
||||
|
||||
- name: Upload Chrome artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ryd-chrome
|
||||
path: ./Extensions/combined/dist/chrome
|
||||
|
||||
- name: Upload Firefox artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ryd-firefox
|
||||
path: ./Extensions/combined/dist/firefox
|
||||
|
||||
- name: Upload Safari artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v6
|
||||
with:
|
||||
name: ryd-safari
|
||||
path: ./Extensions/combined/dist/safari
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v6
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v4
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [English](CONTRIBUTING.md), [العربية](CONTRIBUTINGar.md), [Azərbaycan dili](CONTRIBUTINGaz.md), [беларуская](CONTRIBUTINGbe.md), [български](CONTRIBUTINGbg.md), [中文](CONTRIBUTINGcn.md), [Dansk](CONTRIBUTINGda.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md), [Français](CONTRIBUTINGfr.md), [Ελληνικά](CONTRIBUTINGgr.md), [Magyar](CONTRIBUTINGhu.md), [Bahasa Indonesia](CONTRIBUTINGid.md), [日本語](CONTRIBUTINGja.md), [한국어](CONTRIBUTINGkr.md), [Nederlands](CONTRIBUTINGnl.md), [Polski](CONTRIBUTINGpl.md), [Português do Brasil](CONTRIBUTINGpt_BR.md), [русский](CONTRIBUTINGru.md), [Svenska](CONTRIBUTINGsv.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Tiếng Việt](CONTRIBUTINGvi.md), [Slovenščina](CONTRIBUTINGsl.md)
|
||||
Read this in other languages: [English](CONTRIBUTING.md), [فارسی](CONTRIBUTINGfa.md), [العربية](CONTRIBUTINGar.md), [Azərbaycan dili](CONTRIBUTINGaz.md), [беларуская](CONTRIBUTINGbe.md), [български](CONTRIBUTINGbg.md), [中文](CONTRIBUTINGcn.md), [Dansk](CONTRIBUTINGda.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md), [Français](CONTRIBUTINGfr.md), [Ελληνικά](CONTRIBUTINGgr.md), [Magyar](CONTRIBUTINGhu.md), [Bahasa Indonesia](CONTRIBUTINGid.md), [日本語](CONTRIBUTINGja.md), [한국어](CONTRIBUTINGkr.md), [Nederlands](CONTRIBUTINGnl.md), [Polski](CONTRIBUTINGpl.md), [Português do Brasil](CONTRIBUTINGpt_BR.md), [русский](CONTRIBUTINGru.md), [Svenska](CONTRIBUTINGsv.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Tiếng Việt](CONTRIBUTINGvi.md), [Slovenščina](CONTRIBUTINGsl.md)
|
||||
|
||||
# Welcome To Return YouTube Dislikes contributing guide
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
Read this in other languages: [English](CONTRIBUTING.md), [فارسی](CONTRIBUTINGfa.md), [العربية](CONTRIBUTINGar.md), [Azərbaycan dili](CONTRIBUTINGaz.md), [беларуская](CONTRIBUTINGbe.md), [български](CONTRIBUTINGbg.md), [中文](CONTRIBUTINGcn.md), [Dansk](CONTRIBUTINGda.md), [Deutsch](CONTRIBUTINGde.md), [Español](CONTRIBUTINGes.md), [Français](CONTRIBUTINGfr.md), [Ελληνικά](CONTRIBUTINGgr.md), [Magyar](CONTRIBUTINGhu.md), [Bahasa Indonesia](CONTRIBUTINGid.md), [日本語](CONTRIBUTINGja.md), [한국어](CONTRIBUTINGkr.md), [Nederlands](CONTRIBUTINGnl.md), [Polski](CONTRIBUTINGpl.md), [Português do Brasil](CONTRIBUTINGpt_BR.md), [русский](CONTRIBUTINGru.md), [Svenska](CONTRIBUTINGsv.md), [Türkçe](CONTRIBUTINGtr.md), [українська](CONTRIBUTINGuk.md), [Tiếng Việt](CONTRIBUTINGvi.md), [Slovenščina](CONTRIBUTINGsl.md)
|
||||
|
||||
# به راهنمای مشارکت Return YouTube Dislikes خوش آمدید
|
||||
|
||||
از اینکه وقت خود را برای مشارکت در پروژه ما اختصاص میدهید سپاسگزاریم! تمام تغییرات شما در نسخه بعدی افزونه (یا [وبسایت](https://www.returnyoutubedislike.com/)) منعکس خواهد شد.
|
||||
|
||||
## شروع به کار
|
||||
|
||||
لطفاً از Prettier با تنظیمات پیشفرض برای قالببندی استفاده کنید.
|
||||
|
||||
#### پیشنیازها
|
||||
|
||||
برای ایجاد نسخه bundled از سورس، باید node و npm را نصب داشته باشید.
|
||||
|
||||
نسخههای استفادهشده در زمان راهاندازی:
|
||||
|
||||
- node: 12.18.4
|
||||
- npm: 6.14.6
|
||||
|
||||
برای ایجاد `bundled-content-script.js` که شامل بیشتر منطق اصلی این افزونه است، ابتدا باید تمام وابستگیها را نصب کنید.
|
||||
|
||||
۱. به ریشه مخزن بروید و اجرا کنید:
|
||||
|
||||
```
|
||||
npm install
|
||||
```
|
||||
|
||||
۲. دستور زیر را برای ایجاد `bundled-content-script.js` که در `manifest.json` استفاده میشود اجرا کنید:
|
||||
|
||||
```
|
||||
npm start // برای ایجاد فایل(های) بیلد و شروع یک مشاهدهگر فایل که هنگام ذخیره به صورت لحظهای بارگذاری مجدد میکند
|
||||
|
||||
// یا
|
||||
|
||||
npm run build // برای ایجاد فایل(های) بیلد به صورت یکباره
|
||||
```
|
||||
|
||||
تبریک، اکنون آماده توسعه هستید!
|
||||
|
||||
اگر در توسعه افزونههای Chrome تازهکار هستید یا به کمک بیشتری نیاز دارید، لطفاً [این آموزش YouTube](https://www.youtube.com/watch?v=mdOj6HYE3_0) را مشاهده کنید.
|
||||
|
||||
### مشکلات
|
||||
|
||||
#### باز کردن یک issue جدید
|
||||
|
||||
اگر مشکلی با افزونه دارید، لطفاً جستجو کنید تا مطمئن شوید مشکل قبلاً گزارش نشده است. اگر گزارش نشده بود، یک issue باز کنید؛ استفاده از فرم issue به شدت توصیه میشود اما اجباری نیست.
|
||||
|
||||
#### حل یک issue
|
||||
|
||||
اگر مشکلی پیدا کردید که احساس میکنید قادر به حل آن هستید، خجالت نکشید. یک PR همراه با رفع مشکل باز کنید و حتماً به issueای که حل میکنید اشاره کنید.
|
||||
|
||||
### درخواست ویژگی
|
||||
|
||||
#### باز کردن یک درخواست ویژگی جدید
|
||||
|
||||
اگر ایدهای برای افزونه دارید، با خیال راحت یک درخواست ویژگی باز کنید، اما لطفاً قبل از آن جستجو کنید تا مطمئن شوید این ویژگی قبلاً پیشنهاد نشده است. استفاده از فرم ویژگی به شدت توصیه میشود اما اجباری نیست.
|
||||
|
||||
#### پیادهسازی یک درخواست ویژگی
|
||||
|
||||
اگر ویژگی پیدا کردید که فکر میکنید میتوانید آن را پیادهسازی کنید، خجالت نکشید. یک PR همراه با رفع مشکل باز کنید و حتماً به ویژگیای که پیادهسازی میکنید اشاره نمایید.
|
||||
|
||||
### چه PRهایی را میپذیریم؟
|
||||
|
||||
- رفع مشکلات.
|
||||
- پیادهسازی ویژگیها.
|
||||
- اشتباهات تایپی یا کلمات بهتر و آسانتر برای استفاده.
|
||||
- مشارکت در وبسایت.
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [беларуская](FAQbe.md), [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md), [Português do Brasil](FAQpt_BRmd), [العربية](FAQar.md), [Bahasa Indonesia](FAQid.md), [中文](FAqcn.md), [български](FAQbg.md), [Tiếng Việt](FAQvi.md), [Slovenščina](FAQsl.md)
|
||||
Read this in other languages: [English](FAQ.md), [فارسی](FAQfa.md), [беларуская](FAQbe.md), [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md), [Português do Brasil](FAQpt_BRmd), [العربية](FAQar.md), [Bahasa Indonesia](FAQid.md), [中文](FAqcn.md), [български](FAQbg.md), [Tiếng Việt](FAQvi.md), [Slovenščina](FAQsl.md)
|
||||
|
||||
|
||||
# Frequently Asked Questions
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
Read this in other languages: [English](FAQ.md), [فارسی](FAQfa.md), [беларуская](FAQbe.md), [русский](FAQru.md), [Français](FAQfr.md), [Nederlands](FAQnl.md), [Türkçe](FAQtr.md), [українська](FAQuk.md), [Polski](FAQpl.md), [Deutsch](FAQde.md), [Português do Brasil](FAQpt_BRmd), [العربية](FAQar.md), [Bahasa Indonesia](FAQid.md), [中文](FAqcn.md), [български](FAQbg.md), [Tiếng Việt](FAQvi.md), [Slovenščina](FAQsl.md)
|
||||
|
||||
|
||||
# پرسشهای متداول
|
||||
|
||||
## قبل از مطرح کردن سوال در GitHub یا Discord، لطفاً به این بخش مراجعه کنید.
|
||||
|
||||
<br>
|
||||
|
||||
### **۱. این افزونه دادهها را از کجا دریافت میکند؟**
|
||||
|
||||
ترکیبی از Google APIها و دادههای جمعآوریشده.
|
||||
|
||||
ما تمام دادههای موجود را در دیتابیس خود ذخیره میکنیم تا پس از اینکه Google تعداد dislike را در API خود خاموش کرد، در دسترس باشد.
|
||||
|
||||
<br>
|
||||
|
||||
### **۲. تعداد dislike ویدیو بهروزرسانی نمیشود**
|
||||
|
||||
در حال حاضر dislikeهای ویدیو cache میشوند و خیلی مکرر بهروزرسانی نمیشوند. هر ۲ الی ۳ روز یکبار، نه بیشتر.
|
||||
|
||||
بله، ایدهآل نیست، اما وضعیت فعلی اینگونه است. در حال کار روی بهبود دفعات بهروزرسانی آنها هستیم.
|
||||
|
||||
<br>
|
||||
|
||||
### **۳. این چگونه کار میکند؟**
|
||||
|
||||
این افزونه video id ویدیویی را که در حال تماشای آن هستید جمعآوری میکند، dislike (و سایر فیلدها مانند viewها، likeها و غیره) را با استفاده از API ما دریافت میکند، اگر این اولین باری است که ویدیو توسط API ما دریافت شده است، از YouTube API برای دریافت دادهها استفاده میکند، سپس دادهها را در یک پایگاه داده برای اهداف caching (حدود ۲ الی ۳ روز cache میشود) و بایگانی ذخیره کرده و به شما برمیگرداند. سپس افزونه dislikeها را به شما نشان میدهد.
|
||||
|
||||
<br>
|
||||
|
||||
### **۴. پس از توقف بازگرداندن تعداد dislike توسط YouTube API چه اتفاقی خواهد افتاد؟**
|
||||
|
||||
بخش backend به استفاده از ترکیبی از آمار dislike آرشیو شده، برآوردهای تخمینزدهشده از دادههای کاربران افزونه و برآوردهای مبتنی بر نسبت view/like برای ویدیوهایی که dislikeهای آنها آرشیو نشده و برای آرشیوهای قدیمی dislike تغییر وضعیت خواهد داد.
|
||||
|
||||
<br>
|
||||
|
||||
### **۵. تعداد dislike چگونه محاسبه میشود؟**
|
||||
|
||||
پروژه RYD از آرای کاربران خود برای تخمین تعداد dislike استفاده میکند.
|
||||
|
||||
- اگر ویدیو پس از خاموش شدن API آپلود شده باشد:
|
||||
|
||||
$$ \textup{RYD Dislike Count} = \left( \frac{\textup{RYD Users Dislike Count}}{\textup{RYD Users Like Count}} \right) \times \textup{Public Like Count} $$
|
||||
|
||||
- اگر دیتابیس RYD به نوعی تعداد واقعی like و dislike را داشته باشد (ارائهشده توسط آپلودکننده یا از آرشیو)، تعداد dislike بر اساس هر دو - آرای کاربران و مقدار آرشیو شده محاسبه خواهد شد. مقدار آرشیو شده با گذشت زمان تأثیر کمتری بر شمارش نهایی خواهد داشت.
|
||||
|
||||
<br>
|
||||
|
||||
---
|
||||
|
||||
این به شکل ویدیو
|
||||
|
||||
[](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
|
||||
|
||||
---
|
||||
|
||||
<br>
|
||||
|
||||
## من نگرانیهای امنیتی / حریم خصوصی دارم
|
||||
|
||||
برای اطلاعات بیشتر [این صفحه](SECURITY-FAQ.md) را ببینید.
|
||||
+1
-1
@@ -40,7 +40,7 @@ RYD використовує відмітки своїх користувачі
|
||||
|
||||
- Якщо відео було завантажено після вимкнення API:
|
||||
|
||||
$$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Подобається» серед користувачів RYD}}{\textup{К-ть відміток «Не подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$
|
||||
$$ \textup{К-ть відміток «Не подобається» у RYD} = \left( \frac{\textup{К-ть відміток «Не подобається» серед користувачів RYD}}{\textup{К-ть відміток «Подобається» серед користувачів RYD}} \right) \times \textup{Публічна к-ть відміток «Подобається»} $$
|
||||
|
||||
- Якщо база даних RYD якимось чином мала фактичну кількість відміток «Подобається» та «Не подобається» (надану завантажувачем або з архіву), кількість відміток «Не подобається» буде розраховано на основі відміток користувачів і архівного значення. Архівне значення матиме менший вплив на остаточний підрахунок у міру актуальності.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [беларуская](SECURITY-FAQbe.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md), [العربية](SECURITY-FAQar.md), [Bahasa Indonesia](SECURITY-FAQid.md), [中文](SECURITY-FAQcn.md), [български](SECURITY-FAQbg.md), [Tiếng Việt](SECURITY-FAQvi.md), [Slovenščina](SECURITY-FAQsl.md)
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [فارسی](SECURITY-FAQfa.md), [беларуская](SECURITY-FAQbe.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md), [العربية](SECURITY-FAQar.md), [Bahasa Indonesia](SECURITY-FAQid.md), [中文](SECURITY-FAQcn.md), [български](SECURITY-FAQbg.md), [Tiếng Việt](SECURITY-FAQvi.md), [Slovenščina](SECURITY-FAQsl.md)
|
||||
|
||||
# Security
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
Read this in other languages: [English](SECURITY-FAQ.md), [فارسی](SECURITY-FAQfa.md), [беларуская](SECURITY-FAQbe.md), [русский](SECURITY-FAQru.md), [Nederlands](SECURITY_FAQnl.md), [Français](SECURITY-FAQfr.md), [Türkçe](SECURITY-FAQtr.md), [українська](SECURITY-FAQuk.md), [Polski](SECURITY-FAQpl.md), [Deutsch](SECURITY-FAQde.md), [العربية](SECURITY-FAQar.md), [Bahasa Indonesia](SECURITY-FAQid.md), [中文](SECURITY-FAQcn.md), [български](SECURITY-FAQbg.md), [Tiếng Việt](SECURITY-FAQvi.md), [Slovenščina](SECURITY-FAQsl.md)
|
||||
|
||||
# امنیت
|
||||
|
||||
### آیا تاریخچه تماشای من را ردیابی میکنید؟
|
||||
|
||||
این افزونه ID ویدیوی فعلی و در صورت در دسترس بودن، تعداد like قابل مشاهده آن را به Return YouTube Dislike API ارسال میکند زیرا سرور برای بازگرداندن و بهبود تخمین dislike به آنها نیاز دارد. این درخواست همچنین متادیتای استاندارد شبکه مانند آدرس IP عمومی و زمان درخواست را ارسال میکند. این افزونه نام حساب YouTube شما، نظرات، دادههای خصوصی YouTube یا محتوای صفحات غیرمرتبط را ارسال نمیکند و فهرست سابقه تماشای محلی جداگانهای نگهداری نمیکند.
|
||||
|
||||
### آیا در صورت ثبت dislike میتوانید من را به طور منحصربهفرد شناسایی کنید؟
|
||||
|
||||
این افزونه یک شناسه تصادفی پایدار برای ارسال رای مقاوم در برابر سوءاستفاده ایجاد میکند. این شناسه از حساب Google یا YouTube شما مشتق نشده و به آن متصل نیست، اما Mozilla شناسههای پایدار را به عنوان دادههای شخصی طبقهبندی میکند. این شناسه به سرویس اجازه میدهد تا آرای ارسالی را با همان نصب افزونه مرتبط کند.
|
||||
|
||||
### دقیقاً چه اطلاعاتی دارید؟
|
||||
|
||||
برای درخواستهای تعداد dislike: شناسه ویدیوی فعلی و در صورت در دسترس بودن، تعداد like قابل مشاهده. برای ثبتنام و ارسال رای: شناسه تصادفی کاربر افزونه، شناسه ویدیو، رای انتخابشده و برچسب زمانی. این API همچنین آدرس IP شما را دریافت میکند. آدرسهای خام در RAM باقی میمانند و هشها برای کنترل سوءاستفاده ذخیره میشوند. ویژگیهای اختیاری پریمیوم از شناسه حساب، نام، آدرس ایمیل، تصویر پروفایل، اطلاعات عضویت و توکن سشن سرویس بازگردانده شده توسط ورود با Patreon یا GitHub که توسط کاربر آغاز شده است، استفاده میکنند. برای نسخه 4.0.6 و نسخه backend متناظر با آن، دسترسی Patreon از روی شناسههای سطوح دارای حق فعلی تعیین میشود، نه اطلاعات مالی.
|
||||
|
||||
### آدرس IP من چگونه ذخیره میشود؟
|
||||
|
||||
آدرسهای خام IP در RAM باقی میمانند و هشها ذخیره میشوند. این اطلاعات برای جلوگیری از سوءاستفاده و تحلیلهای آماری کلی استفاده میشود. فروخته نمیشود و برای تبلیغات استفاده نمیگردد.
|
||||
|
||||
### من گفتگوهایی درباره OAuth و دسترسی به حساب YouTube خود شنیدهام!
|
||||
|
||||
ورود به بخش تحلیلی پریمیوم اختیاری است و فقط پس از اینکه کاربر ورود به Patreon یا GitHub را در افزونه انتخاب کند آغاز میشود. فرآیند OAuth جزئیات حساب و یک توکن سشن Return YouTube Dislike را برمیگرداند که برای احراز هویت درخواستهای API پریمیوم استفاده میشود. در نسخه 4.0.6 و نسخه متناظر backend آن، واجد شرایط بودن در Patreon از شناسههای سطحهای دارای حق فعلی استفاده میکند؛ این سرویس مبالغ عضویت، تاریخها یا وضعیت شارژ، پرداختهای مادامالعمر یا وضعیت حامی را درخواست یا استفاده نمیکند. Firefox قبل از شروع تبادل دادههای حساب، رضایت جداگانهای برای دادههای احراز هویت درخواست میکند. خروج از حساب، جزئیات حساب ذخیرهشده و سشن را از افزونه پاک میکند. لغو مجوز دادههای احراز هویت در Firefox نیز سشن حساب را پاک میکند و تبادل دادههای بعدی حساب را تا زمانی که دوباره رضایت داده و وارد شوید مسدود میسازد. در صورت فعال بودن Browser sync، شناسه نصب، تنظیمات و سشن حساب ممکن است همگامسازی شوند.
|
||||
|
||||
### چگونه میتوانم به این تعداد dislike اعتماد کنم؟
|
||||
|
||||
ما اقداماتی را برای جلوگیری از حملات باتها اجرا کردهایم و به کار روی بهبود اثربخشی سیستم جلوگیری از بات ادامه خواهیم داد: این به ما کمک میکند تا تعداد dislike را به عنوان نماینده خوبی از تعداد واقعی حفظ کنیم. البته هرگز ۱۰۰٪ دقیق نخواهد بود، بنابراین تصمیمگیری در مورد اینکه به این تعداد اعتماد کنید یا نه بر عهده شماست.
|
||||
|
||||
### چرا کد backend را به اشتراک نمیگذارید؟
|
||||
|
||||
ما در نقطهای آن را به اشتراک خواهیم گذاشت - اما در حال حاضر واقعاً دلیل موجهی برای به اشتراک گذاشتن آن وجود ندارد. این یک حس کاذب از امنیت ایجاد میکند - زیرا در یک سیستم zero-trust، ما میتوانستیم یک نسخه را اعلام کنیم اما نسخه دیگری را مستقر نماییم. دلایل متعددی برای پنهان نگه داشتن کد وجود دارد، به ویژه نحوه مبارزه ما با هرزنامه. پنهانسازی/مبهمسازی کد رسیدگی به هرزنامه یک روش کاملاً استاندارد است.
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
Read this in other languages: [беларуская](readmebe.md), [Nederlands](readmenl.md), [Français](readmefr.md), [Türkçe](readmetr.md), [Bahasa Indonesia](readmeid.md), [中文](readmecn.md), [Tiếng Việt](readmevi.md)
|
||||
Read this in other languages: [English](readme.md), [فارسی](readmefa.md), [беларуская](readmebe.md), [Nederlands](readmenl.md), [Français](readmefr.md), [Türkçe](readmetr.md), [Bahasa Indonesia](readmeid.md), [中文](readmecn.md), [Tiếng Việt](readmevi.md)
|
||||
|
||||
**Contents**
|
||||
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
Read this in other languages: [English](readme.md), [فارسی](readmefa.md), [беларуская](readmebe.md), [Nederlands](readmenl.md), [Français](readmefr.md), [Türkçe](readmetr.md), [Bahasa Indonesia](readmeid.md), [中文](readmecn.md), [Tiếng Việt](readmevi.md)
|
||||
|
||||
**فهرست**
|
||||
|
||||
- [راهنماها](#راهنماها)
|
||||
- [پرسشهای متداول](#پرسشهای-متداول)
|
||||
<!-- - [FAQs](#faqs)
|
||||
- [Other Lists](#other-lists) -->
|
||||
|
||||
<br>
|
||||
|
||||
## راهنماها
|
||||
|
||||
- [دانلود، نصب و استفاده](https://github.com/Anarios/return-youtube-dislike/wiki/Downloading,-Installing-&-Using)
|
||||
- [عیبیابی](https://github.com/Anarios/return-youtube-dislike/wiki/Troubleshooting-Guide)
|
||||
<!-- - [FAQ](FAQ.md)
|
||||
- [When & How to Report Bugs](Guide__Bug_Reporting.md)
|
||||
- [Contributing](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md) -->
|
||||
<!-- - [How to update wiki](/) -->
|
||||
|
||||
<br>
|
||||
|
||||
## پرسشهای متداول
|
||||
|
||||
- [عمومی](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
- [امنیتی](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md)
|
||||
|
||||
<!-- - [Privacy](FAQ_Privacy.md)
|
||||
- [Technical](FAQ_Technical.md)
|
||||
- [Creators](FAQ_Creators.md)
|
||||
|
||||
<br>
|
||||
|
||||
## Other Lists
|
||||
|
||||
- [Common Problems](Common_Problems.md)
|
||||
- [Repeated Questions](Repeated_Questions.md)
|
||||
- [Repeated Feature requests](Repeated_Feature_requests.md)
|
||||
- [Repeated Issues](Repeated_Issues.md) -->
|
||||
@@ -482,14 +482,15 @@ test("modern Shorts supports the colored-thumbs option", async ({ context, page
|
||||
},
|
||||
);
|
||||
await waitForDislikeCount(page, 25);
|
||||
const neutralColor = await visibleVoteButton(page, "dislike").evaluate((button) => getComputedStyle(button).color);
|
||||
|
||||
await visibleVoteButton(page, "dislike").click();
|
||||
await expect.poll(() => harness.backend.requestsFor("POST", "/interact/confirmVote").length).toBe(1);
|
||||
await expect.poll(() => visibleVoteButton(page, "dislike").evaluate((button) => button.style.color)).toBe("red");
|
||||
await expect(visibleVoteButton(page, "dislike")).toHaveCSS("color", "rgb(255, 0, 0)");
|
||||
|
||||
await visibleVoteButton(page, "dislike").click();
|
||||
await expect.poll(() => harness.backend.requestsFor("POST", "/interact/confirmVote").length).toBe(2);
|
||||
await expect.poll(() => visibleVoteButton(page, "dislike").evaluate((button) => button.style.color)).toBe("unset");
|
||||
await expect(visibleVoteButton(page, "dislike")).toHaveCSS("color", neutralColor);
|
||||
await expectNoRuntimeFailures(harness);
|
||||
});
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ describe("generated userscript artifact", () => {
|
||||
it("contains the candidate metadata and required modern and legacy grants", () => {
|
||||
expect(artifact.startsWith("// ==UserScript==\n")).toBe(true);
|
||||
expect(artifact).toContain(`// @version ${userscriptMeta.version}`);
|
||||
expect(userscriptMeta.version).toBe("3.2.0");
|
||||
expect(userscriptMeta.version).toBe("3.2.1");
|
||||
expect(artifact).toContain(`// @downloadURL ${userscriptMeta.downloadURL}`);
|
||||
expect(artifact).toContain(`// @updateURL ${userscriptMeta.updateURL}`);
|
||||
for (const grant of userscriptMeta.grants) {
|
||||
|
||||
@@ -0,0 +1,998 @@
|
||||
{
|
||||
"apiStatusLabel": {
|
||||
"message": "وضعیت API:"
|
||||
},
|
||||
"apiStatusOffline": {
|
||||
"message": "آفلاین"
|
||||
},
|
||||
"apiStatusOnline": {
|
||||
"message": "آنلاین"
|
||||
},
|
||||
"colorTheme": {
|
||||
"message": "تم رنگی:"
|
||||
},
|
||||
"textColorThemeHibiscus": {
|
||||
"message": "هیبیسکوس"
|
||||
},
|
||||
"textColorThemeCustom": {
|
||||
"message": "سفارشی"
|
||||
},
|
||||
"colorThemeLight": {
|
||||
"message": "تم روشن YouTube"
|
||||
},
|
||||
"colorThemeDark": {
|
||||
"message": "تم تیره YouTube"
|
||||
},
|
||||
"colorThemeLike": {
|
||||
"message": "Like"
|
||||
},
|
||||
"colorThemeDislike": {
|
||||
"message": "Dislike"
|
||||
},
|
||||
"colorizeRatio": {
|
||||
"message": "رنگی کردن نوار نسبت"
|
||||
},
|
||||
"colorizeRatioHover": {
|
||||
"message": "استفاده از رنگهای سفارشی برای نوار نسبت."
|
||||
},
|
||||
"colorizeThumbs": {
|
||||
"message": "رنگی کردن شستها"
|
||||
},
|
||||
"colorizeThumbsHover": {
|
||||
"message": "استفاده از رنگهای سفارشی برای آیکونهای شست."
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "تنها چیزی که این افزونه را فعال نگه میدارد کمکهای مالی شماست، لطفاً از این پروژه حمایت کنید."
|
||||
},
|
||||
"customColors": {
|
||||
"message": "رنگهای سفارشی برای نوار dislike و دکمهها"
|
||||
},
|
||||
"customNumberFormats": {
|
||||
"message": "فرمتهای سفارشی اعداد"
|
||||
},
|
||||
"disableLoggingHover": {
|
||||
"message": "غیرفعال کردن ثبت پاسخهای API در کنسول."
|
||||
},
|
||||
"disableLoggingLabel": {
|
||||
"message": "غیرفعال کردن لاگ در کنسول"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "امکان مشاهده dislikeها را بازمیگرداند"
|
||||
},
|
||||
"extensionName": {
|
||||
"message": "Return YouTube Dislike"
|
||||
},
|
||||
"extensionNameBeta": {
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "تنظیمات"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "گزارش تغییرات"
|
||||
},
|
||||
"linkDiscord": {
|
||||
"message": "Discord"
|
||||
},
|
||||
"linkDonate": {
|
||||
"message": "کمک مالی"
|
||||
},
|
||||
"linkFAQ": {
|
||||
"message": "FAQ"
|
||||
},
|
||||
"linkGithub": {
|
||||
"message": "GitHub"
|
||||
},
|
||||
"linkHelp": {
|
||||
"message": "راهنما"
|
||||
},
|
||||
"linkWebsite": {
|
||||
"message": "وبسایت"
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "فرمت اعداد:"
|
||||
},
|
||||
"patreonBadgePrefix": {
|
||||
"message": "Patreon"
|
||||
},
|
||||
"patreonLoggedOutMessage": {
|
||||
"message": "ویژگیهای پریمیوم برای حامیان Patreon در دسترس است"
|
||||
},
|
||||
"patreonLogin": {
|
||||
"message": "ورود با Patreon"
|
||||
},
|
||||
"patreonPrivacyNote": {
|
||||
"message": "اطلاعات عضویت Patreon برای تأیید دسترسی پریمیوم استفاده میشود. ما جزئیات کارت یا حساب بانکی شما را دریافت نمیکنیم."
|
||||
},
|
||||
"githubLoggedOutMessage": {
|
||||
"message": "ویژگیهای پریمیوم برای مشارکتکنندگان GitHub در دسترس است"
|
||||
},
|
||||
"githubLogin": {
|
||||
"message": "ورود با GitHub (مشارکتکننده)"
|
||||
},
|
||||
"githubLoginStartFailed": {
|
||||
"message": "شروع ورود با GitHub ناموفق بود. لطفاً دوباره تلاش کنید."
|
||||
},
|
||||
"githubLoginCompleteFailed": {
|
||||
"message": "تکمیل ورود با GitHub ناموفق بود. لطفاً دوباره تلاش کنید."
|
||||
},
|
||||
"githubLoginUnavailable": {
|
||||
"message": "ورود مشارکتکنندگان GitHub در حال حاضر در دسترس نیست. این سرویس به یک بهروزرسانی یا تغییر پیکربندی نیاز دارد."
|
||||
},
|
||||
"githubLoginNotContributor": {
|
||||
"message": "این حساب GitHub به عنوان مشارکتکننده در Return YouTube Dislike ثبت نشده است. با حسابی که در پروژه مشارکت داشته وارد شوید. مشارکتهای اخیر ممکن است چند ساعت طول بکشد تا نمایش داده شوند."
|
||||
},
|
||||
"githubLoginBrowserUnavailable": {
|
||||
"message": "ورود با GitHub برای آدرس callback این مرورگر پیکربندی نشده است. لطفاً با پشتیبانی تماس بگیرید."
|
||||
},
|
||||
"githubLoginExpired": {
|
||||
"message": "مهلت این تلاش برای ورود با GitHub به پایان رسیده یا قابل تأیید نبود. لطفاً ورود جدیدی را آغاز کنید."
|
||||
},
|
||||
"githubLoginUpdateRequired": {
|
||||
"message": "لطفاً افزونه را بهروزرسانی کنید تا بتوانید از ورود مشارکتکنندگان GitHub استفاده نمایید."
|
||||
},
|
||||
"githubLoginRateLimited": {
|
||||
"message": "تعداد تلاشهای ورود بیش از حد مجاز است. لطفاً یک دقیقه صبر کرده و دوباره تلاش کنید."
|
||||
},
|
||||
"githubLoginDenied": {
|
||||
"message": "مجوز GitHub رد شد. ورود مشارکتکننده نیازمند تأیید مجوز است."
|
||||
},
|
||||
"patreonLoginCompleteFailed": {
|
||||
"message": "تکمیل ورود ناموفق بود. لطفاً دوباره تلاش کنید."
|
||||
},
|
||||
"patreonLoginStartFailed": {
|
||||
"message": "شروع ورود با Patreon ناموفق بود. لطفاً دوباره تلاش کنید."
|
||||
},
|
||||
"patreonLogout": {
|
||||
"message": "خروج"
|
||||
},
|
||||
"patreonPermissionRequired": {
|
||||
"message": "ورود به سیستم نیازمند مجوز 'identity' است. لطفاً برای ادامه اجازه دهید."
|
||||
},
|
||||
"patreonTierBasic": {
|
||||
"message": "سطح Basic"
|
||||
},
|
||||
"patreonTierChecking": {
|
||||
"message": "در حال بررسی وضعیت عضویت..."
|
||||
},
|
||||
"patreonTierNone": {
|
||||
"message": "بدون عضویت فعال"
|
||||
},
|
||||
"patreonTierPremium": {
|
||||
"message": "حامی پریمیوم"
|
||||
},
|
||||
"patreonTierSupporter": {
|
||||
"message": "حامی"
|
||||
},
|
||||
"patreonUserFallback": {
|
||||
"message": "کاربر Patreon"
|
||||
},
|
||||
"reformatLikes": {
|
||||
"message": "قالببندی مجدد اعداد like"
|
||||
},
|
||||
"reformatLikesHover": {
|
||||
"message": "یکسانسازی قالب اعداد like و dislike."
|
||||
},
|
||||
"hidePremiumTeaser": {
|
||||
"message": "مخفی کردن پنل پیشنمایش پریمیوم"
|
||||
},
|
||||
"hidePremiumTeaserHover": {
|
||||
"message": "عدم نمایش پیشنمایش پریمیوم در صفحات تماشای YouTube."
|
||||
},
|
||||
"roundNumbers": {
|
||||
"message": "نمایش اعداد گرد شده به پایین"
|
||||
},
|
||||
"roundNumbersHover": {
|
||||
"message": "گرد کردن اعداد به سمت پایین (رفتار پیشفرض YouTube)."
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "پشتیبانی از YouTube Shorts"
|
||||
},
|
||||
"showTooltipPercentage": {
|
||||
"message": "درصد در tooltip نوار like/dislike."
|
||||
},
|
||||
"showTooltipPercentageHover": {
|
||||
"message": "نمایش درصد در tooltip نوار like/dislike."
|
||||
},
|
||||
"textColorTheme": {
|
||||
"message": "تم رنگی:"
|
||||
},
|
||||
"textColorTheme1": {
|
||||
"message": "کلاسیک"
|
||||
},
|
||||
"textColorTheme2": {
|
||||
"message": "دسترسپذیر"
|
||||
},
|
||||
"textColorTheme3": {
|
||||
"message": "نئون"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "رنگی کردن نوار نسبت"
|
||||
},
|
||||
"textColorizeRatioBarHover": {
|
||||
"message": "استفاده از رنگهای سفارشی برای نوار نسبت."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "رنگی کردن شستها"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "استفاده از رنگهای سفارشی برای آیکونهای شست."
|
||||
},
|
||||
"textConsistentFormat": {
|
||||
"message": "یکسانسازی قالب اعداد like و dislike"
|
||||
},
|
||||
"textConsistentFormatHover": {
|
||||
"message": "قالببندی مجدد اعداد like."
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "توسط Dmitry Selivanov و جامعه کاربری"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "غیرفعالشده توسط مالک"
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "فرمت اعداد:"
|
||||
},
|
||||
"textRoundingNumbers": {
|
||||
"message": "گرد کردن آمار like/dislike به سمت پایین (رفتار پیشفرض YouTube)"
|
||||
},
|
||||
"textRoundingNumbersHover": {
|
||||
"message": "نمایش آمار گرد شده به سمت پایین."
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "غیرفعال کردن ارسال like/dislike"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "شمارش likeها و dislikeهای شما را متوقف میکند."
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "موقت غیرقابل دسترس"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "بهروزرسانی به"
|
||||
},
|
||||
"tooltipPercentageMode": {
|
||||
"message": "حالت درصد:"
|
||||
},
|
||||
"tooltipPercentageModeHover": {
|
||||
"message": "استفاده از نمایش سفارشی درصد هنگام نگهداشتن ماوس روی آن."
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "نسخه __RYD_VERSION__ نصب شد"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "چیزهای جدید"
|
||||
},
|
||||
"premiumAnalytics_title": {
|
||||
"message": "بینشهای ویدیویی پریمیوم"
|
||||
},
|
||||
"premiumAnalytics_activityTitle": {
|
||||
"message": "تعامل در طول زمان"
|
||||
},
|
||||
"premiumAnalytics_listsTitle": {
|
||||
"message": "کشورهای برتر"
|
||||
},
|
||||
"premiumAnalytics_listLikesTitle": {
|
||||
"message": "کشورهای دارای بیشترین Like"
|
||||
},
|
||||
"premiumAnalytics_listDislikesTitle": {
|
||||
"message": "کشورهای دارای بیشترین Dislike"
|
||||
},
|
||||
"premiumAnalytics_mapTitle": {
|
||||
"message": "جغرافیا"
|
||||
},
|
||||
"premiumAnalytics_expand": {
|
||||
"message": "گسترش"
|
||||
},
|
||||
"premiumAnalytics_collapse": {
|
||||
"message": "جمع کردن"
|
||||
},
|
||||
"premiumAnalytics_mapMetricLabel": {
|
||||
"message": "معیار نقشه"
|
||||
},
|
||||
"premiumAnalytics_mapReset": {
|
||||
"message": "بازگشت به نقشه جهان"
|
||||
},
|
||||
"premiumAnalytics_modeLikes": {
|
||||
"message": "Likeها"
|
||||
},
|
||||
"premiumAnalytics_modeDislikes": {
|
||||
"message": "Dislikeها"
|
||||
},
|
||||
"premiumAnalytics_modeRatio": {
|
||||
"message": "نسبت"
|
||||
},
|
||||
"premiumAnalytics_windowGroupLabel": {
|
||||
"message": "بازه دادهها"
|
||||
},
|
||||
"premiumAnalytics_windowLatest": {
|
||||
"message": "آخرین روزها"
|
||||
},
|
||||
"premiumAnalytics_windowFirst": {
|
||||
"message": "اولین روزها"
|
||||
},
|
||||
"premiumAnalytics_windowLatestTitle": {
|
||||
"message": "نمایش جدیدترین روزها در بازه انتخابی"
|
||||
},
|
||||
"premiumAnalytics_windowFirstTitle": {
|
||||
"message": "نمایش ابتداییترین روزها در بازه انتخابی"
|
||||
},
|
||||
"premiumAnalytics_windowSummaryCustom": {
|
||||
"message": "انتخاب سفارشی"
|
||||
},
|
||||
"premiumAnalytics_windowSummaryAllTime": {
|
||||
"message": "تمام زمانها"
|
||||
},
|
||||
"premiumAnalytics_windowSummaryLast": {
|
||||
"message": "$1 گذشته"
|
||||
},
|
||||
"premiumAnalytics_windowSummaryFirst": {
|
||||
"message": "$1 نخست"
|
||||
},
|
||||
"premiumAnalytics_daysSingular": {
|
||||
"message": "$1 روز"
|
||||
},
|
||||
"premiumAnalytics_daysPlural": {
|
||||
"message": "$1 روز"
|
||||
},
|
||||
"premiumAnalytics_rangeLabelAllTime": {
|
||||
"message": "تمام زمانها"
|
||||
},
|
||||
"premiumAnalytics_rangeLabelDays": {
|
||||
"message": "$1 روز"
|
||||
},
|
||||
"premiumAnalytics_selectedPeriod": {
|
||||
"message": "دوره انتخابی: $1"
|
||||
},
|
||||
"premiumAnalytics_totalsHeading": {
|
||||
"message": "کاربران افزونه"
|
||||
},
|
||||
"premiumAnalytics_totalsLikes": {
|
||||
"message": "$1 لایک"
|
||||
},
|
||||
"premiumAnalytics_totalsDislikes": {
|
||||
"message": "$1 دیسلایک"
|
||||
},
|
||||
"premiumAnalytics_summaryMeta": {
|
||||
"message": "ثبت $1 تعامل از $2 کشور ($3 IP یکتا)"
|
||||
},
|
||||
"premiumAnalytics_bucketHour": {
|
||||
"message": "آرا در ساعت"
|
||||
},
|
||||
"premiumAnalytics_bucketDay": {
|
||||
"message": "آرا در روز"
|
||||
},
|
||||
"premiumAnalytics_bucketWeek": {
|
||||
"message": "آرا در هفته"
|
||||
},
|
||||
"premiumAnalytics_bucketHours": {
|
||||
"message": "آرا در هر $1 ساعت"
|
||||
},
|
||||
"premiumAnalytics_bucketDays": {
|
||||
"message": "آرا در هر $1 روز"
|
||||
},
|
||||
"premiumAnalytics_bucketMinutes": {
|
||||
"message": "آرا در هر $1 دقیقه"
|
||||
},
|
||||
"premiumAnalytics_bucketMinute": {
|
||||
"message": "آرا در دقیقه"
|
||||
},
|
||||
"premiumAnalytics_bucketSeconds": {
|
||||
"message": "آرا در هر $1 ثانیه"
|
||||
},
|
||||
"premiumAnalytics_bucketSecond": {
|
||||
"message": "آرا در ثانیه"
|
||||
},
|
||||
"premiumAnalytics_noData": {
|
||||
"message": "هنوز دادهای وجود ندارد"
|
||||
},
|
||||
"premiumAnalytics_unknownRegion": {
|
||||
"message": "ناشناخته"
|
||||
},
|
||||
"premiumAnalytics_loading": {
|
||||
"message": "در حال بارگذاری تحلیلها…"
|
||||
},
|
||||
"premiumAnalytics_errorReauth": {
|
||||
"message": "لطفاً برای باز کردن قفل تحلیلها، مجدداً در Patreon احراز هویت کنید."
|
||||
},
|
||||
"premiumAnalytics_errorInactive": {
|
||||
"message": "تحلیلهای پریمیوم برای حامیان فعال Patreon در دسترس است."
|
||||
},
|
||||
"premiumAnalytics_errorSession": {
|
||||
"message": "سشن منقضی شد. دوباره با Patreon وارد شوید."
|
||||
},
|
||||
"premiumAnalytics_errorBackend": {
|
||||
"message": "بکاند تحلیلها در حال حاضر در دسترس نیست."
|
||||
},
|
||||
"premiumAnalytics_errorNetwork": {
|
||||
"message": "امکان اتصال به سرویس تحلیلها وجود ندارد."
|
||||
},
|
||||
"premiumAnalytics_errorGeneric": {
|
||||
"message": "امکان بارگذاری تحلیلهای پریمیوم وجود ندارد."
|
||||
},
|
||||
"premiumAnalytics_mapSeriesLabel": {
|
||||
"message": "فعالیت"
|
||||
},
|
||||
"premiumAnalytics_likeRatio": {
|
||||
"message": "نسبت Like"
|
||||
},
|
||||
"premiumAnalytics_visualHighRatio": {
|
||||
"message": "نسبت Like بالاتر"
|
||||
},
|
||||
"premiumAnalytics_visualLowRatio": {
|
||||
"message": "نسبت Like پایینتر"
|
||||
},
|
||||
"premiumAnalytics_visualHighLikes": {
|
||||
"message": "Likeهای بیشتر"
|
||||
},
|
||||
"premiumAnalytics_visualLowLikes": {
|
||||
"message": "Likeهای کمتر"
|
||||
},
|
||||
"premiumAnalytics_visualHighDislikes": {
|
||||
"message": "Dislikeهای بیشتر"
|
||||
},
|
||||
"premiumAnalytics_visualLowDislikes": {
|
||||
"message": "Dislikeهای کمتر"
|
||||
},
|
||||
"premiumAnalytics_visualHighGeneric": {
|
||||
"message": "$1 بیشتر"
|
||||
},
|
||||
"premiumAnalytics_visualLowGeneric": {
|
||||
"message": "$1 کمتر"
|
||||
},
|
||||
"premiumAnalytics_tooltipLikes": {
|
||||
"message": "تعداد Likeها: $1"
|
||||
},
|
||||
"premiumAnalytics_tooltipDislikes": {
|
||||
"message": "تعداد Dislikeها: $1"
|
||||
},
|
||||
"premiumAnalytics_tooltipRatio": {
|
||||
"message": "نسبت Likeها: $1"
|
||||
},
|
||||
"premiumTeaser_title": {
|
||||
"message": "تحلیل ویدیو"
|
||||
},
|
||||
"premiumTeaser_subtitle": {
|
||||
"message": "دیسلایکهای خام، گزارشهای مستقیمی از کاربران این افزونه هستند که این ویدیو را تماشا میکنند."
|
||||
},
|
||||
"premiumTeaser_cta": {
|
||||
"message": "باز کردن پریمیوم"
|
||||
},
|
||||
"premiumTeaser_learn": {
|
||||
"message": "پیشنمایش تحلیلهای کامل"
|
||||
},
|
||||
"premiumTeaser_statRaw": {
|
||||
"message": "تعداد دیسلایک خام"
|
||||
},
|
||||
"premiumTeaser_statDislikes": {
|
||||
"message": "دیسلایکهای تخمینی"
|
||||
},
|
||||
"premiumTeaser_statLikes": {
|
||||
"message": "تعداد لایک خام"
|
||||
},
|
||||
"premiumTeaser_statusLoading": {
|
||||
"message": "در حال دریافت آخرین مجموع دیسلایکها…"
|
||||
},
|
||||
"premiumTeaser_statusError": {
|
||||
"message": "در حال حاضر نتوانستیم دادههای دیسلایک را بارگذاری کنیم. صفحه را دوباره بارگذاری کنید."
|
||||
},
|
||||
"premiumTeaser_breadcrumbsAria": {
|
||||
"message": "نحوه باز کردن قفل تحلیلهای پریمیوم"
|
||||
},
|
||||
"premiumTeaser_breadcrumbsTitle": {
|
||||
"message": "بینشهای ویدیویی پریمیوم را در سه مرحله سریع فعال کنید:"
|
||||
},
|
||||
"premiumTeaser_breadcrumbStep1": {
|
||||
"message": "از پنجره بازشوی افزونه Return YouTube Dislike با Patreon وارد شوید."
|
||||
},
|
||||
"premiumTeaser_breadcrumbStep2": {
|
||||
"message": "سطح Premium را انتخاب کنید تا جدول زمانی فعالیت، ردهبندی کشورها و نقشه تعاملی فعال شوند."
|
||||
},
|
||||
"premiumTeaser_breadcrumbStep3": {
|
||||
"message": "صفحه YouTube را دوباره بارگذاری کنید تا روندهای ساعتی، کشورهای برتر و تفکیک ایالتهای آمریکا را برای هر ویدیو مشاهده کنید."
|
||||
},
|
||||
"premiumTierNotice_title": {
|
||||
"message": "تحلیلهای پریمیوم قفل است"
|
||||
},
|
||||
"premiumTierNotice_message": {
|
||||
"message": "عضویت Patreon شما شامل سطح Premium نیست. برای باز کردن قفل تحلیلهای پیشرفته ویدیو، حمایت مالی خود را ارتقا دهید."
|
||||
},
|
||||
"premiumTierNotice_cta": {
|
||||
"message": "ارتقا در Patreon"
|
||||
},
|
||||
"changelog_title": {
|
||||
"message": "گزارش تغییرات تحلیلهای پریمیوم · ۲۰ اکتبر ۲۰۲۵"
|
||||
},
|
||||
"changelog_badge": {
|
||||
"message": "انتشار پریمیوم"
|
||||
},
|
||||
"changelog_heading": {
|
||||
"message": "تحلیلهای پریمیوم، با طراحی نو"
|
||||
},
|
||||
"changelog_subheading": {
|
||||
"message": "خط زمانی فعالیت زنده، ردهبندی کشورهای برتر و نقشه تعاملی گنجاندهشده در Return YouTube Dislike Premium را کاوش کنید."
|
||||
},
|
||||
"changelog_releaseDate": {
|
||||
"message": "منتشر شده در ۲۰ اکتبر ۲۰۲۵"
|
||||
},
|
||||
"changelog_cta_primary": {
|
||||
"message": "ارتقا در Patreon"
|
||||
},
|
||||
"changelog_cta_secondary": {
|
||||
"message": "خواندن راهنمای راهاندازی"
|
||||
},
|
||||
"changelog_section_highlights": {
|
||||
"message": "چیزهای جدید"
|
||||
},
|
||||
"changelog_feature_timeline_title": {
|
||||
"message": "خط زمانی فعالیت زنده"
|
||||
},
|
||||
"changelog_feature_timeline_body": {
|
||||
"message": "جریان likeها و dislikeها را به صورت زنده تماشا کنید. بدون بارگذاری مجدد، پیشتنظیمهای ساعتی، روزانه یا تمام زمانها را تغییر دهید، پنجره را به روز اول یا آخرین آرا متصل کنید و هر جهش را بررسی کنید تا ببینید چه چیزی تعامل را برانگیخته است."
|
||||
},
|
||||
"changelog_feature_map_title": {
|
||||
"message": "نقشه حرارتی تعاملی جهان و ایالات متحده"
|
||||
},
|
||||
"changelog_feature_map_body": {
|
||||
"message": "در سراسر جهان حرکت کنید یا به ایالتهای آمریکا بروید تا نقاط پرتعامل را ببینید. Likeها، dislikeها و نسبتها را در tooltip ارتقایافته مقایسه کنید و مناطقی را که زودتر از همه به آپلودهای شما واکنش نشان میدهند برجسته نمایید."
|
||||
},
|
||||
"changelog_feature_quality_title": {
|
||||
"message": "ردهبندی کشورهای برتر"
|
||||
},
|
||||
"changelog_feature_quality_body": {
|
||||
"message": "هر کشور را بر اساس فعالیت خام، likeها، dislikeها یا نسبت رتبهبندی کنید. با همان پیشتنظیمهای خط زمانی فیلتر کنید تا متوجه شوید کمپینها در کجا موفق بودهاند و برای انتشار بعدی برنامهریزی کنید."
|
||||
},
|
||||
"changelog_screenshot_placeholder": {
|
||||
"message": "تصویر بهزودی ارائه میشود—در زمان آماده بودن، این نما را در DevTools ضبط کنید."
|
||||
},
|
||||
"changelog_screenshot_label_timeline": {
|
||||
"message": "محل جایگذاری: نمای کلی خط زمانی"
|
||||
},
|
||||
"changelog_screenshot_label_map": {
|
||||
"message": "محل جایگذاری: نقشه فعالیت جهانی"
|
||||
},
|
||||
"changelog_screenshot_label_teaser": {
|
||||
"message": "محل جایگذاری: ردهبندی کشورها"
|
||||
},
|
||||
"changelog_section_upgrade": {
|
||||
"message": "نحوه باز کردن قفل تحلیلهای پریمیوم"
|
||||
},
|
||||
"changelog_upgrade_body": {
|
||||
"message": "آمادهاید؟ این مراحل سریع را دنبال کنید و برگه YouTube خود را تازهسازی نمایید."
|
||||
},
|
||||
"changelog_upgrade_step1": {
|
||||
"message": "پنجره بازشوی Return YouTube Dislike را باز کرده و با Patreon وارد شوید."
|
||||
},
|
||||
"changelog_upgrade_step2": {
|
||||
"message": "سطح Premium را انتخاب کنید تا جریان دادههای تحلیلی برای حساب شما فعال شود."
|
||||
},
|
||||
"changelog_upgrade_step3": {
|
||||
"message": "هر صفحه تماشای YouTube را مجدداً بارگذاری کنید—خط زمانی، نقشه و ردهبندیها بلافاصله نمایش داده میشوند."
|
||||
},
|
||||
"changelog_section_release": {
|
||||
"message": "نکات برجسته انتشار"
|
||||
},
|
||||
"changelog_release_item1": {
|
||||
"message": "پیشتنظیمهای خط زمانی فعالیت، دادههای زنده را با لنگرهای بازه برای اولین و آخرین دستهها پخش میکنند."
|
||||
},
|
||||
"changelog_release_item2": {
|
||||
"message": "جدول ردهبندی کشورها بلافاصله بهروزرسانی میشود تا بتوانید مناطق رو به رشد را بدون ترک پنل مشاهده کنید."
|
||||
},
|
||||
"changelog_release_item3": {
|
||||
"message": "نقشه تعاملی، نقاط پرتعامل جهانی و ایالتهای آمریکا را با tooltipها و معیارهای شفافتر برجسته میکند."
|
||||
},
|
||||
"changelog_support_heading": {
|
||||
"message": "به کمک نیاز دارید؟"
|
||||
},
|
||||
"changelog_support_description": {
|
||||
"message": "اگر به مشکلی برخوردید ما در کنارتان هستیم—سوالات خود را در اسناد پشتیبانی یا جامعه کاربری مطرح کنید."
|
||||
},
|
||||
"changelog_support_contact": {
|
||||
"message": "پرسش از جامعه کاربری"
|
||||
},
|
||||
"hideClutterButtons": {
|
||||
"message": "مخفی کردن دکمههای اضافه"
|
||||
},
|
||||
"hideClutterButtonsHelpLabel": {
|
||||
"message": "نمایش نمونههای قبل و بعد"
|
||||
},
|
||||
"hideClutterButtonsDescription": {
|
||||
"message": "فقط دکمههای Like و Dislike را قابل مشاهده نگه دارید. دکمههای Share، Save، Thanks و سایر اقدامات اختیاری در منوی سهنقطه More در YouTube در دسترس میمانند."
|
||||
},
|
||||
"hideClutterButtonsBefore": {
|
||||
"message": "قبل: همه دکمههای عملیات قابل مشاهده هستند"
|
||||
},
|
||||
"hideClutterButtonsAfter": {
|
||||
"message": "بعد: فقط Like و Dislike قابل مشاهده میمانند"
|
||||
},
|
||||
"discussion_title": {
|
||||
"message": "نظرات RYD"
|
||||
},
|
||||
"discussion_subtitle": {
|
||||
"message": "بحث و گفتگوی جامعه کاربری به میزبانی Return YouTube Dislike."
|
||||
},
|
||||
"discussion_independent": {
|
||||
"message": "این نظرات جدا از YouTube هستند."
|
||||
},
|
||||
"discussion_open": {
|
||||
"message": "باز کردن نظرات RYD"
|
||||
},
|
||||
"discussion_close": {
|
||||
"message": "بستن"
|
||||
},
|
||||
"discussion_new": {
|
||||
"message": "جدیدترین"
|
||||
},
|
||||
"discussion_top": {
|
||||
"message": "برترین"
|
||||
},
|
||||
"discussion_sort": {
|
||||
"message": "مرتبسازی نظرات"
|
||||
},
|
||||
"discussion_refresh": {
|
||||
"message": "تازهسازی"
|
||||
},
|
||||
"discussion_loading": {
|
||||
"message": "در حال بارگذاری نظرات…"
|
||||
},
|
||||
"discussion_empty": {
|
||||
"message": "هنوز نظری ثبت نشده است. گفتگو را آغاز کنید."
|
||||
},
|
||||
"discussion_replyEmpty": {
|
||||
"message": "هنوز پاسخی وجود ندارد."
|
||||
},
|
||||
"discussion_comment": {
|
||||
"message": "نظر"
|
||||
},
|
||||
"discussion_post": {
|
||||
"message": "ارسال نظر"
|
||||
},
|
||||
"discussion_reply": {
|
||||
"message": "پاسخ"
|
||||
},
|
||||
"discussion_postReply": {
|
||||
"message": "ارسال پاسخ"
|
||||
},
|
||||
"discussion_cancel": {
|
||||
"message": "انصراف"
|
||||
},
|
||||
"discussion_save": {
|
||||
"message": "ذخیره"
|
||||
},
|
||||
"discussion_edit": {
|
||||
"message": "ویرایش"
|
||||
},
|
||||
"discussion_delete": {
|
||||
"message": "حذف"
|
||||
},
|
||||
"discussion_deleteConfirm": {
|
||||
"message": "این نظر حذف شود؟"
|
||||
},
|
||||
"discussion_deleted": {
|
||||
"message": "نظر حذف شد"
|
||||
},
|
||||
"discussion_edited": {
|
||||
"message": "ویرایششده"
|
||||
},
|
||||
"discussion_replies": {
|
||||
"message": "پاسخها ($1)"
|
||||
},
|
||||
"discussion_more": {
|
||||
"message": "بارگذاری بیشتر"
|
||||
},
|
||||
"discussion_like": {
|
||||
"message": "Like"
|
||||
},
|
||||
"discussion_dislike": {
|
||||
"message": "Dislike"
|
||||
},
|
||||
"discussion_reacting": {
|
||||
"message": "در حال ذخیره واکنش…"
|
||||
},
|
||||
"discussion_signInRequired": {
|
||||
"message": "برای ادامه، از پنجره بازشوی افزونه وارد شوید."
|
||||
},
|
||||
"discussion_tierRequired": {
|
||||
"message": "ارسال نظر برای اعضای فعال Commenter و بالاتر در دسترس است."
|
||||
},
|
||||
"discussion_join": {
|
||||
"message": "عضویت به عنوان Commenter"
|
||||
},
|
||||
"discussion_gate": {
|
||||
"message": "همه میتوانند بخوانند و واکنش نشان دهند. اعضای فعال Commenter و بالاتر میتوانند نظر ارسال کنند."
|
||||
},
|
||||
"discussion_nicknameRequired": {
|
||||
"message": "قبل از ارسال نظر، نام مستعار عمومی RYD خود را انتخاب کنید."
|
||||
},
|
||||
"discussion_nicknameLabel": {
|
||||
"message": "نام مستعار عمومی RYD"
|
||||
},
|
||||
"discussion_nicknameHint": {
|
||||
"message": "۳ تا ۳۲ حرف، عدد، فاصله، نقطه، خط تیره یا زیرخط. این نام همراه با نظرات شما نمایش داده خواهد شد."
|
||||
},
|
||||
"discussion_nicknameSave": {
|
||||
"message": "ذخیره نام مستعار"
|
||||
},
|
||||
"discussion_nicknameTaken": {
|
||||
"message": "این نام مستعار قبلاً گرفته شده است. نام دیگری انتخاب کنید."
|
||||
},
|
||||
"discussion_nicknameInvalid": {
|
||||
"message": "از ۳ تا ۳۲ حرف، عدد، فاصله، نقطه، خط تیره یا زیرخط استفاده کنید."
|
||||
},
|
||||
"discussion_nicknameChange": {
|
||||
"message": "تغییر نام مستعار"
|
||||
},
|
||||
"discussion_as": {
|
||||
"message": "نظر دادن به عنوان $1"
|
||||
},
|
||||
"discussion_placeholder": {
|
||||
"message": "به گفتگو اضافه کنید…"
|
||||
},
|
||||
"discussion_characters": {
|
||||
"message": "$1 / $2"
|
||||
},
|
||||
"discussion_report": {
|
||||
"message": "گزارش"
|
||||
},
|
||||
"discussion_reportTitle": {
|
||||
"message": "گزارش نظر"
|
||||
},
|
||||
"discussion_reportReason": {
|
||||
"message": "دلیل"
|
||||
},
|
||||
"discussion_reportSpam": {
|
||||
"message": "هرزنامه"
|
||||
},
|
||||
"discussion_reportAbuse": {
|
||||
"message": "آزار و اذیت یا سخنان نفرتپراکن"
|
||||
},
|
||||
"discussion_reportOther": {
|
||||
"message": "سایر"
|
||||
},
|
||||
"discussion_reportDetails": {
|
||||
"message": "جزئیات تکمیلی (اختیاری)"
|
||||
},
|
||||
"discussion_reportSend": {
|
||||
"message": "ارسال گزارش"
|
||||
},
|
||||
"discussion_reportDone": {
|
||||
"message": "گزارش دریافت شد. با تشکر."
|
||||
},
|
||||
"discussion_moderation": {
|
||||
"message": "مدیریت و نظارت"
|
||||
},
|
||||
"discussion_queueEmpty": {
|
||||
"message": "هیچ گزارشی برای بررسی وجود ندارد."
|
||||
},
|
||||
"discussion_hide": {
|
||||
"message": "مخفی کردن نظر"
|
||||
},
|
||||
"discussion_restore": {
|
||||
"message": "بازیابی نظر"
|
||||
},
|
||||
"discussion_dismiss": {
|
||||
"message": "رد کردن گزارشها"
|
||||
},
|
||||
"discussion_ban": {
|
||||
"message": "مسدود کردن نویسنده"
|
||||
},
|
||||
"discussion_unban": {
|
||||
"message": "رفع مسدودیت نویسنده"
|
||||
},
|
||||
"discussion_moderationReason": {
|
||||
"message": "دلیل اقدام مدیریتی"
|
||||
},
|
||||
"discussion_moderationSaved": {
|
||||
"message": "اقدام مدیریتی ذخیره شد."
|
||||
},
|
||||
"discussion_reported": {
|
||||
"message": "$1 گزارش"
|
||||
},
|
||||
"discussion_unavailable": {
|
||||
"message": "نظرات RYD برای این ویدیو در دسترس نیست."
|
||||
},
|
||||
"discussion_commentUnavailable": {
|
||||
"message": "این نظر دیگر در دسترس نیست."
|
||||
},
|
||||
"discussion_error": {
|
||||
"message": "امکان اتصال وجود ندارد. لطفاً دوباره تلاش کنید."
|
||||
},
|
||||
"discussion_rateLimited": {
|
||||
"message": "لطفاً لحظهای صبر کرده و دوباره تلاش کنید."
|
||||
},
|
||||
"discussion_conflict": {
|
||||
"message": "این نظر تغییر کرده است. صفحه را تازهسازی کرده و دوباره امتحان کنید."
|
||||
},
|
||||
"discussion_forbidden": {
|
||||
"message": "این عملیات برای حساب کاربری شما در دسترس نیست."
|
||||
},
|
||||
"discussion_retry": {
|
||||
"message": "تلاش مجدد"
|
||||
},
|
||||
"discussion_notifications": {
|
||||
"message": "اعلانها"
|
||||
},
|
||||
"discussion_notificationEmpty": {
|
||||
"message": "همه چیز بهروز است."
|
||||
},
|
||||
"discussion_notificationReply": {
|
||||
"message": "$1 به نظر شما پاسخ داد"
|
||||
},
|
||||
"discussion_notificationLike": {
|
||||
"message": "یک نفر نظر شما را like کرد"
|
||||
},
|
||||
"discussion_notificationLikes": {
|
||||
"message": "نظر شما $1 like دریافت کرد"
|
||||
},
|
||||
"discussion_notificationDislike": {
|
||||
"message": "یک نفر نظر شما را dislike کرد"
|
||||
},
|
||||
"discussion_notificationReaction": {
|
||||
"message": "یک نفر به نظر شما واکنش نشان داد"
|
||||
},
|
||||
"discussion_someone": {
|
||||
"message": "یک نفر"
|
||||
},
|
||||
"discussion_markRead": {
|
||||
"message": "علامتگذاری به عنوان خواندهشده"
|
||||
},
|
||||
"discussion_markAllRead": {
|
||||
"message": "علامتگذاری همه به عنوان خواندهشده"
|
||||
},
|
||||
"discussion_view": {
|
||||
"message": "مشاهده گفتگو"
|
||||
},
|
||||
"discussion_unread": {
|
||||
"message": "$1 اعلان خواندهنشده"
|
||||
},
|
||||
"discussion_signedOutInbox": {
|
||||
"message": "برای دیدن پاسخها و واکنشها به نظرات خود وارد شوید."
|
||||
},
|
||||
"discussion_notificationUnavailable": {
|
||||
"message": "این گفتگو دیگر در دسترس نیست."
|
||||
},
|
||||
"discussion_discussionTab": {
|
||||
"message": "گفتگو"
|
||||
},
|
||||
"discussion_nickname": {
|
||||
"message": "نام مستعار"
|
||||
},
|
||||
"discussion_reportCount": {
|
||||
"message": "گزارشها"
|
||||
},
|
||||
"discussion_reportStatus": {
|
||||
"message": "وضعیت گزارش"
|
||||
},
|
||||
"discussion_openReports": {
|
||||
"message": "گزارشهای باز"
|
||||
},
|
||||
"discussion_resolvedReports": {
|
||||
"message": "گزارشهای رد شده"
|
||||
},
|
||||
"discussion_author": {
|
||||
"message": "نویسنده"
|
||||
},
|
||||
"discussion_me": {
|
||||
"message": "شما"
|
||||
},
|
||||
"discussion_saving": {
|
||||
"message": "در حال ذخیره…"
|
||||
},
|
||||
"discussion_confirm": {
|
||||
"message": "تأیید"
|
||||
},
|
||||
"discussion_notificationUpdated": {
|
||||
"message": "فعالیت جدید روی نظرات شما"
|
||||
},
|
||||
"discussion_showThread": {
|
||||
"message": "نمایش رشته پیام"
|
||||
},
|
||||
"discussion_loadReplies": {
|
||||
"message": "نمایش پاسخها ($1)"
|
||||
},
|
||||
"patreonTierCommenter": {
|
||||
"message": "Commenter"
|
||||
},
|
||||
"changelog_brand_logo_alt": {
|
||||
"message": "لوگوی Return YouTube Dislike"
|
||||
},
|
||||
"changelog_page_title": {
|
||||
"message": "به Return YouTube Dislike خوش آمدید"
|
||||
},
|
||||
"changelog_hero_eyebrow": {
|
||||
"message": "همهچیز آماده است"
|
||||
},
|
||||
"changelog_hero_title": {
|
||||
"message": "Dislikeها برگشتند."
|
||||
},
|
||||
"changelog_hero_body": {
|
||||
"message": "هر ویدیویی را در YouTube باز کنید تا تعداد dislikeها را درست کنار likeها، همانجایی که باید باشد، ببینید. نسخهٔ ۴.۱ همچنین نظرات RYD را معرفی میکند؛ فضایی برای گفتگو دربارهٔ ویدیوها خارج از بخش نظرات خود YouTube."
|
||||
},
|
||||
"changelog_new_badge": {
|
||||
"message": "تازههای نسخهٔ ۴.۱"
|
||||
},
|
||||
"changelog_premium_badge": {
|
||||
"message": "پریمیوم"
|
||||
},
|
||||
"changelog_comments_title": {
|
||||
"message": "با نظرات RYD آشنا شوید"
|
||||
},
|
||||
"changelog_comments_body": {
|
||||
"message": "گفتگویی میان کاربران زیر ویدیوها و Shorts، به میزبانی Return YouTube Dislike و جدا از نظرات YouTube. همه میتوانند بخوانند و واکنش نشان دهند. اعضای Commenter و Premium میتوانند نظر و پاسخ ارسال کنند."
|
||||
},
|
||||
"changelog_comments_point_replies": {
|
||||
"message": "پاسخهای رشتهای با like و dislike"
|
||||
},
|
||||
"changelog_comments_point_nickname": {
|
||||
"message": "ارسال نظر با نام مستعار عمومی به انتخاب شما"
|
||||
},
|
||||
"changelog_comments_point_notifications": {
|
||||
"message": "دریافت اعلان وقتی کسی پاسخ میدهد یا واکنش نشان میدهد"
|
||||
},
|
||||
"changelog_comments_point_moderation": {
|
||||
"message": "گزارش و نظارت برای حفظ احترام در گفتگوها"
|
||||
},
|
||||
"changelog_comments_shot_alt": {
|
||||
"message": "پنل نظرات RYD با یک گفتگوی رشتهای زیر ویدیو"
|
||||
},
|
||||
"changelog_notifications_shot_alt": {
|
||||
"message": "اعلانهای RYD با فهرست پاسخها و likeهای نظرات شما"
|
||||
},
|
||||
"changelog_sample_note": {
|
||||
"message": "تصاویر صفحه دادههای نمونه را نشان میدهند."
|
||||
},
|
||||
"changelog_analytics_title": {
|
||||
"message": "تحلیلهای پریمیوم"
|
||||
},
|
||||
"changelog_analytics_body": {
|
||||
"message": "ببینید یک ویدیو در گذر زمان و در سراسر جهان چگونه بازخورد میگیرد. بازهٔ ۷، ۳۰ یا ۹۰ روزه یا تمام زمانها را انتخاب کنید و likeها، dislikeها و نسبت آنها را مقایسه کنید."
|
||||
},
|
||||
"changelog_analytics_timeline_title": {
|
||||
"message": "خط زمانی فعالیت"
|
||||
},
|
||||
"changelog_analytics_timeline_body": {
|
||||
"message": "Likeها و dislikeها در گذر زمان، با جزئیات ساعتی."
|
||||
},
|
||||
"changelog_analytics_countries_title": {
|
||||
"message": "کشورهای برتر"
|
||||
},
|
||||
"changelog_analytics_countries_body": {
|
||||
"message": "ببینید کدام کشورها یک ویدیو را بیشتر like یا dislike میکنند."
|
||||
},
|
||||
"changelog_analytics_world_title": {
|
||||
"message": "نقشهٔ جهان"
|
||||
},
|
||||
"changelog_analytics_world_body": {
|
||||
"message": "تعامل کاربران را در کشورهای مختلف مقایسه کنید."
|
||||
},
|
||||
"changelog_analytics_us_title": {
|
||||
"message": "ایالتهای آمریکا"
|
||||
},
|
||||
"changelog_analytics_us_body": {
|
||||
"message": "برای بررسی تعامل کاربران در هر ایالت، بزرگنمایی کنید."
|
||||
},
|
||||
"changelog_join_title": {
|
||||
"message": "دریافت ویژگیهای پریمیوم"
|
||||
},
|
||||
"changelog_join_free": {
|
||||
"message": "تعداد dislikeها برای همه رایگان است. عضویت اختیاری است و به حمایت از پروژه کمک میکند."
|
||||
},
|
||||
"changelog_join_step1": {
|
||||
"message": "در Patreon عضو شوید. سطح Commenter به شما امکان ارسال نظر میدهد؛ Premium تحلیلها را نیز اضافه میکند."
|
||||
},
|
||||
"changelog_join_step3": {
|
||||
"message": "هر ویدیویی را در YouTube دوباره بارگذاری کنید. ویژگیهای جدید شما بهطور خودکار ظاهر میشوند."
|
||||
},
|
||||
"changelog_also_title": {
|
||||
"message": "همچنین در این نسخه"
|
||||
},
|
||||
"changelog_also_counts": {
|
||||
"message": "نمایش قابلاعتمادتر تعداد likeها و dislikeها در افزونه و اسکریپت کاربر."
|
||||
},
|
||||
"changelog_also_consent": {
|
||||
"message": "بهبود روند رضایتدهی دربارهٔ دادهها در Firefox."
|
||||
},
|
||||
"changelog_also_translations": {
|
||||
"message": "ترجمههای جدید و بهبودیافته."
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"apiStatusLabel": {
|
||||
"message": "API durumu:"
|
||||
"message": "API Durumu:"
|
||||
},
|
||||
"apiStatusOffline": {
|
||||
"message": "Çevrimdışı"
|
||||
@@ -12,46 +12,46 @@
|
||||
"message": "Renk teması:"
|
||||
},
|
||||
"colorizeRatio": {
|
||||
"message": "Beğeni oranı çubuğunu renklendir"
|
||||
"message": "Oran çubuğunu renklendir"
|
||||
},
|
||||
"colorizeRatioHover": {
|
||||
"message": "Beğeni oranı çubuğu için özel renkler kullanın."
|
||||
"message": "Oran çubuğu için özel renkler kullanın."
|
||||
},
|
||||
"colorizeThumbs": {
|
||||
"message": "Butonları renklendir"
|
||||
"message": "Başparmak simgelerini renklendir"
|
||||
},
|
||||
"colorizeThumbsHover": {
|
||||
"message": "Buton simgeleri için özel renkler kullan."
|
||||
"message": "Başparmak simgeleri için özel renkler kullanın."
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Uzantının var olmasını sağlayan tek şey bağışlarınızdır, lütfen projeyi desteklemeyi düşünün."
|
||||
"message": "Uzantının çalışmaya devam etmesini sağlayan tek şey bağışlarınızdır. Projeyi desteklemeyi lütfen değerlendirin."
|
||||
},
|
||||
"customColors": {
|
||||
"message": "Dislike çubuğu ve düğmeler için özel renkler"
|
||||
"message": "Beğenmeme çubuğu ve düğmeleri için özel renkler"
|
||||
},
|
||||
"customNumberFormats": {
|
||||
"message": "Özel sayı biçimleri"
|
||||
},
|
||||
"disableLoggingHover": {
|
||||
"message": "Konsolda API yanıtlarının günlüğe kaydını kapatır."
|
||||
"message": "API yanıtlarının konsola kaydedilmesini devre dışı bırakın."
|
||||
},
|
||||
"disableLoggingLabel": {
|
||||
"message": "Konsola günlüklemeyi kapat"
|
||||
"message": "Konsola günlük kaydını devre dışı bırak"
|
||||
},
|
||||
"extensionDesc": {
|
||||
"message": "Dislike'ları görebilme yeteneği verir"
|
||||
"message": "Beğenmeme sayılarını görmenizi sağlar"
|
||||
},
|
||||
"extensionName": {
|
||||
"message": "YouTube Dislike Sayısını Geri Getir"
|
||||
"message": "Return YouTube Dislike"
|
||||
},
|
||||
"extensionNameBeta": {
|
||||
"message": "YouTube Dislike Sayısını Geri Getir Beta"
|
||||
"message": "Return YouTube Dislike Beta"
|
||||
},
|
||||
"legendSettings": {
|
||||
"message": "Ayarlar"
|
||||
},
|
||||
"linkChangelog": {
|
||||
"message": "Değişim Günlüğü"
|
||||
"message": "Değişiklik Günlüğü"
|
||||
},
|
||||
"linkDiscord": {
|
||||
"message": "Discord"
|
||||
@@ -69,55 +69,76 @@
|
||||
"message": "Yardım"
|
||||
},
|
||||
"linkWebsite": {
|
||||
"message": "Site"
|
||||
"message": "Web Sitesi"
|
||||
},
|
||||
"numberFormat": {
|
||||
"message": "Sayı tarzı:"
|
||||
"message": "Sayı biçimi:"
|
||||
},
|
||||
"patreonBadgePrefix": {
|
||||
"message": "Patreon"
|
||||
},
|
||||
"patreonLoggedOutMessage": {
|
||||
"message": "Premium özellikler Patreon destekçileri için kullanılabilir"
|
||||
"message": "Patreon destekçileri için Premium özellikler kullanılabilir"
|
||||
},
|
||||
"patreonLogin": {
|
||||
"message": "Patreon ile giriş yap"
|
||||
},
|
||||
"patreonPrivacyNote": {
|
||||
"message": "Patreon üyelik bilgileri, premium erişimi doğrulamak için kullanılır. Kart veya banka bilgilerinizi almayız."
|
||||
"message": "Premium erişimi doğrulamak için Patreon üyelik bilgileri kullanılır. Kart veya banka bilgileriniz bize iletilmez."
|
||||
},
|
||||
"githubLoggedOutMessage": {
|
||||
"message": "Premium features available for GitHub contributors"
|
||||
"message": "GitHub katkıda bulunanları için Premium özellikler kullanılabilir"
|
||||
},
|
||||
"githubLogin": {
|
||||
"message": "Login with GitHub (Contributor)"
|
||||
"message": "GitHub ile giriş yap (Katkıda Bulunan)"
|
||||
},
|
||||
"githubLoginStartFailed": {
|
||||
"message": "Failed to initiate GitHub login. Please try again."
|
||||
"message": "GitHub giriş işlemi başlatılamadı. Lütfen tekrar deneyin."
|
||||
},
|
||||
"githubLoginCompleteFailed": {
|
||||
"message": "Failed to complete GitHub login. Please try again."
|
||||
"message": "GitHub giriş işlemi tamamlanamadı. Lütfen tekrar deneyin."
|
||||
},
|
||||
"githubLoginUnavailable": {
|
||||
"message": "GitHub katkıda bulunan girişi şu anda kullanılamıyor. Hizmetin güncellenmesi veya yapılandırma değişikliği gerekiyor."
|
||||
},
|
||||
"githubLoginNotContributor": {
|
||||
"message": "Bu GitHub hesabı Return YouTube Dislike katkıda bulunanları arasında listelenmiyor. Katkıda bulunan bir hesapla giriş yapın. Son katkıların görünmesi birkaç saat sürebilir."
|
||||
},
|
||||
"githubLoginBrowserUnavailable": {
|
||||
"message": "GitHub girişi bu tarayıcının geri dönüş adresi için yapılandırılmamış. Lütfen destek ekibiyle iletişime geçin."
|
||||
},
|
||||
"githubLoginExpired": {
|
||||
"message": "Bu GitHub giriş denemesinin süresi doldu veya doğrulanamadı. Lütfen yeni bir giriş işlemi başlatın."
|
||||
},
|
||||
"githubLoginUpdateRequired": {
|
||||
"message": "GitHub katkıda bulunan girişi özelliğini kullanmak için lütfen uzantıyı güncelleyin."
|
||||
},
|
||||
"githubLoginRateLimited": {
|
||||
"message": "Çok fazla giriş denemesi yapıldı. Lütfen tekrar denemeden önce bir dakika bekleyin."
|
||||
},
|
||||
"githubLoginDenied": {
|
||||
"message": "GitHub yetkilendirmesi reddedildi. Katkıda bulunan girişi yetkilendirme gerektirir."
|
||||
},
|
||||
"patreonLoginCompleteFailed": {
|
||||
"message": "Giriş tamamlanamadı. Lütfen tekrar deneyin."
|
||||
},
|
||||
"patreonLoginStartFailed": {
|
||||
"message": "Patreon oturum açma başlatılamadı. Lütfen tekrar deneyin."
|
||||
"message": "Patreon giriş işlemi başlatılamadı. Lütfen tekrar deneyin."
|
||||
},
|
||||
"patreonLogout": {
|
||||
"message": "Çıkış yap"
|
||||
},
|
||||
"patreonPermissionRequired": {
|
||||
"message": "Oturum açmak için 'identity' izni gerekir. Devam etmek için lütfen izin verin."
|
||||
"message": "Giriş yapmak için 'identity' izni gereklidir. Devam etmek için bu izne izin verin."
|
||||
},
|
||||
"patreonTierBasic": {
|
||||
"message": "Temel Seviye"
|
||||
},
|
||||
"patreonTierChecking": {
|
||||
"message": "Üyelik kontrol ediliyor…"
|
||||
"message": "Üyelik kontrol ediliyor..."
|
||||
},
|
||||
"patreonTierNone": {
|
||||
"message": "Etkin üyelik yok"
|
||||
"message": "Aktif Üyelik Yok"
|
||||
},
|
||||
"patreonTierPremium": {
|
||||
"message": "Premium Destekçi"
|
||||
@@ -126,25 +147,25 @@
|
||||
"message": "Destekçi"
|
||||
},
|
||||
"patreonUserFallback": {
|
||||
"message": "Patreon kullanıcısı"
|
||||
"message": "Patreon Kullanıcısı"
|
||||
},
|
||||
"reformatLikes": {
|
||||
"message": "Like sayılarının tarzını yenileştir"
|
||||
"message": "Beğeni sayılarını yeniden biçimlendir"
|
||||
},
|
||||
"reformatLikesHover": {
|
||||
"message": "Like ve dislike tarzını tutarlı hâle getirir."
|
||||
"message": "Beğeni ve beğenmeme sayılarını tutarlı bir biçimde gösterin."
|
||||
},
|
||||
"hidePremiumTeaser": {
|
||||
"message": "Premium tanıtım panelini gizle"
|
||||
},
|
||||
"hidePremiumTeaserHover": {
|
||||
"message": "YouTube izleme sayfalarında premium tanıtımını gösterme."
|
||||
"message": "YouTube video izleme sayfalarında Premium tanıtımını gösterme."
|
||||
},
|
||||
"roundNumbers": {
|
||||
"message": "Aşağı yuvarlanmış sayıları gösterir"
|
||||
"message": "Aşağı yuvarlanmış sayıları göster"
|
||||
},
|
||||
"roundNumbersHover": {
|
||||
"message": "Sayıları aşağıya yuvarla (varsayılan YouTube davranışı)."
|
||||
"message": "Sayıları aşağı yuvarla (YouTube'un varsayılan davranışı)."
|
||||
},
|
||||
"shortsSupport": {
|
||||
"message": "YouTube Shorts Desteği"
|
||||
@@ -162,7 +183,7 @@
|
||||
"message": "Klasik"
|
||||
},
|
||||
"textColorTheme2": {
|
||||
"message": "Anlaşılır"
|
||||
"message": "Erişilebilir"
|
||||
},
|
||||
"textColorTheme3": {
|
||||
"message": "Neon"
|
||||
@@ -186,76 +207,76 @@
|
||||
"message": "Beğenme"
|
||||
},
|
||||
"textColorizeRatioBar": {
|
||||
"message": "Beğeni oranı çubuğunu renklendir"
|
||||
"message": "Oran çubuğunu renklendir"
|
||||
},
|
||||
"textColorizeRatioBarHover": {
|
||||
"message": "Oran çubuğu için özel renkler kullanın."
|
||||
},
|
||||
"textColorizeThumbs": {
|
||||
"message": "Butonları renklendir"
|
||||
"message": "Başparmak simgelerini renklendir"
|
||||
},
|
||||
"textColorizeThumbsHover": {
|
||||
"message": "Buton simgeleri için özel renkler kullanın."
|
||||
"message": "Başparmak simgeleri için özel renkler kullanın."
|
||||
},
|
||||
"textConsistentFormat": {
|
||||
"message": "Like ve dislike tarzını tutarlı hâle getirir"
|
||||
"message": "Beğeni ve beğenmeme sayılarını tutarlı biçimde göster"
|
||||
},
|
||||
"textConsistentFormatHover": {
|
||||
"message": "Like sayılarının tarzını yenileştir."
|
||||
"message": "Beğeni sayılarını yeniden biçimlendir."
|
||||
},
|
||||
"textDeveloper": {
|
||||
"message": "Dmitry Selivanov ve Topluluk tarafından"
|
||||
},
|
||||
"textLikesDisabled": {
|
||||
"message": "Sahibi tarafından devre dışı bırakıldı"
|
||||
"message": "Sahibi Tarafından Devre Dışı Bırakıldı"
|
||||
},
|
||||
"textNumberFormat": {
|
||||
"message": "Sayı tarzı:"
|
||||
"message": "Sayı biçimi:"
|
||||
},
|
||||
"textRoundingNumbers": {
|
||||
"message": "Like/dislike istatisliklerini aşağıya yuvarlar (varsayılan YouTube davranışı)"
|
||||
"message": "Beğeni/beğenmeme istatistiklerini aşağı yuvarla (YouTube'un varsayılan davranışı)"
|
||||
},
|
||||
"textRoundingNumbersHover": {
|
||||
"message": "Yuvarlatılmış istatistikleri göster."
|
||||
"message": "Aşağı yuvarlanmış istatistikleri göster."
|
||||
},
|
||||
"textSettings": {
|
||||
"message": "Like/dislike gönderimini devre dışı bırak"
|
||||
"message": "Beğeni/beğenmeme gönderimini devre dışı bırak"
|
||||
},
|
||||
"textSettingsHover": {
|
||||
"message": "Like ve dislike'larınızı saymayı bırakır."
|
||||
"message": "Beğeni ve beğenmeme oylarınızın sayılmasını durdurur."
|
||||
},
|
||||
"textTempUnavailable": {
|
||||
"message": "Geçici Olarak Kullanım Dışı"
|
||||
"message": "Geçici Olarak Kullanılamıyor"
|
||||
},
|
||||
"textUpdate": {
|
||||
"message": "Şu sürüme güncelle"
|
||||
"message": "Şuna güncelle:"
|
||||
},
|
||||
"tooltipPercentageMode": {
|
||||
"message": "Yüzde modu:"
|
||||
},
|
||||
"tooltipPercentageModeHover": {
|
||||
"message": "Üzerine gelindiğinde özel yüzde gösterimini kullan."
|
||||
"message": "Üzerine gelindiğinde özel yüzde gösterimi kullanın."
|
||||
},
|
||||
"version30installed": {
|
||||
"message": "Sürüm __RYD_VERSION__ yüklendi"
|
||||
"message": "__RYD_VERSION__ sürümü yüklendi"
|
||||
},
|
||||
"whatsnew": {
|
||||
"message": "Yeni Ne Var"
|
||||
"message": "Yenilikler"
|
||||
},
|
||||
"premiumAnalytics_title": {
|
||||
"message": "Premium video içgörüleri"
|
||||
"message": "Premium Video İstatistikleri"
|
||||
},
|
||||
"premiumAnalytics_activityTitle": {
|
||||
"message": "Zaman içindeki etkileşim"
|
||||
},
|
||||
"premiumAnalytics_listsTitle": {
|
||||
"message": "Öne çıkan ülkeler"
|
||||
"message": "En çok etkileşim alan ülkeler"
|
||||
},
|
||||
"premiumAnalytics_listLikesTitle": {
|
||||
"message": "En çok beğeni alan ülkeler"
|
||||
"message": "En çok beğeni veren ülkeler"
|
||||
},
|
||||
"premiumAnalytics_listDislikesTitle": {
|
||||
"message": "En çok beğenilmeyen ülkeler"
|
||||
"message": "En çok beğenmeme veren ülkeler"
|
||||
},
|
||||
"premiumAnalytics_mapTitle": {
|
||||
"message": "Coğrafya"
|
||||
@@ -276,7 +297,7 @@
|
||||
"message": "Beğeniler"
|
||||
},
|
||||
"premiumAnalytics_modeDislikes": {
|
||||
"message": "Beğenilmeyenler"
|
||||
"message": "Beğenmeme"
|
||||
},
|
||||
"premiumAnalytics_modeRatio": {
|
||||
"message": "Oran"
|
||||
@@ -291,7 +312,7 @@
|
||||
"message": "İlk günler"
|
||||
},
|
||||
"premiumAnalytics_windowLatestTitle": {
|
||||
"message": "Seçilen aralıktaki en yeni günleri göster"
|
||||
"message": "Seçilen aralıktaki en güncel günleri göster"
|
||||
},
|
||||
"premiumAnalytics_windowFirstTitle": {
|
||||
"message": "Seçilen aralıktaki en eski günleri göster"
|
||||
@@ -318,7 +339,7 @@
|
||||
"message": "Tüm zamanlar"
|
||||
},
|
||||
"premiumAnalytics_rangeLabelDays": {
|
||||
"message": "$1g"
|
||||
"message": "$1 gün"
|
||||
},
|
||||
"premiumAnalytics_selectedPeriod": {
|
||||
"message": "Seçilen dönem: $1"
|
||||
@@ -330,34 +351,34 @@
|
||||
"message": "$1 beğeni"
|
||||
},
|
||||
"premiumAnalytics_totalsDislikes": {
|
||||
"message": "$1 beğenilmeme"
|
||||
"message": "$1 beğenmeme"
|
||||
},
|
||||
"premiumAnalytics_summaryMeta": {
|
||||
"message": "$2 ülkeden $3 benzersiz IP ile $1 etkileşim kaydedildi"
|
||||
"message": "$2 ülkeden ($3 benzersiz IP) $1 etkileşim kaydedildi"
|
||||
},
|
||||
"premiumAnalytics_bucketHour": {
|
||||
"message": "Saat başına oy"
|
||||
},
|
||||
"premiumAnalytics_bucketDay": {
|
||||
"message": "Gün başına oy"
|
||||
"message": "Günlük oy"
|
||||
},
|
||||
"premiumAnalytics_bucketWeek": {
|
||||
"message": "Hafta başına oy"
|
||||
"message": "Haftalık oy"
|
||||
},
|
||||
"premiumAnalytics_bucketHours": {
|
||||
"message": "Her $1 saatte oy"
|
||||
"message": "$1 saat başına oy"
|
||||
},
|
||||
"premiumAnalytics_bucketDays": {
|
||||
"message": "Her $1 günde oy"
|
||||
"message": "$1 gün başına oy"
|
||||
},
|
||||
"premiumAnalytics_bucketMinutes": {
|
||||
"message": "Her $1 dakikada oy"
|
||||
"message": "$1 dakika başına oy"
|
||||
},
|
||||
"premiumAnalytics_bucketMinute": {
|
||||
"message": "Dakika başına oy"
|
||||
},
|
||||
"premiumAnalytics_bucketSeconds": {
|
||||
"message": "Her $1 saniyede oy"
|
||||
"message": "$1 saniye başına oy"
|
||||
},
|
||||
"premiumAnalytics_bucketSecond": {
|
||||
"message": "Saniye başına oy"
|
||||
@@ -369,28 +390,28 @@
|
||||
"message": "Bilinmiyor"
|
||||
},
|
||||
"premiumAnalytics_loading": {
|
||||
"message": "İçgörüler yükleniyor…"
|
||||
"message": "İstatistikler yükleniyor…"
|
||||
},
|
||||
"premiumAnalytics_errorReauth": {
|
||||
"message": "Analitiği açmak için lütfen Patreon’u yeniden yetkilendirin."
|
||||
"message": "İstatistiklerin kilidini açmak için Patreon yetkilendirmesini yeniden yapın."
|
||||
},
|
||||
"premiumAnalytics_errorInactive": {
|
||||
"message": "Premium analitik, aktif Patreon destekçileri için kullanılabilir."
|
||||
"message": "Premium istatistikler aktif Patreon destekçileri tarafından kullanılabilir."
|
||||
},
|
||||
"premiumAnalytics_errorSession": {
|
||||
"message": "Oturumun süresi doldu. Patreon ile yeniden giriş yapın."
|
||||
"message": "Oturumun süresi doldu. Patreon ile tekrar giriş yapın."
|
||||
},
|
||||
"premiumAnalytics_errorBackend": {
|
||||
"message": "Analitik hizmeti şu anda kullanılamıyor."
|
||||
"message": "İstatistik sunucusu şu anda kullanılamıyor."
|
||||
},
|
||||
"premiumAnalytics_errorNetwork": {
|
||||
"message": "Analitik hizmetine ulaşılamıyor."
|
||||
"message": "İstatistik hizmetine ulaşılamıyor."
|
||||
},
|
||||
"premiumAnalytics_errorGeneric": {
|
||||
"message": "Premium analitik yüklenemedi."
|
||||
"message": "Premium istatistikler yüklenemedi."
|
||||
},
|
||||
"premiumAnalytics_mapSeriesLabel": {
|
||||
"message": "Aktivite"
|
||||
"message": "Etkinlik"
|
||||
},
|
||||
"premiumAnalytics_likeRatio": {
|
||||
"message": "Beğeni oranı"
|
||||
@@ -408,155 +429,134 @@
|
||||
"message": "Daha az beğeni"
|
||||
},
|
||||
"premiumAnalytics_visualHighDislikes": {
|
||||
"message": "Daha fazla beğenilmeme"
|
||||
"message": "Daha fazla beğenmeme"
|
||||
},
|
||||
"premiumAnalytics_visualLowDislikes": {
|
||||
"message": "Daha az beğenilmeme"
|
||||
"message": "Daha az beğenmeme"
|
||||
},
|
||||
"premiumAnalytics_visualHighGeneric": {
|
||||
"message": "Daha fazla $1"
|
||||
"message": "Daha yüksek $1"
|
||||
},
|
||||
"premiumAnalytics_visualLowGeneric": {
|
||||
"message": "Daha az $1"
|
||||
"message": "Daha düşük $1"
|
||||
},
|
||||
"premiumAnalytics_tooltipLikes": {
|
||||
"message": "Beğeniler: $1"
|
||||
},
|
||||
"premiumAnalytics_tooltipDislikes": {
|
||||
"message": "Beğenilmeyenler: $1"
|
||||
"message": "Beğenmeme: $1"
|
||||
},
|
||||
"premiumAnalytics_tooltipRatio": {
|
||||
"message": "Beğeni oranı: $1"
|
||||
},
|
||||
"premiumTeaser_title": {
|
||||
"message": "Video analitiği"
|
||||
"message": "Video istatistikleri"
|
||||
},
|
||||
"premiumTeaser_subtitle": {
|
||||
"message": "Ham beğenilmeme sayıları, bu videoyu izleyen uzantı kullanıcılarının doğrudan bildirimleridir."
|
||||
"message": "Ham beğenmeme sayıları, bu videoyu izleyen uzantı kullanıcılarının doğrudan bildirimleridir."
|
||||
},
|
||||
"premiumTeaser_cta": {
|
||||
"message": "Premium’u aç"
|
||||
"message": "Premium'un Kilidini Aç"
|
||||
},
|
||||
"premiumTeaser_learn": {
|
||||
"message": "Tüm analitiği önizle"
|
||||
"message": "Tam istatistikleri önizle"
|
||||
},
|
||||
"premiumTeaser_statRaw": {
|
||||
"message": "Ham beğenilmeme sayısı"
|
||||
"message": "Ham beğenmeme sayısı"
|
||||
},
|
||||
"premiumTeaser_statDislikes": {
|
||||
"message": "Tahmini beğenilmeme"
|
||||
"message": "Tahmini beğenmeme sayısı"
|
||||
},
|
||||
"premiumTeaser_statLikes": {
|
||||
"message": "Ham beğeni sayısı"
|
||||
},
|
||||
"premiumTeaser_statusLoading": {
|
||||
"message": "En son beğenilmeme toplamları alınıyor…"
|
||||
"message": "En güncel beğenmeme toplamları alınıyor…"
|
||||
},
|
||||
"premiumTeaser_statusError": {
|
||||
"message": "Şu anda beğenilmeme verileri yüklenemedi. Sayfayı yeniden yüklemeyi deneyin."
|
||||
"message": "Beğenmeme verileri şu anda yüklenemedi. Sayfayı yeniden yüklemeyi deneyin."
|
||||
},
|
||||
"premiumTeaser_breadcrumbsAria": {
|
||||
"message": "Premium analitik nasıl açılır"
|
||||
"message": "Premium istatistiklerin kilidi nasıl açılır"
|
||||
},
|
||||
"premiumTeaser_breadcrumbsTitle": {
|
||||
"message": "Premium video içgörülerini üç hızlı adımda açın:"
|
||||
"message": "Premium Video İstatistiklerinin kilidini üç hızlı adımda açın:"
|
||||
},
|
||||
"premiumTeaser_breadcrumbStep1": {
|
||||
"message": "Return YouTube Dislike eklentisinin açılır penceresinden Patreon ile giriş yapın."
|
||||
"message": "Return YouTube Dislike uzantısının açılır penceresinden Patreon ile giriş yapın."
|
||||
},
|
||||
"premiumTeaser_breadcrumbStep2": {
|
||||
"message": "Aktivite zaman çizelgelerini, ülke sıralamalarını ve interaktif haritayı açmak için Premium seviyesini seçin."
|
||||
"message": "Etkinlik zaman çizelgelerini, ülke sıralamalarını ve etkileşimli haritayı etkinleştirmek için Premium seviyesini seçin."
|
||||
},
|
||||
"premiumTeaser_breadcrumbStep3": {
|
||||
"message": "Her video için saatlik trendleri, öne çıkan ülkeleri ve ABD eyalet detaylarını görmek için YouTube’u yeniden yükleyin."
|
||||
"message": "Her video için saatlik eğilimleri, en aktif ülkeleri ve ABD eyalet ayrıntılarını görmek üzere YouTube'u yeniden yükleyin."
|
||||
},
|
||||
"premiumTierNotice_title": {
|
||||
"message": "Premium analiz kilitli"
|
||||
"message": "Premium istatistikler kilitli"
|
||||
},
|
||||
"premiumTierNotice_message": {
|
||||
"message": "Patreon üyeliğinizde Premium seviye bulunmuyor. Gelişmiş video analizlerini açmak için desteğinizi yükseltin."
|
||||
"message": "Patreon üyeliğiniz Premium seviyesini içermiyor. Gelişmiş video istatistiklerinin kilidini açmak için desteğinizi yükseltin."
|
||||
},
|
||||
"premiumTierNotice_cta": {
|
||||
"message": "Patreon’da yükselt"
|
||||
"message": "Patreon'da yükselt"
|
||||
},
|
||||
"changelog_cta_primary": {
|
||||
"message": "Patreon'da yükseltme"
|
||||
"message": "Patreon'da yükselt"
|
||||
},
|
||||
"changelog_cta_secondary": {
|
||||
"message": "Kurulum kılavuzunu okuyun"
|
||||
"message": "Kurulum kılavuzunu oku"
|
||||
},
|
||||
"changelog_section_highlights": {
|
||||
"message": "Ne var ne yok"
|
||||
"message": "Yenilikler"
|
||||
},
|
||||
"changelog_feature_timeline_title": {
|
||||
"message": "Canlı etkinlik zaman çizelgesi"
|
||||
},
|
||||
"changelog_feature_map_title": {
|
||||
"message": "İnteraktif dünya ve ABD ısı haritası"
|
||||
"message": "Etkileşimli dünya ve ABD ısı haritası"
|
||||
},
|
||||
"changelog_feature_quality_title": {
|
||||
"message": "En iyi ülkeler sıralama tablosu"
|
||||
"message": "En aktif ülkeler sıralaması"
|
||||
},
|
||||
"changelog_screenshot_label_timeline": {
|
||||
"message": "Yer tutucu: zaman çizelgesine genel bakış"
|
||||
"message": "Yer tutucu: zaman çizelgesi genel görünümü"
|
||||
},
|
||||
"changelog_screenshot_label_map": {
|
||||
"message": "Yer tutucu: küresel etkinlik haritası"
|
||||
},
|
||||
"changelog_screenshot_label_teaser": {
|
||||
"message": "Yer tutucu: ülkeler sıralama tablosu"
|
||||
"message": "Yer tutucu: ülke sıralaması"
|
||||
},
|
||||
"changelog_upgrade_step1": {
|
||||
"message": "YouTube Beğenmemeye Geri Dön açılır penceresini açın ve Patreon'da oturum açın."
|
||||
"message": "Return YouTube Dislike açılır penceresini açın ve Patreon ile giriş yapın."
|
||||
},
|
||||
"changelog_support_heading": {
|
||||
"message": "Yardıma mı ihtiyacınız var?"
|
||||
},
|
||||
"changelog_support_description": {
|
||||
"message": "Bir sorunla karşılaşırsanız buradayız; sorularınızı destek belgelerine veya topluluğa iletin."
|
||||
"message": "Bir sorunla karşılaşırsanız buradayız—sorularınızı destek belgelerine veya topluluğa iletebilirsiniz."
|
||||
},
|
||||
"changelog_support_contact": {
|
||||
"message": "Topluluğa sorun"
|
||||
"message": "Topluluğa sor"
|
||||
},
|
||||
"hideClutterButtons": {
|
||||
"message": "Hide clutter buttons"
|
||||
"message": "Gereksiz düğmeleri gizle"
|
||||
},
|
||||
"hideClutterButtonsHelpLabel": {
|
||||
"message": "Show before and after examples"
|
||||
"message": "Öncesi ve sonrası örneklerini göster"
|
||||
},
|
||||
"hideClutterButtonsDescription": {
|
||||
"message": "Keep only Like and Dislike visible. Share, Save, Thanks, and other optional actions stay available in YouTube's three-dot More menu."
|
||||
"message": "Yalnızca Beğen ve Beğenme düğmeleri görünür kalsın. Paylaş, Kaydet, Teşekkürler ve diğer isteğe bağlı işlemler YouTube'un üç noktalı Diğer menüsünde kullanılabilir olmaya devam eder."
|
||||
},
|
||||
"hideClutterButtonsBefore": {
|
||||
"message": "Before: all action buttons are visible"
|
||||
"message": "Önce: tüm işlem düğmeleri görünür"
|
||||
},
|
||||
"hideClutterButtonsAfter": {
|
||||
"message": "After: only Like and Dislike stay visible"
|
||||
"message": "Sonra: yalnızca Beğen ve Beğenme görünür"
|
||||
},
|
||||
"changelog_brand_logo_alt": {
|
||||
"message": "Return YouTube Dislike logosu"
|
||||
},
|
||||
"githubLoginUnavailable": {
|
||||
"message": "Katkıda bulunanlar için GitHub ile giriş şu anda kullanılamıyor. Hizmetin güncellenmesi veya yapılandırmasının değiştirilmesi gerekiyor."
|
||||
},
|
||||
"githubLoginNotContributor": {
|
||||
"message": "Bu GitHub hesabı, Return YouTube Dislike projesine katkıda bulunanlar arasında yer almıyor. Katkıda bulunan bir hesapla giriş yapın. Son katkıların görünmesi birkaç saat sürebilir."
|
||||
},
|
||||
"githubLoginBrowserUnavailable": {
|
||||
"message": "GitHub ile giriş, bu tarayıcının geri çağrı adresi için yapılandırılmamış. Lütfen destek ekibiyle iletişime geçin."
|
||||
},
|
||||
"githubLoginExpired": {
|
||||
"message": "Bu GitHub giriş denemesinin süresi doldu veya deneme doğrulanamadı. Lütfen yeniden giriş yapmayı deneyin."
|
||||
},
|
||||
"githubLoginUpdateRequired": {
|
||||
"message": "Katkıda bulunanlar için GitHub ile girişi kullanmak üzere lütfen uzantıyı güncelleyin."
|
||||
},
|
||||
"githubLoginRateLimited": {
|
||||
"message": "Çok fazla giriş denemesi yapıldı. Tekrar denemeden önce lütfen bir dakika bekleyin."
|
||||
},
|
||||
"githubLoginDenied": {
|
||||
"message": "GitHub yetkilendirmesi reddedildi. Katkıda bulunanlar için giriş, yetkilendirme gerektirir."
|
||||
},
|
||||
"discussion_title": {
|
||||
"message": "RYD yorumları"
|
||||
},
|
||||
|
||||
@@ -5,6 +5,7 @@ import german from "../../_locales/de/messages.json";
|
||||
import greek from "../../_locales/el/messages.json";
|
||||
import english from "../../_locales/en/messages.json";
|
||||
import spanish from "../../_locales/es/messages.json";
|
||||
import persian from "../../_locales/fa/messages.json";
|
||||
import french from "../../_locales/fr/messages.json";
|
||||
import hungarian from "../../_locales/hu/messages.json";
|
||||
import indonesian from "../../_locales/id/messages.json";
|
||||
@@ -31,6 +32,7 @@ const catalogs = {
|
||||
el: greek,
|
||||
en: english,
|
||||
es: spanish,
|
||||
fa: persian,
|
||||
fr: french,
|
||||
hu: hungarian,
|
||||
id: indonesian,
|
||||
|
||||
@@ -52,7 +52,7 @@ test("every shipped locale provides non-empty hide-clutter copy", () => {
|
||||
const localeRoot = path.join(extensionRoot, "_locales");
|
||||
const localeDirectories = fs.readdirSync(localeRoot, { withFileTypes: true }).filter((entry) => entry.isDirectory());
|
||||
|
||||
expect(localeDirectories).toHaveLength(24);
|
||||
expect(localeDirectories).toHaveLength(25);
|
||||
for (const locale of localeDirectories) {
|
||||
const messages = JSON.parse(fs.readFileSync(path.join(localeRoot, locale.name, "messages.json"), "utf8"));
|
||||
for (const key of messageKeys) {
|
||||
|
||||
@@ -201,7 +201,7 @@ export function renderActivityChart(timeSeries) {
|
||||
activityChart.setOption({
|
||||
backgroundColor: "transparent",
|
||||
tooltip: { trigger: "axis" },
|
||||
legend: { data: [likesLabel, dislikesLabel], textStyle: { color: getTextColor() } },
|
||||
legend: { top: 0, data: [likesLabel, dislikesLabel], textStyle: { color: getTextColor() } },
|
||||
grid: { left: 40, right: 20, top: 30, bottom: 70 },
|
||||
xAxis: {
|
||||
type: "time",
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
/**
|
||||
* @jest-environment node
|
||||
*/
|
||||
|
||||
jest.mock("../panel", () => ({ setActivityBucketLabel: jest.fn() }));
|
||||
jest.mock("../../utils", () => ({
|
||||
localize: (key) => ({ premiumAnalytics_modeLikes: "Likes", premiumAnalytics_modeDislikes: "Dislikes" })[key] || key,
|
||||
}));
|
||||
jest.mock("../theme", () => ({
|
||||
getTextColor: () => "#ffffff",
|
||||
getMutedTextColor: () => "#b3b3b3",
|
||||
getBorderColor: () => "#444444",
|
||||
}));
|
||||
jest.mock("../logging", () => ({ logRangeSelection: jest.fn(), logTimeBounds: jest.fn() }));
|
||||
|
||||
import * as echarts from "echarts";
|
||||
import { analyticsState, resetStateForVideo } from "../state";
|
||||
import { renderActivityChart } from "./index";
|
||||
|
||||
function renderedBounds(chart, componentType) {
|
||||
const component = chart.getModel().getComponent(componentType);
|
||||
const view = chart.getViewOfComponentModel(component);
|
||||
const bounds = view.group.getBoundingRect().clone();
|
||||
bounds.applyTransform(view.group.getComputedTransform());
|
||||
return bounds;
|
||||
}
|
||||
|
||||
describe("activity chart layout", () => {
|
||||
afterEach(() => {
|
||||
analyticsState.activityChart?.dispose();
|
||||
analyticsState.activityChart = null;
|
||||
analyticsState.panelElement = null;
|
||||
resetStateForVideo();
|
||||
});
|
||||
|
||||
it.each([
|
||||
["compact", 600, 220],
|
||||
["narrow", 320, 220],
|
||||
["expanded", 1100, 560],
|
||||
])("keeps the rendered legend above the zoom slider when %s", (_layout, width, height) => {
|
||||
const chart = echarts.init(null, null, { renderer: "svg", ssr: true, width, height });
|
||||
analyticsState.activityChart = chart;
|
||||
analyticsState.panelElement = {};
|
||||
|
||||
renderActivityChart({
|
||||
bucket: "hour",
|
||||
totalRangeStartUtc: "2025-01-01T00:00:00Z",
|
||||
totalRangeEndUtc: "2025-01-02T00:00:00Z",
|
||||
points: [
|
||||
{ timestampUtc: "2025-01-01T00:00:00Z", likes: 15, dislikes: 3 },
|
||||
{ timestampUtc: "2025-01-01T01:00:00Z", likes: 35, dislikes: 7 },
|
||||
{ timestampUtc: "2025-01-01T02:00:00Z", likes: 55, dislikes: 11 },
|
||||
],
|
||||
});
|
||||
|
||||
const legend = renderedBounds(chart, "legend");
|
||||
const slider = renderedBounds(chart, "dataZoom");
|
||||
|
||||
expect(legend.height).toBeGreaterThan(0);
|
||||
expect(slider.height).toBeGreaterThan(0);
|
||||
expect(legend.y).toBeGreaterThanOrEqual(0);
|
||||
expect(legend.y + legend.height).toBeLessThanOrEqual(slider.y);
|
||||
expect(slider.y + slider.height).toBeLessThanOrEqual(height);
|
||||
});
|
||||
});
|
||||
@@ -7,7 +7,7 @@
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Read this in other languages: [English](README.md), [العربية](READMEar.md), [Azərbaycan dili](READMEaz.md), [беларуская](READMEbe.md), [български](READMEbg.md), [繁體中文](READMEtw.md), [简体中文](READMEcn.md), [Danish](READMEda.md), [Deutsch](READMEde.md), [Español](READMEes.md), [Français](READMEfr.md), [Ελληνικά](READMEgr.md), [Magyar](READMEhu.md), [Bahasa Indonesia](READMEid.md), [日本語](READMEja.md), [한국어](READMEkr.md), [Nederlands](READMEnl.md), [Polski](READMEpl.md), [Português do Brasil](READMEpt_BR.md), [русский](READMEru.md), [Svenska](READMEsv.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Tiếng Việt](READMEvi.md), [Slovenščina](READMEsl.md)
|
||||
Read this in other languages: [English](README.md), [فارسی](READMEfa.md), [العربية](READMEar.md), [Azərbaycan dili](READMEaz.md), [беларуская](READMEbe.md), [български](READMEbg.md), [繁體中文](READMEtw.md), [简体中文](READMEcn.md), [Danish](READMEda.md), [Deutsch](READMEde.md), [Español](READMEes.md), [Français](READMEfr.md), [Ελληνικά](READMEgr.md), [Magyar](READMEhu.md), [Bahasa Indonesia](READMEid.md), [日本語](READMEja.md), [한국어](READMEkr.md), [Nederlands](READMEnl.md), [Polski](READMEpl.md), [Português do Brasil](READMEpt_BR.md), [русский](READMEru.md), [Svenska](READMEsv.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Tiếng Việt](READMEvi.md), [Slovenščina](READMEsl.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://chromewebstore.google.com/detail/return-youtube-dislike/gebbhagfogifgggkldgodflihgfeippi)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/commits/main)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/issues)
|
||||
[](https://discord.gg/UMxyMmCgfF)
|
||||
[](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
|
||||
|
||||
Read this in other languages: [English](README.md), [فارسی](READMEfa.md), [العربية](READMEar.md), [Azərbaycan dili](READMEaz.md), [беларуская](READMEbe.md), [български](READMEbg.md), [繁體中文](READMEtw.md), [简体中文](READMEcn.md), [Danish](READMEda.md), [Deutsch](READMEde.md), [Español](READMEes.md), [Français](READMEfr.md), [Ελληνικά](READMEgr.md), [Magyar](READMEhu.md), [Bahasa Indonesia](READMEid.md), [日本語](READMEja.md), [한국어](READMEkr.md), [Nederlands](READMEnl.md), [Polski](READMEpl.md), [Português do Brasil](READMEpt_BR.md), [русский](READMEru.md), [Svenska](READMEsv.md), [Türkçe](READMEtr.md), [українська](READMEuk.md), [Tiếng Việt](READMEvi.md), [Slovenščina](READMEsl.md)
|
||||
|
||||
# Return YouTube Dislike
|
||||
|
||||
<p align="center">
|
||||
<b>Return YouTube Dislike یک افزونه متنباز است که تعداد dislikeهای YouTube را بازمیگرداند.</b><br>
|
||||
برای Chrome و Firefox به صورت Web Extension در دسترس است.<br>
|
||||
همچنین برای سایر مرورگرها به صورت JS Userscript در دسترس است.<br><br>
|
||||
<img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
|
||||
</p>
|
||||
|
||||
## داستان ماجرا
|
||||
|
||||
در ۱۰ نوامبر ۲۰۲۱، Google [اعلام کرد](https://blog.youtube/news-and-events/update-to-youtube/) که تعداد dislikeهای YouTube حذف خواهد شد.
|
||||
|
||||
علاوه بر این، فیلد `dislike` در YouTube API در تاریخ ۱۳ دسامبر ۲۰۲۱ [حذف شد](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts)، که هرگونه امکان قضاوت درباره کیفیت محتوا قبل از تماشا را از بین برد.
|
||||
|
||||
## عملکرد
|
||||
|
||||
با حذف آمار dislike از YouTube API، بخش backend ما به استفاده از ترکیبی از آمار dislikeهای جمعآوریشده و برآوردهای استخراجشده از دادههای کاربران افزونه تغییر یافت.
|
||||
|
||||
[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
|
||||
|
||||
## چرا اهمیت دارد
|
||||
|
||||
میتوانید در وبسایت ما اطلاعات بیشتری کسب کنید: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
|
||||
|
||||
## مستندات API
|
||||
|
||||
استفاده شخص ثالث از این API عمومی با محدودیتهای زیر مجاز است:
|
||||
|
||||
- **ارجاع**: این پروژه باید به طور واضح با لینکی به [returnyoutubedislike.com](https://returnyoutubedislike.com/) ارجاع داده شود.
|
||||
- **محدودیت نرخ**: محدودیتهای نرخ برای هر کلاینت ۱۰۰ در دقیقه و ۱۰,۰۰۰ در روز اعمال شده است. این یک کد وضعیت _429_ برمیگرداند که نشان میدهد برنامه شما باید متوقف شود یا درخواستها را کاهش دهد.
|
||||
|
||||
این API از طریق URL پایه زیر در دسترس است:
|
||||
https://returnyoutubedislikeapi.com
|
||||
|
||||
فهرست endpointهای موجود در اینجا در دسترس است:
|
||||
https://returnyoutubedislikeapi.com/swagger/index.html
|
||||
|
||||
### دریافت آرا
|
||||
|
||||
مثال برای دریافت آرای یک YouTube video ID مشخص:
|
||||
`/votes?videoId=kxOuG8jMIgI`
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "kxOuG8jMIgI",
|
||||
"dateCreated": "2022-04-09T21:44:20.5103Z",
|
||||
"likes": 31885,
|
||||
"rawDislikes": 31946,
|
||||
"rawLikes": 457,
|
||||
"dislikes": 579721,
|
||||
"rating": 1.2085329444119253,
|
||||
"viewCount": 3762293,
|
||||
"deleted": false
|
||||
}
|
||||
```
|
||||
|
||||
یک YouTube ID ناموجود، کد وضعیت _404_ "Not Found" برمیگرداند.
|
||||
یک YouTube ID با فرمت نادرست، کد وضعیت _400_ "Bad Request" برمیگرداند.
|
||||
|
||||
<!---
|
||||
## API documentation
|
||||
|
||||
You can view all documentation on our website.
|
||||
[https://returnyoutubedislike.com/docs/](https://returnyoutubedislike.com/docs/) -->
|
||||
|
||||
## مشارکت
|
||||
|
||||
لطفاً [راهنمای مشارکت](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md) را مطالعه کنید.
|
||||
|
||||
## از این پروژه حمایت کنید!
|
||||
|
||||
میتوانید با اهدا از طریق لینک زیر از این پروژه حمایت کنید:
|
||||
|
||||
[Donate](https://returnyoutubedislike.com/donate)
|
||||
|
||||
## حامیان مالی
|
||||
|
||||
[حامی ما شوید و در مخزن و وبسایت قرار بگیرید](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
|
||||
@@ -0,0 +1,142 @@
|
||||
import { en } from "vuetify/src/locale";
|
||||
|
||||
export default {
|
||||
...en,
|
||||
home: {
|
||||
name: "خانه",
|
||||
title: "Return YouTube Dislike",
|
||||
subtitle: "افزونه مرورگر و API برای نمایش dislikeها در YouTube",
|
||||
ukraine: "حمایت از اوکراین",
|
||||
sponsors: "حامیان مالی",
|
||||
becomeSponsor: "حامی ما شوید",
|
||||
},
|
||||
install: {
|
||||
name: "نصب",
|
||||
title: "پلتفرم خود را انتخاب کنید",
|
||||
subtitle: "در دسترس برای Firefox و تمام مرورگرهای Chromium",
|
||||
title2: "سایر پلتفرمها",
|
||||
subtitle2: "اگر مرورگر شما هنوز پشتیبانی نمیشود، این Userscript را امتحان کنید",
|
||||
title3: "پیادهسازیهای شخص ثالث",
|
||||
subtitle3: "هیچ مسئولیتی متوجه ما نیست، با مسئولیت خودتان استفاده کنید",
|
||||
firefox: "Firefox",
|
||||
chrome: "Chrome",
|
||||
edge: "Edge",
|
||||
opera: "Opera",
|
||||
brave: "Brave",
|
||||
userscript: "Userscript",
|
||||
tampermonkey: "Tampermonkey",
|
||||
androidReVanced: "Android - ReVanced",
|
||||
androidMorphe: "Android - Morphe",
|
||||
androidTubular: "Android (Tubular - یک فورک NewPipe)",
|
||||
iosJailbroken: "iOS (Jailbroken)",
|
||||
iosUYouPlus: "iOS (uYou+)",
|
||||
},
|
||||
api: {
|
||||
name: "API",
|
||||
title: "به مستندات رسمی RYD خوش آمدید!",
|
||||
subtitle: "برای شروع، بخشی را از منو انتخاب کنید.",
|
||||
rights: {
|
||||
title: "حقوق استفاده",
|
||||
subtitle:
|
||||
"استفاده شخص ثالث از این API عمومی با محدودیتهای زیر مجاز است:",
|
||||
bullet1: "ارجاع: ",
|
||||
bullet1text:
|
||||
"این پروژه باید به طور واضح با پیوندی به این مخزن یا پیوندی به returnyoutubedislike.com ارجاع داده شود",
|
||||
bullet2: "محدودیت نرخ: ",
|
||||
bullet2text:
|
||||
"محدودیتهای نرخ برای هر کلاینت ۱۰۰ در دقیقه و ۱۰,۰۰۰ در روز اعمال شده است. این یک کد وضعیت ۴۲۹ برمیگرداند که نشان میدهد برنامه شما باید درخواستها را کاهش دهد",
|
||||
},
|
||||
url: {
|
||||
title: "اطلاعات URL",
|
||||
subtitle: "این API از طریق URL پایه زیر در دسترس است: ",
|
||||
},
|
||||
endpoints: {
|
||||
title: "Endpointهای موجود",
|
||||
subtitle: "فهرست endpointهای موجود در اینجا در دسترس است: ",
|
||||
},
|
||||
fetching: {
|
||||
title: "آموزش ساده دریافت اطلاعات",
|
||||
subtitle: "مثال برای دریافت آرای یک YouTube video ID مشخص: ",
|
||||
title2: "نمونه درخواست: ",
|
||||
url: "Request URL: ",
|
||||
method: "Request Method: ",
|
||||
headers: "Headers: ",
|
||||
response: "Response: ",
|
||||
error1: 'یک شناسه YouTube نامعتبر، کد وضعیت 404 "Not Found" را بازمیگرداند',
|
||||
error2:
|
||||
'یک شناسه YouTube با قالب نادرست، کد وضعیت 400 "Bad Request" را بازمیگرداند',
|
||||
},
|
||||
},
|
||||
help: {
|
||||
name: "راهنما",
|
||||
title: "عیبیابی",
|
||||
bullet1: "مطمئن شوید که آخرین نسخه افزونه را نصب کردهاید، ",
|
||||
bullet11: "در حال حاضر",
|
||||
bullet2:
|
||||
"سعی کنید افزونه را حذف و مجدداً نصب کنید، سپس مرورگر را دوباره راهاندازی کنید (تمام پنجرههای فعال، نه فقط یک برگه)",
|
||||
bullet3: "مطمئن شوید این پیوند باز میشود: ",
|
||||
bullet31: "باید متن ساده زیر را ببینید: ",
|
||||
bullet4: "اگر هیچیک از موارد بالا کمکی نکرد - مشکل خود را گزارش دهید در",
|
||||
bullet41: "در بخش",
|
||||
bullet4a: "سیستمعامل، نام مرورگر و نسخه مرورگر خود را به ما بگویید",
|
||||
bullet4b:
|
||||
"از صفحه دارای مشکل (مانند صفحه ویدیوی YouTube) در حالی که کنسول باز است اسکرینشات بگیرید (فشار دهید ",
|
||||
bullet4b1: ") - نمونه اسکرینشات در زیر آمده است.",
|
||||
bullet4c:
|
||||
"از صفحه افزونههای مرورگر خود در حالی که این افزونه نصب است، اسکرینشات بگیرید.",
|
||||
bullet4c1: "برای مشاهده افزونهها این عبارت را در نوار آدرس وارد کنید: ",
|
||||
firefox: "برای Firefox",
|
||||
chrome: "برای Chrome، Edge، Brave، Opera و Vivaldi",
|
||||
detected: "شناساییشده:",
|
||||
altExampleScreenshot: "نمونه اسکرینشات",
|
||||
},
|
||||
faq: {
|
||||
name: "FAQ",
|
||||
title: "پرسشهای متداول",
|
||||
subtitle: "هنوز سوالی دارید؟ با خیال راحت به Discord ما بپیوندید!",
|
||||
bullet1: "افزونه دادههای خود را از کجا میآورد؟",
|
||||
bullet1text:
|
||||
"ترکیبی از دادههای آرشیو شده از قبل از خاموش شدن API رسمی dislike در YouTube و برآوردهای حاصل از رفتار کاربران افزونه.",
|
||||
bullet2: "چرا تعداد dislike بهروزرسانی نمیشود؟",
|
||||
bullet2text:
|
||||
"در حال حاضر dislikeهای ویدیو cache میشوند و خیلی مکرر بهروزرسانی نمیشوند. این مدت بسته به محبوبیت ویدیو متغیر است اما ممکن است از چند ساعت تا چند روز برای بهروزرسانی طول بکشد.",
|
||||
bullet3: "این چگونه کار میکند؟",
|
||||
bullet3text:
|
||||
"افزونه، شناسه ویدیویی را که تماشا میکنید جمعآوری کرده و تعداد dislikeها (و فیلدهای دیگر مانند viewها، likeها و غیره) را با استفاده از API ما دریافت میکند. سپس افزونه تعداد dislike و نسبت را در صفحه نمایش میدهد. اگر ویدیویی را like یا dislike کنید، ثبت شده و به دیتابیس ارسال میشود تا تعداد دقیق dislike قابل برآورد باشد.",
|
||||
bullet4: "آیا میتوانم تعداد dislikeهای خود را با شما به اشتراک بگذارم؟",
|
||||
bullet4text:
|
||||
"بهزودی. ما در حال بررسی استفاده از OAuth یا یک API فقط خواندنی با دسترسی محدود هستیم تا تولیدکنندگان محتوا بتوانند تعداد dislikeهای خود را به صورت قابل تأیید به اشتراک بگذارند.",
|
||||
bullet5: "چه دادههایی را جمعآوری میکنید و چگونه با آنها رفتار میشود؟",
|
||||
bullet5text:
|
||||
'افزونه تنها دادههایی را جمعآوری میکند که برای عملکرد صحیح آن کاملاً ضروری است، مانند آدرس IP یا شناسه ویدیویی که تماشا میکنید. هیچکدام از دادههای شما هرگز به اشخاص ثالث فروخته نخواهد شد. اگر مایلید درباره نحوه رسیدگی به امنیت و حریم خصوصی بیشتر بدانید، <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">FAQ امنیتی</a> ما را بررسی کنید.',
|
||||
bullet6: "بخش API/Backend چگونه کار میکند؟",
|
||||
bullet6text:
|
||||
"بخش backend از دادههای آرشیو شده از زمانی که YouTube API هنوز تعداد dislike را برمیگرداند، تعداد like/dislike کاربران افزونه و برآوردها استفاده میکند. در آینده نزدیک به تولیدکنندگان محتوا اجازه خواهیم داد تعداد dislike خود را به آسانی و با امنیت ارسال کنند و ما دادههای آرشیو شده ArchiveTeam (۴.۵۶ میلیارد ویدیو) را به دیتابیس فعلی خود اضافه خواهیم کرد. همچنین میتوانید ویدیویی در این زمینه مشاهده کنید.",
|
||||
bullet7: "چرا تعداد dislike عبارت 'DISLIKES DISABLED' را نمایش میدهد؟",
|
||||
bullet7text:
|
||||
"گاهی اوقات ممکن است یک ویدیوی تازه آپلود شده عبارت 'DISLIKES DISABLED' را نشان دهد حتی اگر سازنده آن را غیرفعال نکرده باشد، این به نحوه تشخیص ما برای غیرفعال بودن dislikeها مربوط است، این مورد باید پس از چند ساعت یا با like یا dislike کردن ویدیو و تازهسازی صفحه (امیدوارانه) برطرف شود.",
|
||||
},
|
||||
donate: {
|
||||
name: "کمک مالی",
|
||||
subtitle:
|
||||
"میتوانید با یک کمک مالی از تلاشهای ما برای آزاد نگهداشتن اینترنت حمایت کنید!",
|
||||
patreon: "Patreon",
|
||||
crypto: "Crypto",
|
||||
},
|
||||
links: {
|
||||
name: "لینکها",
|
||||
title: "لینکهای پروژه",
|
||||
subtitle: "لینکهای مربوط به پروژه و توسعهدهندگان آن",
|
||||
contact: "تماس با من",
|
||||
translators: "مترجمان",
|
||||
coolProjects: "پروژههای جالب",
|
||||
sponsorBlockDescription: "رد کردن تبلیغات گنجاندهشده در ویدیو",
|
||||
filmotDescription: "جستجوی ویدیوهای YouTube بر اساس زیرنویس",
|
||||
github: "GitHub",
|
||||
discord: "Discord",
|
||||
},
|
||||
layout: {
|
||||
notSupported: "پشتیبانی نمیشود.",
|
||||
considerUpgrade: "ارتقا به جدیدترین نسخه را در نظر بگیرید.",
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,126 @@
|
||||
/* eslint-env jest */
|
||||
|
||||
const fs = require("node:fs");
|
||||
const path = require("node:path");
|
||||
const vm = require("node:vm");
|
||||
|
||||
const layoutPath = path.join(__dirname, "default.vue");
|
||||
const layoutScript = fs.readFileSync(layoutPath, "utf8").match(/<script>([\s\S]*?)<\/script>/)[1];
|
||||
|
||||
function createLayout(browserLocale, savedLocale) {
|
||||
const localStorage = {
|
||||
getItem(key) {
|
||||
return this[key] ?? null;
|
||||
},
|
||||
setItem(key, value) {
|
||||
this[key] = value;
|
||||
},
|
||||
removeItem(key) {
|
||||
delete this[key];
|
||||
},
|
||||
};
|
||||
if (savedLocale !== undefined) localStorage.locale = savedLocale;
|
||||
|
||||
const context = {
|
||||
module: { exports: {} },
|
||||
process: { client: true },
|
||||
navigator: { language: browserLocale },
|
||||
localStorage,
|
||||
require,
|
||||
};
|
||||
const executableScript = layoutScript
|
||||
.replace(
|
||||
'import { readLocalePreference, writeLocalePreference } from "../utils/locale";',
|
||||
'const { readLocalePreference, writeLocalePreference } = require("../utils/locale");'
|
||||
)
|
||||
.replace("export default", "module.exports =");
|
||||
vm.runInNewContext(executableScript, context, { filename: layoutPath });
|
||||
|
||||
const component = context.module.exports;
|
||||
const instance = {
|
||||
$vuetify: {
|
||||
lang: {
|
||||
current: "en",
|
||||
defaultLocale: "en",
|
||||
locales: { en: {}, fa: {}, pt_BR: {} },
|
||||
},
|
||||
rtl: false,
|
||||
},
|
||||
};
|
||||
for (const [name, method] of Object.entries(component.methods)) {
|
||||
instance[name] = method.bind(instance);
|
||||
}
|
||||
component.created.call(instance);
|
||||
|
||||
return {
|
||||
instance,
|
||||
htmlAttrs: () => component.head.call(instance).htmlAttrs,
|
||||
localStorage,
|
||||
};
|
||||
}
|
||||
|
||||
test.each([
|
||||
["browser preference", "fa-IR", undefined],
|
||||
["saved preference", "en-US", "fa"],
|
||||
])("initializes Persian direction from the %s", (_, browserLocale, savedLocale) => {
|
||||
const layout = createLayout(browserLocale, savedLocale);
|
||||
|
||||
expect(layout.instance.$vuetify.lang.current).toBe("fa");
|
||||
expect(layout.instance.$vuetify.rtl).toBe(true);
|
||||
expect(layout.htmlAttrs()).toEqual({ lang: "fa", dir: "rtl" });
|
||||
});
|
||||
|
||||
test("manual Persian selection updates direction and persists for the next visit", () => {
|
||||
const layout = createLayout("en-US");
|
||||
|
||||
layout.instance.changeLocale("fa");
|
||||
|
||||
expect(layout.instance.$vuetify.lang.current).toBe("fa");
|
||||
expect(layout.instance.$vuetify.rtl).toBe(true);
|
||||
expect(layout.htmlAttrs()).toEqual({ lang: "fa", dir: "rtl" });
|
||||
expect(createLayout("en-US", layout.localStorage.locale).htmlAttrs()).toEqual({
|
||||
lang: "fa",
|
||||
dir: "rtl",
|
||||
});
|
||||
});
|
||||
|
||||
test("switching from Persian to English restores application and document direction", () => {
|
||||
const layout = createLayout("fa-IR");
|
||||
|
||||
layout.instance.changeLocale("en");
|
||||
|
||||
expect(layout.instance.$vuetify.lang.current).toBe("en");
|
||||
expect(layout.instance.$vuetify.rtl).toBe(false);
|
||||
expect(layout.htmlAttrs()).toEqual({ lang: "en", dir: "ltr" });
|
||||
expect(createLayout("fa-IR", layout.localStorage.locale).htmlAttrs()).toEqual({
|
||||
lang: "en",
|
||||
dir: "ltr",
|
||||
});
|
||||
});
|
||||
|
||||
test("returning to the browser's English locale clears RTL direction", () => {
|
||||
const layout = createLayout("en-US", "fa");
|
||||
|
||||
layout.instance.changeLocale("en");
|
||||
|
||||
expect(layout.instance.$vuetify.rtl).toBe(false);
|
||||
expect(layout.htmlAttrs()).toEqual({ lang: "en", dir: "ltr" });
|
||||
});
|
||||
|
||||
test("uses a valid language tag for locales with an underscore", () => {
|
||||
const layout = createLayout("en-US", "pt_BR");
|
||||
|
||||
expect(layout.htmlAttrs()).toEqual({ lang: "pt-BR", dir: "ltr" });
|
||||
});
|
||||
|
||||
test.each([
|
||||
["browser preference", "nl-NL", undefined],
|
||||
["saved preference", "en-US", "nl"],
|
||||
])("uses the displayed fallback language for an unsupported %s", (_, browserLocale, savedLocale) => {
|
||||
const layout = createLayout(browserLocale, savedLocale);
|
||||
|
||||
expect(layout.instance.$vuetify.lang.current).toBe("en");
|
||||
expect(layout.instance.$vuetify.rtl).toBe(false);
|
||||
expect(layout.htmlAttrs()).toEqual({ lang: "en", dir: "ltr" });
|
||||
expect(layout.localStorage.locale).toBe(savedLocale);
|
||||
});
|
||||
+34
-36
@@ -1,10 +1,7 @@
|
||||
<template>
|
||||
<v-app dark>
|
||||
<!-- height = 4rem, margin-y = 1rem -->
|
||||
<v-app-bar
|
||||
app
|
||||
class="topBar glass elevation-0 fly-in-from-top my-4 mx-auto"
|
||||
>
|
||||
<v-app-bar app class="topBar glass elevation-0 fly-in-from-top my-4 mx-auto">
|
||||
<!-- Translator desktop -->
|
||||
<v-tabs centered center-active color="primary" router show-arrows>
|
||||
<v-tab v-for="link in links" :key="link.path" :to="link.path">
|
||||
@@ -14,10 +11,7 @@
|
||||
</v-app-bar>
|
||||
|
||||
<!-- abstract background -->
|
||||
<v-img
|
||||
src="/ui/abstract.svg"
|
||||
style="position: fixed; left: 0; right: 0; width: 100vw; height: 100vh"
|
||||
/>
|
||||
<v-img src="/ui/abstract.svg" style="position: fixed; left: 0; right: 0; width: 100vw; height: 100vh" />
|
||||
|
||||
<v-main style="padding-top: 4rem !important">
|
||||
<!-- min-height helps keep content centered, use .debug to to see it -->
|
||||
@@ -39,8 +33,8 @@
|
||||
class="d-flex flex-column"
|
||||
transition="slide-y-reverse-transition"
|
||||
>
|
||||
<template v-slot:activator="{ on, attrs }">
|
||||
<v-btn text fab class="glass" id="translator" v-bind="attrs" v-on="on">
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-btn id="translator" text fab class="glass" v-bind="attrs" v-on="on">
|
||||
<v-icon>mdi-translate</v-icon>
|
||||
</v-btn>
|
||||
</template>
|
||||
@@ -72,13 +66,7 @@
|
||||
<span class="my-auto" v-html="alert.html"></span>
|
||||
|
||||
<template #action="{ attrs }">
|
||||
<v-btn
|
||||
v-bind="attrs"
|
||||
color="primary"
|
||||
text
|
||||
icon
|
||||
@click="alert.show = false"
|
||||
>
|
||||
<v-btn v-bind="attrs" color="primary" text icon @click="alert.show = false">
|
||||
<v-icon>mdi-close-circle-outline</v-icon>
|
||||
</v-btn>
|
||||
</template>
|
||||
@@ -115,50 +103,62 @@ export default {
|
||||
{ name: "한국어", locale: "ko" },
|
||||
{ name: "Polski", locale: "pl" },
|
||||
{ name: "Bahasa Indonesia", locale: "id" },
|
||||
{ name: "Tiếng Việt", locale: "vi"},
|
||||
{ name: "Tiếng Việt", locale: "vi" },
|
||||
{ name: "Slovenščina", locale: "sl" },
|
||||
{ name: "Azərbaycanca", locale: "az" },
|
||||
{ name: "Italiano", locale: "it-IT" },
|
||||
{ name: "Nederlands", locale: "nl" },
|
||||
{ name: "Svenska", locale: "sv" },
|
||||
{ name: "Magyar", locale: "hu" },
|
||||
{ name: "فارسی", locale: "fa" },
|
||||
],
|
||||
alert: {
|
||||
show: false,
|
||||
html: "",
|
||||
},
|
||||
}),
|
||||
head() {
|
||||
const { current, locales, defaultLocale } = this.$vuetify.lang;
|
||||
const locale = locales[current] ? current : defaultLocale;
|
||||
return {
|
||||
htmlAttrs: {
|
||||
lang: locale.replace("_", "-"),
|
||||
dir: this.$vuetify.rtl ? "rtl" : "ltr",
|
||||
},
|
||||
};
|
||||
},
|
||||
created() {
|
||||
// fetch locale preference or browser default
|
||||
if (process.client) {
|
||||
this.$vuetify.lang.current = readLocalePreference(
|
||||
localStorage,
|
||||
navigator.language,
|
||||
Object.keys(this.$vuetify.lang.locales),
|
||||
);
|
||||
this.applyLocale(readLocalePreference(localStorage, navigator.language, Object.keys(this.$vuetify.lang.locales)));
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// Browser preferences can differ from the prerendered page's language.
|
||||
this.$nextTick(() => this.$meta().refresh());
|
||||
setTimeout(() => {
|
||||
// Chrome < 70 or FF < 60 unsupported warning popup
|
||||
if (
|
||||
(this.$ua._parsed.name == "Chrome" &&
|
||||
parseInt(this.$ua._parsed.version.split(".")[0]) < 70) ||
|
||||
(this.$ua._parsed.name == "Firefox" &&
|
||||
parseInt(this.$ua._parsed.version.split(".")[0]) < 60)
|
||||
(this.$ua._parsed.name == "Chrome" && parseInt(this.$ua._parsed.version.split(".")[0]) < 70) ||
|
||||
(this.$ua._parsed.name == "Firefox" && parseInt(this.$ua._parsed.version.split(".")[0]) < 60)
|
||||
) {
|
||||
this.alert.html = `<b style="background: #222; border-radius: .5rem; padding: .25rem .25rem .25rem .5rem; margin: 0 .25rem;">${this.$ua._parsed.name} ${this.$ua._parsed.version.split(".")[0]}</b> ${this.$vuetify.lang.t("$vuetify.layout.notSupported")} ${this.$vuetify.lang.t("$vuetify.layout.considerUpgrade")}`;
|
||||
this.alert.html = `<b style="background: #222; border-radius: .5rem; padding: .25rem .25rem .25rem .5rem; margin: 0 .25rem;">${
|
||||
this.$ua._parsed.name
|
||||
} ${this.$ua._parsed.version.split(".")[0]}</b> ${this.$vuetify.lang.t(
|
||||
"$vuetify.layout.notSupported"
|
||||
)} ${this.$vuetify.lang.t("$vuetify.layout.considerUpgrade")}`;
|
||||
this.alert.show = true;
|
||||
}
|
||||
}, 1000);
|
||||
},
|
||||
methods: {
|
||||
applyLocale(locale) {
|
||||
this.$vuetify.lang.current = locale;
|
||||
this.$vuetify.rtl = locale === "fa";
|
||||
},
|
||||
changeLocale(locale) {
|
||||
this.$vuetify.lang.current = writeLocalePreference(
|
||||
localStorage,
|
||||
navigator.language,
|
||||
locale,
|
||||
Object.keys(this.$vuetify.lang.locales),
|
||||
this.applyLocale(
|
||||
writeLocalePreference(localStorage, navigator.language, locale, Object.keys(this.$vuetify.lang.locales))
|
||||
);
|
||||
},
|
||||
},
|
||||
@@ -250,9 +250,7 @@ body {
|
||||
font-size: 2rem;
|
||||
}
|
||||
.topBar {
|
||||
width: calc(
|
||||
100vw - 2rem
|
||||
) !important; /* (2rem = mx-4) 1rem on left, 1rem on right */
|
||||
width: calc(100vw - 2rem) !important; /* (2rem = mx-4) 1rem on left, 1rem on right */
|
||||
padding: 0;
|
||||
}
|
||||
.flex-wrapper {
|
||||
|
||||
@@ -19,6 +19,7 @@ import itIT from "./_locales/it-IT";
|
||||
import nl from "./_locales/nl";
|
||||
import pt_BR from "./_locales/pt_BR";
|
||||
import sv from "./_locales/sv";
|
||||
import fa from "./_locales/fa";
|
||||
// ...
|
||||
export default {
|
||||
// Global page headers: https://go.nuxtjs.dev/config-head
|
||||
@@ -63,7 +64,7 @@ export default {
|
||||
// Vuetify module configuration: https://go.nuxtjs.dev/config-vuetify
|
||||
vuetify: {
|
||||
lang: {
|
||||
locales: { en, es, tr, ru, cs, ja, fr, uk, ko, pl, de, hu, id, vi, be, sl, az, "it-IT": itIT, nl, pt_BR, sv },
|
||||
locales: { en, es, tr, ru, cs, ja, fr, uk, ko, pl, de, hu, id, vi, be, sl, az, "it-IT": itIT, nl, pt_BR, sv, fa },
|
||||
current: "en",
|
||||
},
|
||||
theme: {
|
||||
|
||||
Generated
+20
-15
@@ -18,9 +18,9 @@
|
||||
"@nuxtjs/vuetify": "^1.12.3",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-loader": "^4.0.2",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"eslint-plugin-prettier": "^4.2.5",
|
||||
"eslint-plugin-vue": "^8.2.0",
|
||||
"prettier": "^2.5.1"
|
||||
}
|
||||
@@ -7171,13 +7171,17 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-config-prettier": {
|
||||
"version": "8.3.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
|
||||
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
|
||||
"version": "10.1.8",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
|
||||
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"bin": {
|
||||
"eslint-config-prettier": "bin/cli.js"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://opencollective.com/eslint-config-prettier"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": ">=7.0.0"
|
||||
}
|
||||
@@ -7250,15 +7254,16 @@
|
||||
}
|
||||
},
|
||||
"node_modules/eslint-plugin-prettier": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
|
||||
"integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
|
||||
"version": "4.2.5",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz",
|
||||
"integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==",
|
||||
"dev": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"prettier-linter-helpers": "^1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
"node": ">=12.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"eslint": ">=7.28.0",
|
||||
@@ -22874,9 +22879,9 @@
|
||||
}
|
||||
},
|
||||
"eslint-config-prettier": {
|
||||
"version": "8.3.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz",
|
||||
"integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==",
|
||||
"version": "10.1.8",
|
||||
"resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
|
||||
"integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
|
||||
"dev": true,
|
||||
"requires": {}
|
||||
},
|
||||
@@ -22933,9 +22938,9 @@
|
||||
}
|
||||
},
|
||||
"eslint-plugin-prettier": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz",
|
||||
"integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==",
|
||||
"version": "4.2.5",
|
||||
"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz",
|
||||
"integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"prettier-linter-helpers": "^1.0.0"
|
||||
|
||||
@@ -20,9 +20,9 @@
|
||||
"@nuxtjs/vuetify": "^1.12.3",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"eslint": "^7.32.0",
|
||||
"eslint-config-prettier": "^8.3.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"eslint-loader": "^4.0.2",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
"eslint-plugin-prettier": "^4.2.5",
|
||||
"eslint-plugin-vue": "^8.2.0",
|
||||
"prettier": "^2.5.1"
|
||||
}
|
||||
|
||||
+13
-3
@@ -6,7 +6,7 @@
|
||||
>
|
||||
<!-- docs navigation -->
|
||||
<v-list
|
||||
class="py-0 mr-3"
|
||||
class="py-0 me-3"
|
||||
style="
|
||||
background: transparent;
|
||||
position: sticky;
|
||||
@@ -23,7 +23,7 @@
|
||||
color="primary"
|
||||
style="overflow: hidden !important; border-radius: 0.75rem"
|
||||
>
|
||||
<v-list-item-title style="text-align: right">
|
||||
<v-list-item-title :class="$vuetify.rtl ? 'text-left' : 'text-right'">
|
||||
<v-list-item-title
|
||||
v-text="$vuetify.lang.t(`$vuetify.api.${link.name}.title`)"
|
||||
/>
|
||||
@@ -36,7 +36,8 @@
|
||||
|
||||
<!-- docs content -->
|
||||
<v-card
|
||||
class="text-left glass pa-6"
|
||||
class="docs-content glass pa-6"
|
||||
:class="$vuetify.rtl ? 'text-right' : 'text-left'"
|
||||
style="
|
||||
flex-grow: 2;
|
||||
height: max-content;
|
||||
@@ -89,3 +90,12 @@ export default {
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.docs-content .code,
|
||||
.docs-content a {
|
||||
direction: ltr;
|
||||
text-align: left;
|
||||
unicode-bidi: isolate;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -12,7 +12,9 @@
|
||||
<v-expansion-panel-header>
|
||||
{{ $vuetify.lang.t(`$vuetify.faq.bullet${i}`) }}
|
||||
</v-expansion-panel-header>
|
||||
<v-expansion-panel-content class="text-left">
|
||||
<v-expansion-panel-content
|
||||
:class="$vuetify.rtl ? 'text-right' : 'text-left'"
|
||||
>
|
||||
<hr style="border-color: #444" />
|
||||
<br />
|
||||
<span v-html="$vuetify.lang.t(`$vuetify.faq.bullet${i}text`)" />
|
||||
|
||||
+13
-8
@@ -3,10 +3,14 @@
|
||||
<h1 class="title-text pt-12">
|
||||
{{ $vuetify.lang.t("$vuetify.help.title") }}
|
||||
</h1>
|
||||
<ol style="line-height: 3rem; color: #aaa" class="text-left">
|
||||
<ol
|
||||
class="ps-6 pe-0"
|
||||
:class="$vuetify.rtl ? 'text-right' : 'text-left'"
|
||||
style="line-height: 3rem; color: #aaa"
|
||||
>
|
||||
<li>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet1") }}
|
||||
<code style="color: #eee">
|
||||
<code dir="ltr" style="color: #eee">
|
||||
<b>{{ version }}</b>
|
||||
</code>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet11") }}
|
||||
@@ -17,6 +21,7 @@
|
||||
<li>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet3") }}
|
||||
<a
|
||||
dir="ltr"
|
||||
class="px-2 py-1"
|
||||
style="background: #222; border-radius: 0.25rem"
|
||||
href="https://returnyoutubedislikeapi.com/votes?videoId=QOFEgexls14"
|
||||
@@ -26,7 +31,7 @@
|
||||
, <br />
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet31") }}
|
||||
<br />
|
||||
<span style="color: #eee">
|
||||
<span dir="ltr" style="color: #eee">
|
||||
{"id":"QOFEgexls14", "dateCreated":"2021-12-15T16:54:12.250813Z",
|
||||
"likes":2907, "dislikes":215, "rating":4.725641025641026,
|
||||
"viewCount":28222, "deleted":false}
|
||||
@@ -34,7 +39,7 @@
|
||||
</li>
|
||||
<li>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet4") }}
|
||||
<code>#bugs-and-problems</code>
|
||||
<code dir="ltr">#bugs-and-problems</code>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet41") }}
|
||||
<v-btn
|
||||
class="mainAltButton"
|
||||
@@ -51,7 +56,7 @@
|
||||
<v-icon size="1rem" style="margin-right: 0.5em">mdi-discord</v-icon>
|
||||
{{ $vuetify.lang.t("$vuetify.links.discord") }}
|
||||
</v-btn>
|
||||
<ol type="a">
|
||||
<ol class="ps-6 pe-0" type="a">
|
||||
<li>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet4a") }}
|
||||
<v-btn
|
||||
@@ -77,7 +82,7 @@
|
||||
|
||||
<li style="position: relative; width: 100%">
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet4b") }}
|
||||
<code>F12</code>
|
||||
<code dir="ltr">F12</code>
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet4b1") }}
|
||||
|
||||
<img
|
||||
@@ -94,10 +99,10 @@
|
||||
<br />
|
||||
{{ $vuetify.lang.t("$vuetify.help.bullet4c1") }}
|
||||
<br />
|
||||
<code>about:addons</code>
|
||||
<code dir="ltr">about:addons</code>
|
||||
{{ $vuetify.lang.t("$vuetify.help.firefox") }}
|
||||
<br />
|
||||
<code>chrome://extensions</code>
|
||||
<code dir="ltr">chrome://extensions</code>
|
||||
{{ $vuetify.lang.t("$vuetify.help.chrome") }}
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
Return YouTube Dislike gendanner muligheden for at se dislikes på YouTube.
|
||||
|
||||
Hvis det ikke virker: åbn fanen Udvidelser (chrome://extensions/), deaktiver denne udvidelse, og aktiver den igen. Det bør løse de fleste problemer, da der er en fejl i Chromium, som i nogle tilfælde får udvidelsen til at holde op med at virke. Forhåbentlig retter Chromium-teamet snart dette.
|
||||
|
||||
Fra og med den 13. december 2021 fjernede YouTube muligheden for at se dislikes via deres API.
|
||||
Denne udvidelse har til formål at give kontrollen tilbage til brugerne ved at bruge en kombination af arkiverede like- og dislike-data samt likes og dislikes fra udvidelsens brugere for at vise de mest præcise vurderinger.
|
||||
|
||||
Der er i øjeblikket gemt like- og dislike-data for over 200 millioner videoer fra før den 13. december 2021.
|
||||
|
||||
Databasen vokser aktivt og holdes opdateret med uploads efter den 13. december 2021.
|
||||
|
||||
Jo flere brugere der bruger udvidelsen, desto mere præcis bliver den.
|
||||
Mindre populære videoer, der er uploadet efter den 13. december 2021, kan vise mindre præcise data end mere populære videoer.
|
||||
|
||||
Denne udvidelse er i øjeblikket under aktiv udvikling. Hvis du oplever problemer, er du velkommen til at rapportere dem på vores GitHub-side eller i vores Discord-server.
|
||||
|
||||
Flere funktioner kommer snart!
|
||||
|
||||
https://github.com/Anarios/return-youtube-dislike
|
||||
@@ -0,0 +1,20 @@
|
||||
افزونه Return YouTube Dislike امکان مشاهده dislikeها را در YouTube بازمیگرداند.
|
||||
|
||||
اگر کار نمیکند: برگه Extensions را باز کنید (chrome://extensions/)، این افزونه را غیرفعال کرده و دوباره فعال کنید. این کار بیشتر مشکلات را برطرف میکند، چرا که باگی در Chromium وجود دارد که در برخی موارد افزونه را از کار میاندازد. امیدواریم تیم Chromium بهزودی این مشکل را رفع کند.
|
||||
|
||||
از تاریخ ۱۳ دسامبر ۲۰۲۱، YouTube امکان مشاهده dislikeها را از API خود حذف کرد.
|
||||
هدف این افزونه بازگرداندن این قابلیت به کاربران است؛ با استفاده از ترکیبی از دادههای آرشیو شده like و dislike و همچنین likeها و dislikeهای ثبتشده توسط کاربران افزونه تا دقیقترین امتیازها نمایش داده شوند.
|
||||
|
||||
در حال حاضر دارای دادههای like/dislike ذخیرهشده بیش از ۲۰۰ میلیون ویدیو قبل از ۱۳ دسامبر ۲۰۲۱ است.
|
||||
|
||||
بهطور فعال در حال رشد و بهروز نگهداشتن ویدیوهای بارگذاریشده پس از ۱۳ دسامبر ۲۰۲۱ است.
|
||||
|
||||
هرچه کاربران بیشتری از این افزونه استفاده کنند، دقیقتر خواهد بود.
|
||||
|
||||
ویدیوهای کمطرفدار بارگذاریشده پس از ۱۳ دسامبر ۲۰۲۱ ممکن است نسبت به ویدیوهای پرطرفدارتر، دادههای با دقت کمتری داشته باشند.
|
||||
|
||||
این افزونه در حال حاضر در فاز توسعه فعال قرار دارد، بنابراین اگر با هرگونه مشکلی مواجه شدید، در گزارش دادن آنها در صفحه GitHub یا سرور Discord ما تردید نکنید.
|
||||
|
||||
قابلیتهای بیشتر بهزودی!
|
||||
|
||||
https://github.com/Anarios/return-youtube-dislike
|
||||
Generated
+1679
-949
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -56,7 +56,7 @@
|
||||
"dependencies": {
|
||||
"@microsoft/signalr": "9.0.6",
|
||||
"country-code-lookup": "^0.1.3",
|
||||
"echarts": "^5.5.0",
|
||||
"echarts": "^6.0.0",
|
||||
"topojson-client": "^3.1.0",
|
||||
"us-atlas": "^3.0.0",
|
||||
"world-atlas": "^2.0.2"
|
||||
@@ -68,10 +68,10 @@
|
||||
"@playwright/test": "1.62.0",
|
||||
"babel-loader": "^10.0.0",
|
||||
"babel-plugin-rewire": "^1.2.0",
|
||||
"copy-webpack-plugin": "^11.0.0",
|
||||
"copy-webpack-plugin": "^13.0.1",
|
||||
"filemanager-webpack-plugin": "^9.0.1",
|
||||
"husky": "^9.1.7",
|
||||
"jest": "^28.1.3",
|
||||
"jest": "^30.2.0",
|
||||
"jest-environment-jsdom": "^30.0.4",
|
||||
"lint-staged": "^16.1.2",
|
||||
"prettier": "^3.2.2",
|
||||
|
||||
@@ -14,13 +14,14 @@ const expectedNodeVersion = "v22.17.0";
|
||||
const expectedNpmVersion = "10.8.2";
|
||||
const expectedExtensionVersion = "4.1.0";
|
||||
const expectedFirefoxExtensionId = "{762f9885-5a13-4abd-9c77-433dcd38b8fd}";
|
||||
const expectedRequiredDataCollectionPermissions = [
|
||||
const expectedRequiredDataCollectionPermissions = ["none"];
|
||||
const expectedOptionalDataCollectionPermissions = [
|
||||
"personallyIdentifyingInfo",
|
||||
"browsingActivity",
|
||||
"websiteContent",
|
||||
"websiteActivity",
|
||||
"authenticationInfo",
|
||||
];
|
||||
const expectedOptionalDataCollectionPermissions = ["authenticationInfo"];
|
||||
const npmCommand = process.platform === "win32" ? "npm.cmd" : "npm";
|
||||
const shouldUseShell = process.platform === "win32";
|
||||
|
||||
|
||||
@@ -141,6 +141,20 @@ module.exports = (env = {}, argv = {}) => {
|
||||
optimization: {
|
||||
minimize: false,
|
||||
},
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /messages\.json$/,
|
||||
include: path.resolve(__dirname, "Extensions/combined/_locales"),
|
||||
issuer: /[\\/]src[\\/]discussion[\\/]localize\.js$/,
|
||||
type: "json",
|
||||
parser: {
|
||||
parse: (source) =>
|
||||
Object.fromEntries(Object.entries(JSON.parse(source)).filter(([key]) => key.startsWith("discussion_"))),
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
watchOptions: {
|
||||
ignored: "**/dist/**",
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user