Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Anarios/return-youtube-dislike.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/bug.yml11
-rw-r--r--.github/ISSUE_TEMPLATE/feature-request.yml10
-rw-r--r--.github/workflows/commentCommands.yml54
-rw-r--r--Docs/FAQ.md32
-rw-r--r--Extensions/UserScript/Return Youtube Dislike.user.js71
-rw-r--r--Extensions/combined/_locales/tr/messages.json119
-rw-r--r--Extensions/combined/manifest-chrome.json6
-rw-r--r--Extensions/combined/popup.css61
-rw-r--r--Extensions/combined/popup.html18
-rw-r--r--Extensions/combined/popup.js47
-rw-r--r--Extensions/combined/ryd.background.js41
-rw-r--r--Extensions/combined/src/bar.js113
-rw-r--r--Extensions/combined/src/starRating.js101
-rw-r--r--Extensions/combined/src/state.js26
-rw-r--r--Extensions/combined/src/utils.js46
-rw-r--r--README.md1
-rw-r--r--READMEes.md96
-rw-r--r--READMEja.md99
-rw-r--r--READMEru.md97
-rw-r--r--READMEtr.md96
-rw-r--r--Website/_locales/en.ts5
-rw-r--r--Website/_locales/ja.ts101
-rw-r--r--Website/_locales/ru.ts14
-rw-r--r--Website/_locales/tr.ts115
-rw-r--r--Website/pages/links.vue30
-rw-r--r--extension-description-store-russian.txt4
-rw-r--r--extension-description-store-turkish.txt20
27 files changed, 1213 insertions, 221 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml
index 2bf949b..177632e 100644
--- a/.github/ISSUE_TEMPLATE/bug.yml
+++ b/.github/ISSUE_TEMPLATE/bug.yml
@@ -1,6 +1,6 @@
name: Bug Report
description: File a bug report!
-title: "(Bug): "
+# title: "(Bug): "
labels: ["bug"]
body:
- type: input
@@ -55,4 +55,13 @@ body:
value: "Tell us how it happened with detailed steps for us."
validations:
required: true
+- type: dropdown
+ attributes:
+ label: "Will you be available for follow-up questions to help developers diagnose & fix the issue?"
+ options:
+ - "Yes"
+ - "No"
+ validations:
+ required: true
+
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index b9a15d6..123d9d0 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -1,6 +1,6 @@
name: Feature Request
description: Request or suggest a new feature!
-title: "(Feature Request): "
+# title: "(Feature Request): "
labels: ["enhancement"]
body:
- type: dropdown
@@ -28,4 +28,12 @@ body:
options:
- label: "Yes"
- label: "No"
+- type: dropdown
+ attributes:
+ label: "Will you be available for follow-up questions to help developers implement this?"
+ options:
+ - "Yes"
+ - "No"
+ validations:
+ required: true
diff --git a/.github/workflows/commentCommands.yml b/.github/workflows/commentCommands.yml
new file mode 100644
index 0000000..fbf4aad
--- /dev/null
+++ b/.github/workflows/commentCommands.yml
@@ -0,0 +1,54 @@
+name: commentCommands
+
+on:
+ issue_comment:
+ types: created
+
+jobs:
+
+ assign-commenter:
+ runs-on: ubuntu-latest
+ if: |
+ contains(github.event.comment.body, '/assignme') ||
+ contains(github.event.comment.body, '/assign me')
+ steps:
+ - name: Assigning to commenter
+ run: |
+ curl \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/assignees \
+ -d '{"assignees":["${{ github.event.comment.user.login }}"]}'
+ request-issue-framing-improvement:
+ runs-on: ubuntu-latest
+ if: |
+ contains(github.event.comment.body,'/improve') && (
+ github.event.comment.author_association == 'OWNER' ||
+ github.event.comment.author_association == 'COLLABORATOR' ||
+ github.event.comment.author_association == 'CONTRIBUTOR' )
+ steps:
+ - name: request-issue-framing-improvement
+ run: |
+ curl \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/comments \
+ -d '{"body":"This issue is put on hold due to low quality. No reviews or fixes will be performed at this time. Eventually, it will be closed. While we appreciate your effort writing, we are not able to further investigate it. Please improve it by writing a better title or providing more details, and you may re-open it."}'
+ add-label-duplicate:
+ runs-on: ubuntu-latest
+ if: |
+ contains(github.event.comment.body, '/duplicate') && (
+ github.event.comment.author_association == 'OWNER' ||
+ github.event.comment.author_association == 'COLLABORATOR' ||
+ github.event.comment.author_association != 'CONTRIBUTOR' )
+ steps:
+ - name: add-label-duplicate
+ run: |
+ curl \
+ -X POST \
+ -H "Accept: application/vnd.github+json" \
+ -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
+ https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.issue.number }}/labels \
+ -d '{"labels":["duplicate"]}'
diff --git a/Docs/FAQ.md b/Docs/FAQ.md
index 02336f4..4a47957 100644
--- a/Docs/FAQ.md
+++ b/Docs/FAQ.md
@@ -1,21 +1,53 @@
# Frequently Asked Questions
## Before asking a question on GitHub or Discord, please refer to this.
+<br>
+
### **1. Where does this extension get the data?**
A Combination of Google APIs and scraped data.
We save all available data to our DB for it to be available after Google shuts down dislike counts in their API.
+<br>
+
### **2. Video dislike count doesn't update**
Right now video dislikes are cached, and aren't updated very frequenly. Once every 2-3 days, not more often.
Yeah, it's not ideal, but it is what it is. Working on improving how often we can update them.
+<br>
+
### **3. How does this work?**
The extension collects the video id of the video you are watching, fetches the dislike (and other fields like views, likes etc) using our API, if this is the first time the video was fetched by our API, it will use the YouTube API to get the data, then stores the data in a database for caching (cached for around 2-3 days) and archiving purposes and returns it to you. The extension then displays the dislikes to you.
+<br>
+
### **4. What will happen after the YouTube API stops returning the dislike count?**
The backend will switch to using a combination of archived dislike stats, estimates extrapolated from extension user data and estimates based on view/like ratios for videos whose dislikes weren't archived and for outdated dislike archives.
+<br>
+
+### **5. How is the dislike count calculated?**
+
+RYD uses the votes from it's users to extrapolate the dislike count.
+
+- If the video was uploaded after the API was shut down:
+
+ $$ \textup{RYD Dislike Count} = \left( \frac{\textup{RYD Users Like Count}}{\textup{RYD Users Dislike Count}} \right) \times \textup{Public Like Count} $$
+
+- If the RYD database somehow had the actual like and dislike count (provided by the uploader or from the archive), the dislike count will be calculated based on both - the users' votes and the archived value. The archived value will have less influence on the final count as it ages.
+
+<br>
+
+---
+
+This in video form
+
+[![IReturn YouTube Dislike Explained](https://yt-embed.herokuapp.com/embed?v=GSmmtv-0yYQ)](https://www.youtube.com/watch?v=GSmmtv-0yYQ)
+
+---
+
+<br>
+
## I have security / privacy concerns
See [this page](SECURITY-FAQ.md) for more info.
diff --git a/Extensions/UserScript/Return Youtube Dislike.user.js b/Extensions/UserScript/Return Youtube Dislike.user.js
index 5144d47..bbbbd45 100644
--- a/Extensions/UserScript/Return Youtube Dislike.user.js
+++ b/Extensions/UserScript/Return Youtube Dislike.user.js
@@ -33,6 +33,7 @@ const extConfig = {
colorTheme: "classic", // [classic*, accessible, neon] Color theme (red/green, blue/yellow, pink/cyan)
numberDisplayFormat: "compactShort", // [compactShort*, compactLong, standard] Number format (For non-English locale users, you may be able to improve appearance with a different option. Please file a feature request if your locale is not covered)
numberDisplayRoundDown: true, // [true*, false] Round down numbers (Show rounded down numbers)
+ tooltipPercentageMode: "none", // [none*, dash_like, dash_dislike, both, only_like, only_dislike] Mode of showing percentage in like/dislike bar tooltip.
numberDisplayReformatLikes: false, // [true, false*] Re-format like numbers (Make likes and dislikes format consistent)
// END USER OPTIONS
};
@@ -262,6 +263,32 @@ function createRateBar(likes, dislikes) {
const widthPercent =
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
+ var likePercentage = parseFloat(widthPercent.toFixed(1));
+ const dislikePercentage = (100 - likePercentage).toLocaleString();
+ likePercentage = likePercentage.toLocaleString();
+
+ var tooltipInnerHTML;
+ switch (extConfig.tooltipPercentageMode) {
+ case "dash_like":
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%`
+ break;
+ case "dash_dislike":
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%`
+ break;
+ case "both":
+ tooltipInnerHTML = `${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%`
+ break;
+ case "only_like":
+ tooltipInnerHTML = `${likePercentage}%`
+ break;
+ case "only_dislike":
+ tooltipInnerHTML = `${dislikePercentage}%`
+ break;
+ default:
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`
+ }
+
+
if (!rateBar && !isMobile) {
let colorLikeStyle = "";
let colorDislikeStyle = "";
@@ -269,7 +296,7 @@ function createRateBar(likes, dislikes) {
colorLikeStyle = "; background-color: " + getColorFromTheme(true);
colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
}
-
+
document.getElementById("menu-container").insertAdjacentHTML(
"beforeend",
`
@@ -286,7 +313,7 @@ function createRateBar(likes, dislikes) {
</div>
</div>
<tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
- <!--css-build:shady-->${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}
+ <!--css-build:shady-->${tooltipInnerHTML}
</tp-yt-paper-tooltip>
</div>
`
@@ -300,8 +327,8 @@ function createRateBar(likes, dislikes) {
document.querySelector(
"#ryd-dislike-tooltip > #tooltip"
- ).innerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`;
-
+ ).innerHTML = tooltipInnerHTML;
+
if (extConfig.coloredBar) {
document.getElementById("return-youtube-dislike-bar-container").style.backgroundColor =
getColorFromTheme(false);
@@ -446,32 +473,38 @@ function roundDown(num) {
}
function numberFormat(numberState) {
- let userLocales;
- try {
- userLocales = new URL(
- Array.from(document.querySelectorAll("head > link[rel='search']"))
- ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
- ?.getAttribute("href")
- )?.searchParams?.get("locale");
- } catch {
- userLocales = document.documentElement.lang;
- }
-
let numberDisplay;
if (extConfig.numberDisplayRoundDown === false) {
numberDisplay = numberState;
} else {
numberDisplay = roundDown(numberState);
}
- return getNumberFormatter(extConfig.numberDisplayFormat, userLocales).format(
+ return getNumberFormatter(extConfig.numberDisplayFormat).format(
numberDisplay
);
}
-function getNumberFormatter(optionSelect, userLocales) {
+function getNumberFormatter(optionSelect) {
+ let userLocales;
+ if (document.documentElement.lang) {
+ userLocales = document.documentElement.lang;
+ } else if (navigator.language) {
+ userLocales = navigator.language;
+ } else {
+ try {
+ userLocales = new URL(
+ Array.from(document.querySelectorAll("head > link[rel='search']"))
+ ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+ ?.getAttribute("href")
+ )?.searchParams?.get("locale");
+ } catch {
+ cLog('Cannot find browser locale. Use en as default for number formatting.');
+ userLocales = 'en';
+ }
+ }
+
let formatterNotation;
let formatterCompactDisplay;
-
switch (optionSelect) {
case "compactLong":
formatterNotation = "compact";
@@ -488,7 +521,7 @@ function getNumberFormatter(optionSelect, userLocales) {
}
const formatter = Intl.NumberFormat(
- document.documentElement.lang || userLocales || navigator.language,
+ userLocales,
{
notation: formatterNotation,
compactDisplay: formatterCompactDisplay,
diff --git a/Extensions/combined/_locales/tr/messages.json b/Extensions/combined/_locales/tr/messages.json
index 6510a28..d2b2f89 100644
--- a/Extensions/combined/_locales/tr/messages.json
+++ b/Extensions/combined/_locales/tr/messages.json
@@ -1,59 +1,62 @@
{
- "extensionName": {
- "message": "Return YouTube Dislike"
- },
- "extensionDesc": {
- "message": "Beğenmeme yeteneğini geri getir"
- },
- "textDeveloper": {
- "message": "Dmitry Selivanov ve Topluluk tarafından oluşturuldu"
- },
- "linkWebsite": {
- "message": "Web sitesi"
- },
- "linkFAQ": {
- "message": "SSS"
- },
- "linkDonate": {
- "message": "Bağış Yap"
- },
- "linkHelp": {
- "message": "Yardım"
- },
- "legendSettings": {
- "message": "Ayarlar"
- },
- "textSettings": {
- "message": "Beğenme/Beğenmeme talebini devre dışı bırak"
- },
- "textLikesDisabled": {
- "message": "Sahibi tarafından devre dışı bırakıldı"
- },
- "textSettingsHover": {
- "message": "Beğendiklerinizi ve beğenmediklerinizi saymayı durdurur."
- },
- "textTempUnavailable": {
- "message": "Geçici olarak devre dışı"
- },
- "textUpdate": {
- "message": "güncelle"
- },
- "version30installed": {
- "message": "3.0.0.1 versiyonu yüklendi"
- },
- "whatsnew": {
- "message": "Neler yeni"
- },
- "shortsSupport": {
- "message": "YouTube Shorts Desteği"
- },
- "customColors": {
- "message": "Beğenmeme çubuğu ve butonlar için özel renkler"
- },
- "customNumberFormats": {
- "message": "Özel sayı formatları"
- },
- "considerDonating": {
- "message": "Uzantının sürdürülmesini sağlayan tek şey bağışlarınızdır, lütfen projeyi desteklemeyi düşünün."
- }
-} \ No newline at end of file
+ "extensionName": {
+ "message": "YouTube Dislike Sayısını Geri Getir"
+ },
+ "extensionNameBeta": {
+ "message": "YouTube Dislike Sayısını Geri Getir Beta"
+ },
+ "extensionDesc": {
+ "message": "Dislike'ları görebilme yeteneği verir"
+ },
+ "textDeveloper": {
+ "message": "Dmitry Selivanov ve Topluluk tarafından"
+ },
+ "linkWebsite": {
+ "message": "Site"
+ },
+ "linkFAQ": {
+ "message": "SSS"
+ },
+ "linkDonate": {
+ "message": "Bağış Yap"
+ },
+ "linkHelp": {
+ "message": "Yardım"
+ },
+ "legendSettings": {
+ "message": "Ayarlar"
+ },
+ "textSettings": {
+ "message": "Like/dislike gönderimini devre dışı bırak"
+ },
+ "textLikesDisabled": {
+ "message": "sahibi tarafından devre dışı bırakıldı"
+ },
+ "textSettingsHover": {
+ "message": "Like'larınızı ve dislike'larınızı saymayı bırakır."
+ },
+ "textTempUnavailable": {
+ "message": "geçici olarak kullanım dışı"
+ },
+ "textUpdate": {
+ "message": "şu sürüme güncelle"
+ },
+ "version30installed": {
+ "message": "Sürüm 3.0.0.1 yüklendi"
+ },
+ "whatsnew": {
+ "message": "Yeni Ne Var"
+ },
+ "shortsSupport": {
+ "message": "YouTube Shorts Desteği"
+ },
+ "customColors": {
+ "message": "Dislike çubuğu ve düğmeler için özel renkler"
+ },
+ "customNumberFormats": {
+ "message": "Özel sayı biçimleri"
+ },
+ "considerDonating": {
+ "message": "Uzantının var olmasını sağlayan tek şey bağışlarınızdır, lütfen projeyi desteklemeyi düşünün."
+ }
+}
diff --git a/Extensions/combined/manifest-chrome.json b/Extensions/combined/manifest-chrome.json
index 2833433..82ea6ea 100644
--- a/Extensions/combined/manifest-chrome.json
+++ b/Extensions/combined/manifest-chrome.json
@@ -2,7 +2,7 @@
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDesc__",
"default_locale": "en",
- "version": "3.0.0.0",
+ "version": "3.0.0.1",
"manifest_version": 3,
"background": {
"service_worker": "ryd.background.js"
@@ -12,7 +12,9 @@
"128": "icons/icon128.png"
},
"host_permissions": ["*://*.youtube.com/*"],
- "permissions": ["storage"],
+ "permissions": [
+ "storage"
+ ],
"action": {
"default_popup": "popup.html"
},
diff --git a/Extensions/combined/popup.css b/Extensions/combined/popup.css
index dfe94cb..c317102 100644
--- a/Extensions/combined/popup.css
+++ b/Extensions/combined/popup.css
@@ -15,7 +15,8 @@ html,
body {
background-color: var(--background);
color: var(--white);
- min-width: 300px;
+ min-width: 310px;
+ min-height: 350px;
padding: 0.5em;
font-family: "Roboto", Arial, Helvetica, sans-serif;
font-size: 14px;
@@ -68,9 +69,11 @@ button:hover {
border-radius: 0.25rem;
}
-.switch:before {
+.switch:before, .label-with-hover-tip:before {
content: attr(data-hover);
visibility: hidden;
+ opacity: 0;
+ transition: visibility 0.1s linear, opacity 0.1s linear;
width: 250px;
background-color: var(--secondary);
border-radius: 0.5rem;
@@ -82,8 +85,26 @@ button:hover {
top: 160%;
}
-.switch:hover:before {
+.switch:hover:before, .label-with-hover-tip:hover:before {
visibility: visible;
+ opacity: 1;
+}
+
+.fade-in {
+ opacity: 1;
+ animation-name: fadeInOpacity;
+ animation-iteration-count: 1;
+ animation-timing-function: ease-in;
+ animation-duration: 2s;
+}
+
+@keyframes fadeInOpacity {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
}
#advancedToggle {
@@ -123,6 +144,32 @@ button:hover {
border: 2px solid var(--secondary);
border-radius: 0.5rem;
padding: 1rem;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+::-webkit-scrollbar {
+ width: 1rem;
+}
+
+::-webkit-scrollbar-track {
+ background: #111; /* color of the tracking area */
+}
+
+::-webkit-scrollbar-thumb {
+ background-color: #333; /* color of the scroll thumb */
+ border-radius: 1rem 0 0 1rem; /* roundness of the scroll thumb */
+ border-bottom: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-left: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-top: 0.25rem solid #111; /* creates padding around scroll thumb */
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background-color: #f22; /* color of the scroll thumb */
+ border-radius: 1rem 0 0 1rem; /* roundness of the scroll thumb */
+ border-bottom: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-left: 0.25rem solid #111; /* creates padding around scroll thumb */
+ border-top: 0.25rem solid #111; /* creates padding around scroll thumb */
}
#advancedLegend {
@@ -142,6 +189,14 @@ button:hover {
margin-bottom: 1rem;
}
+.label-with-hover-tip {
+ position: relative;
+ display: inline-block;
+ width: 80px;
+ height: 17px;
+ margin-bottom: 1rem;
+}
+
.switch:last-of-type {
margin-bottom: 0;
}
diff --git a/Extensions/combined/popup.html b/Extensions/combined/popup.html
index 83eecaf..3e9b9c0 100644
--- a/Extensions/combined/popup.html
+++ b/Extensions/combined/popup.html
@@ -137,7 +137,7 @@
</label>
<br/>
<div class="custom-select">
- <label for="color_theme">Color theme:</label>
+ <label for="color_theme" class="label-with-hover-tip" data-hover="">Color theme:</label>
<select name="color_theme" id="color_theme">
<option value="classic" id="color_theme_classic">Classic</option>
<option value="accessible" id="color_theme_accessible">
@@ -166,6 +166,22 @@
>&nbsp;</span
>
</div>
+ <br/>
+ <label class="switch" data-hover="Display percentage in like/dislike bar tooltip.">
+ <input type="checkbox" id="show_tooltip_percentage"/>
+ <span class="slider"/>
+ <span class="switchLabel">Percentage in like/dislike bar tooltip.</span>
+ </label>
+ <div class="custom-select">
+ <label for="tooltip_percentage_mode" data-hover="Use custom percentage display on hover.">Percent mode:</label>
+ <select name="tooltip_percentage_mode" id="tooltip_percentage_mode">
+ <option value="dash_like" id="tooltip_percentage_mode_dash_like">190&nbsp;/&nbsp;10&nbsp;&nbsp;-&nbsp;&nbsp;95%</option>
+ <option value="dash_dislike" id="tooltip_percentage_mode_dash_dislike">190&nbsp;/&nbsp;10&nbsp;&nbsp;-&nbsp;&nbsp;5%</option>
+ <option value="both" id="tooltip_percentage_mode_both">95%&nbsp;/&nbsp;5%</option>
+ <option value="only_like" id="tooltip_percentage_mode_only_like">95%</option>
+ <option value="only_dislike" id="tooltip_percentage_mode_only_dislike">5%</option>
+ </select>
+ </div>
</fieldset>
</body>
<script src="popup.js"></script>
diff --git a/Extensions/combined/popup.js b/Extensions/combined/popup.js
index 2fb0db7..a307a47 100644
--- a/Extensions/combined/popup.js
+++ b/Extensions/combined/popup.js
@@ -1,3 +1,5 @@
+import { cLog } from "./src/utils";
+
/* Config */
const config = {
advanced: false,
@@ -7,7 +9,9 @@ const config = {
colorTheme: "classic",
numberDisplayFormat: "compactShort",
numberDisplayRoundDown: true,
- numberDisplayReformatLikes: false,
+ showTooltipPercentage: false,
+ tooltipPercentageMode: "dash_like",
+ numberDisplayReformatLikes: false,
showAdvancedMessage:
'<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="currentColor"><rect fill="none" height="24" width="24"/><path d="M19.5,12c0-0.23-0.01-0.45-0.03-0.68l1.86-1.41c0.4-0.3,0.51-0.86,0.26-1.3l-1.87-3.23c-0.25-0.44-0.79-0.62-1.25-0.42 l-2.15,0.91c-0.37-0.26-0.76-0.49-1.17-0.68l-0.29-2.31C14.8,2.38,14.37,2,13.87,2h-3.73C9.63,2,9.2,2.38,9.14,2.88L8.85,5.19 c-0.41,0.19-0.8,0.42-1.17,0.68L5.53,4.96c-0.46-0.2-1-0.02-1.25,0.42L2.41,8.62c-0.25,0.44-0.14,0.99,0.26,1.3l1.86,1.41 C4.51,11.55,4.5,11.77,4.5,12s0.01,0.45,0.03,0.68l-1.86,1.41c-0.4,0.3-0.51,0.86-0.26,1.3l1.87,3.23c0.25,0.44,0.79,0.62,1.25,0.42 l2.15-0.91c0.37,0.26,0.76,0.49,1.17,0.68l0.29,2.31C9.2,21.62,9.63,22,10.13,22h3.73c0.5,0,0.93-0.38,0.99-0.88l0.29-2.31 c0.41-0.19,0.8-0.42,1.17-0.68l2.15,0.91c0.46,0.2,1,0.02,1.25-0.42l1.87-3.23c0.25-0.44,0.14-0.99-0.26-1.3l-1.86-1.41 C19.49,12.45,19.5,12.23,19.5,12z M12.04,15.5c-1.93,0-3.5-1.57-3.5-3.5s1.57-3.5,3.5-3.5s3.5,1.57,3.5,3.5S13.97,15.5,12.04,15.5z"/></svg>',
hideAdvancedMessage:
@@ -86,6 +90,14 @@ document.getElementById("number_format").addEventListener("change", (ev) => {
chrome.storage.sync.set({ numberDisplayFormat: ev.target.value });
});
+document.getElementById("show_tooltip_percentage").addEventListener("click", (ev) => {
+ chrome.storage.sync.set({ showTooltipPercentage: ev.target.checked });
+});
+
+document.getElementById("tooltip_percentage_mode").addEventListener("change", (ev) => {
+ chrome.storage.sync.set({ tooltipPercentageMode: ev.target.value });
+});
+
document.getElementById("number_reformat_likes").addEventListener("click", (ev) => {
chrome.storage.sync.set({ numberDisplayReformatLikes: ev.target.checked });
});
@@ -119,6 +131,8 @@ function initConfig() {
initializeColorTheme();
initializeNumberDisplayFormat();
initializeNumberDisplayRoundDown();
+ initializeTooltipPercentage();
+ initializeTooltipPercentageMode();
initializeNumberDisplayReformatLikes();
}
@@ -190,6 +204,18 @@ function initializeNumberDisplayRoundDown() {
});
}
+function initializeTooltipPercentage(){
+ chrome.storage.sync.get(["showTooltipPercentage"], (res) => {
+ handleShowTooltipPercentageChangeEvent(res.showTooltipPercentage);
+ });
+};
+
+function initializeTooltipPercentageMode() {
+ chrome.storage.sync.get(["tooltipPercentageMode"], (res) => {
+ handleTooltipPercentageModeChangeEvent(res.tooltipPercentageMode);
+ });
+};
+
function initializeNumberDisplayFormat() {
chrome.storage.sync.get(["numberDisplayFormat"], (res) => {
handleNumberDisplayFormatChangeEvent(res.numberDisplayFormat);
@@ -243,6 +269,9 @@ function storageChangeHandler(changes, area) {
if (changes.numberDisplayFormat !== undefined) {
handleNumberDisplayFormatChangeEvent(changes.numberDisplayFormat.newValue);
}
+ if (changes.showTooltipPercentage !== undefined) {
+ handleShowTooltipPercentageChangeEvent(changes.showTooltipPercentage.newValue);
+ }
if (changes.numberDisplayReformatLikes !== undefined) {
handleNumberDisplayReformatLikesChangeEvent(changes.numberDisplayReformatLikes.newValue);
}
@@ -293,6 +322,22 @@ function handleNumberDisplayFormatChangeEvent(value) {
.querySelector('option[value="' + value + '"]').selected = true;
}
+function handleShowTooltipPercentageChangeEvent(value) {
+ config.showTooltipPercentage = value;
+ document.getElementById("show_tooltip_percentage").checked = value;
+};
+
+function handleTooltipPercentageModeChangeEvent(value) {
+ if (!value) {
+ value = "dash_like";
+ }
+ config.tooltipPercentageMode = value;
+
+ document
+ .getElementById("tooltip_percentage_mode")
+ .querySelector('option[value="' + value + '"]').selected = true;
+};
+
function handleNumberDisplayReformatLikesChangeEvent(value) {
config.numberDisplayReformatLikes = value;
document.getElementById("number_reformat_likes").checked = value;
diff --git a/Extensions/combined/ryd.background.js b/Extensions/combined/ryd.background.js
index 75f22ae..b6b6b67 100644
--- a/Extensions/combined/ryd.background.js
+++ b/Extensions/combined/ryd.background.js
@@ -77,6 +77,8 @@ api.runtime.onInstalled.addListener((details) => {
if (
// No need to show changelog if its was a browser update (and not extension update)
details.reason === "browser_update" ||
+ // Chromium (e.g., Google Chrome Cannary) uses this name instead of the one above for some reason
+ details.reason === "chrome_update" ||
// No need to show changelog if developer just reloaded the extension
details.reason === "update"
)
@@ -277,6 +279,12 @@ function storageChangeHandler(changes, area) {
changes.numberDisplayReformatLikes.newValue
);
}
+ if (changes.showTooltipPercentage !== undefined) {
+ handleShowTooltipPercentageChangeEvent(changes.showTooltipPercentage.newValue);
+ }
+ if (changes.numberDisplayReformatLikes !== undefined) {
+ handleNumberDisplayReformatLikesChangeEvent(changes.numberDisplayReformatLikes.newValue);
+ }
}
function handleDisableVoteSubmissionChangeEvent(value) {
@@ -292,6 +300,17 @@ function handleNumberDisplayFormatChangeEvent(value) {
extConfig.numberDisplayFormat = value;
}
+function handleShowTooltipPercentageChangeEvent(value) {
+ extConfig.showTooltipPercentage = value;
+};
+
+function handleTooltipPercentageModeChangeEvent(value) {
+ if (!value) {
+ value = "dash_like";
+ }
+ extConfig.tooltipPercentageMode = value;
+};
+
function handleNumberDisplayRoundDownChangeEvent(value) {
extConfig.numberDisplayRoundDown = value;
}
@@ -333,6 +352,8 @@ function initExtConfig() {
initializeNumberDisplayFormat();
initializeNumberDisplayRoundDown();
initializeNumberDisplayReformatLikes();
+ initializeTooltipPercentage();
+ initializeTooltipPercentageMode();
}
function initializeDisableVoteSubmission() {
@@ -396,6 +417,26 @@ function initializeNumberDisplayFormat() {
});
}
+function initializeTooltipPercentage() {
+ api.storage.sync.get(["showTooltipPercentage"], (res) => {
+ if (res.showTooltipPercentage === undefined) {
+ api.storage.sync.set({ showTooltipPercentage: false });
+ } else {
+ extConfig.showTooltipPercentage = res.showTooltipPercentage;
+ }
+ });
+}
+
+function initializeTooltipPercentageMode() {
+ api.storage.sync.get(["tooltipPercentageMode"], (res) => {
+ if (res.tooltipPercentageMode === undefined) {
+ api.storage.sync.set({ tooltipPercentageMode: "dash_like" });
+ } else {
+ extConfig.tooltipPercentageMode = res.tooltipPercentageMode;
+ }
+ });
+}
+
function initializeNumberDisplayReformatLikes() {
api.storage.sync.get(["numberDisplayReformatLikes"], (res) => {
if (res.numberDisplayReformatLikes === undefined) {
diff --git a/Extensions/combined/src/bar.js b/Extensions/combined/src/bar.js
index c56ab57..6267ce6 100644
--- a/Extensions/combined/src/bar.js
+++ b/Extensions/combined/src/bar.js
@@ -1,5 +1,5 @@
import { getButtons } from "./buttons";
-import { extConfig, isMobile, isLikesDisabled } from "./state";
+import { extConfig, isMobile, isLikesDisabled, isShorts } from "./state";
import { cLog, getColorFromTheme } from "./utils";
function createRateBar(likes, dislikes) {
@@ -14,49 +14,78 @@ function createRateBar(likes, dislikes) {
const widthPercent =
likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
- if (!rateBar && !isMobile()) {
- let colorLikeStyle = "";
- let colorDislikeStyle = "";
- if (extConfig.coloredBar) {
- colorLikeStyle = "; background-color: " + getColorFromTheme(true);
- colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
- }
+ var likePercentage = parseFloat(widthPercent.toFixed(1));
+ const dislikePercentage = (100 - likePercentage).toLocaleString();
+ likePercentage = likePercentage.toLocaleString();
- (
- document.getElementById("menu-container") ||
- document.querySelector("ytm-slim-video-action-bar-renderer")
- ).insertAdjacentHTML(
- "beforeend",
- `
- <div class="ryd-tooltip" style="width: ${widthPx}px">
- <div class="ryd-tooltip-bar-container">
- <div
- id="ryd-bar-container"
- style="width: 100%; height: 2px;${colorDislikeStyle}"
- >
- <div
- id="ryd-bar"
- style="width: ${widthPercent}%; height: 100%${colorLikeStyle}"
- ></div>
- </div>
- </div>
- <tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
- <!--css-build:shady-->${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}
- </tp-yt-paper-tooltip>
- </div>
- `
- );
+ if (extConfig.showTooltipPercentage) {
+ var tooltipInnerHTML;
+ switch (extConfig.tooltipPercentageMode) {
+ case "dash_dislike":
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${dislikePercentage}%`
+ break;
+ case "both":
+ tooltipInnerHTML = `${likePercentage}%&nbsp;/&nbsp;${dislikePercentage}%`
+ break;
+ case "only_like":
+ tooltipInnerHTML = `${likePercentage}%`
+ break;
+ case "only_dislike":
+ tooltipInnerHTML = `${dislikePercentage}%`
+ break;
+ default: // dash_like
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}&nbsp;&nbsp;-&nbsp;&nbsp;${likePercentage}%`
+ }
} else {
- document.getElementById("ryd-bar-container").style.width = widthPx + "px";
- document.getElementById("ryd-bar").style.width = widthPercent + "%";
- document.querySelector(
- "#ryd-dislike-tooltip > #tooltip"
- ).innerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`;
- if (extConfig.coloredBar) {
- document.getElementById("ryd-bar-container").style.backgroundColor =
- getColorFromTheme(false);
- document.getElementById("ryd-bar").style.backgroundColor =
- getColorFromTheme(true);
+ tooltipInnerHTML = `${likes.toLocaleString()}&nbsp;/&nbsp;${dislikes.toLocaleString()}`
+ }
+
+
+ if (!isShorts()) {
+ if (!rateBar && !isMobile()) {
+ let colorLikeStyle = "";
+ let colorDislikeStyle = "";
+ if (extConfig.coloredBar) {
+ colorLikeStyle = "; background-color: " + getColorFromTheme(true);
+ colorDislikeStyle = "; background-color: " + getColorFromTheme(false);
+ }
+
+ (
+ document.getElementById("menu-container") ||
+ document.querySelector("ytm-slim-video-action-bar-renderer")
+ ).insertAdjacentHTML(
+ "beforeend",
+ `
+ <div class="ryd-tooltip" style="width: ${widthPx}px">
+ <div class="ryd-tooltip-bar-container">
+ <div
+ id="ryd-bar-container"
+ style="width: 100%; height: 2px;${colorDislikeStyle}"
+ >
+ <div
+ id="ryd-bar"
+ style="width: ${widthPercent}%; height: 100%${colorLikeStyle}"
+ ></div>
+ </div>
+ </div>
+ <tp-yt-paper-tooltip position="top" id="ryd-dislike-tooltip" class="style-scope ytd-sentiment-bar-renderer" role="tooltip" tabindex="-1">
+ <!--css-build:shady-->${tooltipInnerHTML}
+ </tp-yt-paper-tooltip>
+ </div>
+ `
+ );
+ } else {
+ document.getElementById("ryd-bar-container").style.width = widthPx + "px";
+ document.getElementById("ryd-bar").style.width = widthPercent + "%";
+ document.querySelector(
+ "#ryd-dislike-tooltip > #tooltip"
+ ).innerHTML = tooltipInnerHTML;
+ if (extConfig.coloredBar) {
+ document.getElementById("ryd-bar-container").style.backgroundColor =
+ getColorFromTheme(false);
+ document.getElementById("ryd-bar").style.backgroundColor =
+ getColorFromTheme(true);
+ }
}
}
} else {
diff --git a/Extensions/combined/src/starRating.js b/Extensions/combined/src/starRating.js
new file mode 100644
index 0000000..5d98814
--- /dev/null
+++ b/Extensions/combined/src/starRating.js
@@ -0,0 +1,101 @@
+import { cLog } from "./utils";
+
+function createStarRating(rating, isMobile) {
+ let starRating = document.createElement('label');
+
+ let starSlider = document.createElement("input");
+ starSlider.setAttribute("class", "rating");
+ starSlider.setAttribute("max", "5");
+ starSlider.setAttribute("readonly", "");
+ starSlider.setAttribute("style", `--fill:rgb(255, 215, 0);--value:${rating.toString()};};background-color: transparent;`);
+ starSlider.setAttribute("type", "range");
+
+ starRating.appendChild(starSlider);
+
+ let YTLikeButton;
+
+ if (isMobile){
+ YTLikeButton = document.querySelector('#app > div.page-container > ytm-watch > ytm-single-column-watch-next-results-renderer > ytm-slim-video-metadata-section-renderer > ytm-slim-video-action-bar-renderer > div > ytm-slim-metadata-toggle-button-renderer:nth-child(1)');
+ } else {
+ YTLikeButton = document.querySelector('#top-level-buttons-computed > ytd-toggle-button-renderer:nth-child(1)');
+ }
+
+ YTLikeButton.insertAdjacentElement('afterend', starRating);
+
+ try {
+ let YTBar = document.querySelector('#ryd-bar-container');
+ YTBar.setAttribute("style", "width: 190%; height: 2px;");
+ }
+ catch(err) {
+ cLog("RateBar Not Present");
+ }
+
+
+
+ let style = `<style>
+
+.rating {
+ --dir: right;
+ --fill: gold;
+ --fillbg: rgba(100, 100, 100, 0.15);
+ --star: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 17.25l-6.188 3.75 1.641-7.031-5.438-4.734 7.172-0.609 2.813-6.609 2.813 6.609 7.172 0.609-5.438 4.734 1.641 7.031z"/></svg>');
+ --stars: 5;
+ --starSize: 2.8rem;
+ --symbol: var(--star);
+ --value: 1;
+ --w: calc(var(--stars) * var(--starSize));
+ --x: calc(100% * (var(--value) / var(--stars)));
+ block-size: var(--starSize);
+ inline-size: var(--w);
+ position: relative;
+ touch-action: manipulation;
+ -webkit-appearance: none;
+}
+
+[dir="rtl"] .rating {
+ --dir: left;
+}
+
+.rating::-moz-range-track {
+ background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
+ block-size: 100%;
+ mask: repeat left center/var(--starSize) var(--symbol);
+}
+
+.rating::-webkit-slider-runnable-track {
+ background: linear-gradient(to var(--dir), var(--fill) 0 var(--x), var(--fillbg) 0 var(--x));
+ block-size: 100%;
+ mask: repeat left center/var(--starSize) var(--symbol);
+ -webkit-mask: repeat left center/var(--starSize) var(--symbol);
+}
+
+.rating::-moz-range-thumb {
+ height: var(--starSize);
+ opacity: 0;
+ width: var(--starSize);
+}
+
+.rating::-webkit-slider-thumb {
+ height: var(--starSize);
+ opacity: 0;
+ width: var(--starSize);
+ -webkit-appearance: none;
+}
+
+.rating,
+.rating-label {
+ display: block;
+ font-family: ui-sans-serif, system-ui, sans-serif;
+}
+
+.rating-label {
+ margin-block-end: 1rem;
+}
+
+</style>`;
+
+document.head.insertAdjacentHTML("beforeend", style);
+
+ }
+
+ export { createStarRating };
diff --git a/Extensions/combined/src/state.js b/Extensions/combined/src/state.js
index e20db49..52f68d4 100644
--- a/Extensions/combined/src/state.js
+++ b/Extensions/combined/src/state.js
@@ -8,6 +8,7 @@ import {
getColorFromTheme,
} from "./utils";
import { localize } from "./utils";
+import { createStarRating } from "./starRating";
//TODO: Do not duplicate here and in ryd.background.js
const apiUrl = "https://returnyoutubedislikeapi.com";
@@ -22,6 +23,8 @@ let extConfig = {
colorTheme: "classic",
numberDisplayFormat: "compactShort",
numberDisplayRoundDown: true,
+ showTooltipPercentage: false,
+ tooltipPercentageMode: "dash_like",
numberDisplayReformatLikes: false,
};
@@ -199,6 +202,7 @@ function processResponse(response, storedData) {
getDislikeButton().style.color = getColorFromTheme(false);
}
}
+ createStarRating(response.rating, isMobile());
}
// Tells the user if the API is down
@@ -252,6 +256,8 @@ function initExtConfig() {
initializeColorTheme();
initializeNumberDisplayFormat();
initializeNumberDisplayRoundDown();
+ initializeTooltipPercentage();
+ initializeTooltipPercentageMode();
initializeNumberDisplayReformatLikes();
}
@@ -315,6 +321,26 @@ function initializeNumberDisplayFormat() {
});
}
+function initializeTooltipPercentage() {
+ getBrowser().storage.sync.get(["showTooltipPercentage"], (res) => {
+ if (res.showTooltipPercentage === undefined) {
+ getBrowser().storage.sync.set({ showTooltipPercentage: false });
+ } else {
+ extConfig.showTooltipPercentage = res.showTooltipPercentage;
+ }
+ });
+}
+
+function initializeTooltipPercentageMode() {
+ getBrowser().storage.sync.get(["tooltipPercentageMode"], (res) => {
+ if (res.tooltipPercentageMode === undefined) {
+ getBrowser().storage.sync.set({ tooltipPercentageMode: "dash_like" });
+ } else {
+ extConfig.tooltipPercentageMode = res.tooltipPercentageMode;
+ }
+ });
+}
+
function initializeNumberDisplayReformatLikes() {
getBrowser().storage.sync.get(["numberDisplayReformatLikes"], (res) => {
if (res.numberDisplayReformatLikes === undefined) {
diff --git a/Extensions/combined/src/utils.js b/Extensions/combined/src/utils.js
index a3fe790..53a84d0 100644
--- a/Extensions/combined/src/utils.js
+++ b/Extensions/combined/src/utils.js
@@ -9,15 +9,6 @@ function roundDown(num) {
}
function numberFormat(numberState) {
- let userLocales;
- try {
- userLocales = new URL(
- Array.from(document.querySelectorAll("head > link[rel='search']"))
- ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
- ?.getAttribute("href")
- )?.searchParams?.get("locale");
- } catch {}
-
let numberDisplay;
if (extConfig.numberDisplayRoundDown === false) {
numberDisplay = numberState;
@@ -29,22 +20,27 @@ function numberFormat(numberState) {
);
}
-function localize(localeString) {
- return chrome.i18n.getMessage(localeString);
-}
-
function getNumberFormatter(optionSelect) {
- let formatterNotation;
- let formatterCompactDisplay;
let userLocales;
- try {
- userLocales = new URL(
- Array.from(document.querySelectorAll("head > link[rel='search']"))
- ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
- ?.getAttribute("href")
- )?.searchParams?.get("locale");
- } catch {}
+ if (document.documentElement.lang) {
+ userLocales = document.documentElement.lang;
+ } else if (navigator.language) {
+ userLocales = navigator.language;
+ } else {
+ try {
+ userLocales = new URL(
+ Array.from(document.querySelectorAll("head > link[rel='search']"))
+ ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+ ?.getAttribute("href")
+ )?.searchParams?.get("locale");
+ } catch {
+ cLog('Cannot find browser locale. Use en as default for number formatting.');
+ userLocales = 'en';
+ }
+ }
+ let formatterNotation;
+ let formatterCompactDisplay;
switch (optionSelect) {
case "compactLong":
formatterNotation = "compact";
@@ -61,7 +57,7 @@ function getNumberFormatter(optionSelect) {
}
const formatter = Intl.NumberFormat(
- document.documentElement.lang || userLocales || navigator.language,
+ userLocales,
{
notation: formatterNotation,
compactDisplay: formatterCompactDisplay,
@@ -70,6 +66,10 @@ function getNumberFormatter(optionSelect) {
return formatter;
}
+function localize(localeString) {
+ return chrome.i18n.getMessage(localeString);
+}
+
function getBrowser() {
if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined") {
return chrome;
diff --git a/README.md b/README.md
index 4f7e082..dba308d 100644
--- a/README.md
+++ b/README.md
@@ -7,6 +7,7 @@
[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
+Read this in other languages: [Español](READMEes.md), [русский](READMEru.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
# Return YouTube Dislike
diff --git a/READMEes.md b/READMEes.md
new file mode 100644
index 0000000..cb6a2ac
--- /dev/null
+++ b/READMEes.md
@@ -0,0 +1,96 @@
+[![Chrome Web Store](https://img.shields.io/chrome-web-store/stars/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Rating&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Chrome Web Store Users](https://img.shields.io/chrome-web-store/users/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Users&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Mozilla rating](https://img.shields.io/amo/stars/return-youtube-dislikes?label=Firefox%20Rating&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Mozilla downloads](https://img.shields.io/amo/users/return-youtube-dislikes?label=Firefox%20Users&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Commit rate](https://img.shields.io/github/commit-activity/m/Anarios/return-youtube-dislike?label=Commits&style=flat)](https://github.com/Anarios/return-youtube-dislike/commits/main)
+[![Issues](https://img.shields.io/github/issues/Anarios/return-youtube-dislike?style=flat&label=Issues)](https://github.com/Anarios/return-youtube-dislike/issues)
+[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
+[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
+
+Leer en otros idiomas: [English](README.md), [русский](READMEru.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
+
+# Return YouTube Dislike
+
+<p align="center">
+ <b>Return YouTube Dislike es una extensión de código abierto que regresa el contador de dislikes.</b><br>
+ Disponible para Chrome y Firefox cómo una extensión web.<br>
+ También disponible para otros navegadores cómo un Userscript de JS.<br><br>
+ <img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
+</p>
+
+## La historia
+
+El 10 de Noviembre de 2021, Google [anunció](https://blog.youtube/news-and-events/update-to-youtube/) que el contador de dislikes de YouTube sería eliminado.
+
+Adicionalmente, el campo de 'dislike' en la API de YouTube fue [eliminado](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) el 13 de Diciembre de 2021, acabando con la habilidad de juzgar la calidad del contenido antes de verlo.
+
+## Que hace
+
+Con la retirada de las estadísticas de dislikes de la API de YouTube, nuestro *backend* pasó a usar una combinación de las estadísticas de dislikes archivadas y datos extrapolados de los usuarios de la extensión.
+
+[FAQ](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
+
+## Por qué importa
+
+Puedes aprender más en nuestro sitio web en: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
+
+## Documentación de la API
+
+El uso de terceros de esta API abierta se permite bajo las siguientes restricciones:
+
+- **Atribución**: Este proyecto debe estar claramente atribuido con un link a [returnyoutubedislike.com](https://returnyoutubedislike.com/).
+- **Límites de velocidad**: Hay límites de velocidad por cliente de 100 por minuto y 10.000 por día. Excederlos retornará un código de estado *409* indicando que tu aplicación debe bajar la velocidad.
+
+La API es accesible sobre la siguiente URL base:
+https://returnyoutubedislikeapi.com
+
+La lista de los *endpoints* disponibles se puede consultar aquí:
+https://returnyoutubedislikeapi.com/swagger/index.html
+
+### Obtener votos
+Ejemplo para obtener los votos del ID de un vídeo de YouTube proporcionado:
+`/votes?videoId=kxOuG8jMIgI`
+
+```json
+{
+ "id": "kxOuG8jMIgI",
+ "dateCreated": "2021-12-20T12:25:54.418014Z",
+ "likes": 27326,
+ "dislikes": 498153,
+ "rating": 1.212014408444885,
+ "viewCount": 3149885,
+ "deleted": false
+}
+```
+
+
+Un ID de YouTube no existente retornará el codigo de estado *404* "Not Found" (no encontrado).
+Un ID de YouTube mal estructurado retornará *400* "Bad Request" (solicitud incorrecta).
+
+
+
+<!---
+## API documentation
+
+You can view all documentation on our website.
+[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
+
+
+## Contribuciones
+
+Por favor, lee la [guía de contribución](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
+
+## ¡Apoya este proyecto!
+
+Puedes apoyar este proyecto donándonos en el enlace inferior:
+
+[Donar](https://returnyoutubedislike.com/donate)
+
+## Patrocinadores
+[Piepacker](https://piepacker.com)
+
+[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
+
+[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
+
+[Hazte nuestro patrocionador](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
diff --git a/READMEja.md b/READMEja.md
new file mode 100644
index 0000000..f10b0fa
--- /dev/null
+++ b/READMEja.md
@@ -0,0 +1,99 @@
+[![Chrome Web Store](https://img.shields.io/chrome-web-store/stars/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Rating&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Chrome Web Store Users](https://img.shields.io/chrome-web-store/users/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Users&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Mozilla rating](https://img.shields.io/amo/stars/return-youtube-dislikes?label=Firefox%20Rating&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Mozilla downloads](https://img.shields.io/amo/users/return-youtube-dislikes?label=Firefox%20Users&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Commit rate](https://img.shields.io/github/commit-activity/m/Anarios/return-youtube-dislike?label=Commits&style=flat)](https://github.com/Anarios/return-youtube-dislike/commits/main)
+[![Issues](https://img.shields.io/github/issues/Anarios/return-youtube-dislike?style=flat&label=Issues)](https://github.com/Anarios/return-youtube-dislike/issues)
+[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
+[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
+
+別の言語: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [Türkçe](READMEtr.md)
+
+# Return YouTube Dislike
+
+<p align="center">
+ <b>Return YouTube DislikeはYouTubeの低評価を表示するためのオープンソースな拡張機能です。</b><br>
+ ChromeとFireFoxで拡張機能を利用可能です。<br>
+ また、他のブラウザでもJS Userscriptを利用できます。<br><br>
+ <img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
+</p>
+
+## これまでの経緯
+
+2021年10月10日、GoogleはYouTubeの低評価を非表示にすると[発表しました](https://blog.youtube/news-and-events/update-to-youtube/)。
+
+そして2021年12月13日、YouTube APIからも低評価が[削除]((https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts))され、動画のクオリティを判断する手段がなくなってしまいました。
+
+## What it Does
+
+<!-- この部分の翻訳が微妙? -->
+
+YouTube APIから低評価が削除されたことにより、バックエンドは拡張機能のユーザーをもとにスクレイピングされたデータと組み合わせて表示するように切り替わりました
+
+[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/) へのリンクを明確に表記してください。
+- **レート制限**: クライアントごとに1分あたり100回、1日あたり10000回という制限があります。制限に達すると*429*コードが返されます。
+
+APIは以下のBase URLでアクセスできます:
+https://returnyoutubedislikeapi.com
+
+利用可能なエンドポイントはこちらを参照してください:
+https://returnyoutubedislikeapi.com/swagger/index.html
+
+### 評価を取得
+APIを利用してYouTube video IDから評価を取得する例です:
+`/votes?videoId=kxOuG8jMIgI`
+
+```json
+{
+ "id": "kxOuG8jMIgI",
+ "dateCreated": "2021-12-20T12:25:54.418014Z",
+ "likes": 27326,
+ "dislikes": 498153,
+ "rating": 1.212014408444885,
+ "viewCount": 3149885,
+ "deleted": false
+}
+```
+
+
+存在しないYouTube IDの場合 *404* "Not Found" が返されます。
+不正なフォーマットのYouTube IDの場合 *400* "Bad Request"が返されます。
+
+
+
+<!---
+## API ドキュメント
+
+APIの完全なドキュメントは公式サイトを参照してください。
+[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
+
+
+## 貢献する
+
+こちらの[contribution guide](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md)を読んでください。
+
+## プロジェクトを支援!
+
+以下のリンクに寄付をしてこのプロジェクトを支援できます:
+
+[寄付](https://returnyoutubedislike.com/donate)
+
+## スポンサー
+[Piepacker](https://piepacker.com)
+
+[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
+
+[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
+
+[Become our sponsor](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
+
diff --git a/READMEru.md b/READMEru.md
new file mode 100644
index 0000000..2325060
--- /dev/null
+++ b/READMEru.md
@@ -0,0 +1,97 @@
+[![Chrome Web Store](https://img.shields.io/chrome-web-store/stars/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Rating&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Chrome Web Store Users](https://img.shields.io/chrome-web-store/users/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Users&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Mozilla rating](https://img.shields.io/amo/stars/return-youtube-dislikes?label=Firefox%20Rating&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Mozilla downloads](https://img.shields.io/amo/users/return-youtube-dislikes?label=Firefox%20Users&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Commit rate](https://img.shields.io/github/commit-activity/m/Anarios/return-youtube-dislike?label=Commits&style=flat)](https://github.com/Anarios/return-youtube-dislike/commits/main)
+[![Issues](https://img.shields.io/github/issues/Anarios/return-youtube-dislike?style=flat&label=Issues)](https://github.com/Anarios/return-youtube-dislike/issues)
+[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
+[![License](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
+
+Прочитать на других языках: [English](README.md), [Español](READMEes.md), [日本語](READMEja.md), [Türkçe](READMEtr.md)
+
+# Return YouTube Dislike
+
+<p align="center">
+ <b>Return YouTube Dislike - это расширение с открытым исходным кодом, которое возвращает счётчик отметок «Не нравится» на YouTube.</b><br>
+ Доступно для Chrome и Firefox в качестве веб-расширения.<br>
+ Также доступен для других браузеров в виде пользовательского скрипта JS.<br><br>
+ <img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
+</p>
+
+## История
+
+10 ноября 2021 года Google [объявили](https://blog.youtube/news-and-events/update-to-youtube/), что счётчик «Не нравится» на YouTube будет удален.
+
+Кроме того, поле отметок `«Не нравится»` в API YouTube было [удалено]](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) 13 декабря 2021 года, удалив любую возможность судить о качестве контента перед просмотром.
+
+## Как оно работает
+
+С удалением статистики отметок из API YouTube наш сервер переключился на использование комбинации собранной статистики отметок «Не нравится», оценок, экстраполированных из пользовательских данных расширения.
+
+[ЧаВО (англ.)](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/).
+- **Ограничение**: Существуют ограничения скорости для каждого клиента вместо 100 в минуту и 10 000 в день. Это выдаст код ошибки *429*, указывающий на то, что ваше приложение должно быть отключено.
+
+API доступен по следующему основному URL-адресу:
+https://returnyoutubedislikeapi.com
+
+Список доступных эндпоинтов доступен здесь:
+https://returnyoutubedislikeapi.com/swagger/index.html
+
+### Получить голоса
+Пример получения голосов за заданный идентификатор видео на YouTube:
+`/votes?videoId=kxOuG8jMIgI`
+
+```json
+{
+ "id": "kxOuG8jMIgI",
+ "dateCreated": "2021-12-20T12:25:54.418014Z",
+ "likes": 27326,
+ "dislikes": 498153,
+ "rating": 1.212014408444885,
+ "viewCount": 3149885,
+ "deleted": false
+}
+```
+
+
+Ни один существующий идентификатор YouTube не выдаст код ошибки *404* "Не найдено".
+Неправильно сформированный идентификатор YouTube выдаст *400* "Неверный запрос".
+
+
+
+<!---
+## Документация по API
+
+Вы можете просмотреть всю документацию на нашем веб-сайте.
+[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
+
+
+## Участие/помощь в разработке
+
+Пожалуйста, ознакомьтесь с [руководством по внесению вклада в проект (англ.)](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md).
+
+## Поддержите этот проект!
+
+Вы можете поддержать этот проект, сделав нам пожертвование по ссылке ниже:
+
+[Пожертвование](https://returnyoutubedislike.com/donate)
+
+## Спонсоры
+[Piepacker](https://piepacker.com)
+
+[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
+
+[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
+
+[Станьте нашим спонсором](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
+
diff --git a/READMEtr.md b/READMEtr.md
new file mode 100644
index 0000000..9d370e5
--- /dev/null
+++ b/READMEtr.md
@@ -0,0 +1,96 @@
+[![Chrome Web Mağazası](https://img.shields.io/chrome-web-store/stars/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Rating&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Chrome Web Mağazası Kullanıcıları](https://img.shields.io/chrome-web-store/users/gebbhagfogifgggkldgodflihgfeippi?label=Chrome%20Users&style=flat&logo=google)](https://chrome.google.com/webstore/detail/youtube-dislike-button/gebbhagfogifgggkldgodflihgfeippi/)
+[![Mozilla oylaması](https://img.shields.io/amo/stars/return-youtube-dislikes?label=Firefox%20Rating&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Mozilla indirmeleri](https://img.shields.io/amo/users/return-youtube-dislikes?label=Firefox%20Users&style=flat&logo=firefox)](https://addons.mozilla.org/en-US/firefox/addon/return-youtube-dislikes/)
+[![Commit sayısı](https://img.shields.io/github/commit-activity/m/Anarios/return-youtube-dislike?label=Commits&style=flat)](https://github.com/Anarios/return-youtube-dislike/commits/main)
+[![Issue'ler](https://img.shields.io/github/issues/Anarios/return-youtube-dislike?style=flat&label=Issues)](https://github.com/Anarios/return-youtube-dislike/issues)
+[![Discord](https://img.shields.io/discord/909435648170160229?label=Discord&style=flat&logo=discord)](https://discord.gg/UMxyMmCgfF)
+[![Lisans](https://img.shields.io/badge/License-GPLv3-blue.svg?style=flat)](https://github.com/Anarios/return-youtube-dislike/blob/main/LICENSE)
+
+Bunu diğer dillerde okuyun: [English](README.md), [Español](READMEes.md), [русский](READMEru.md), [日本語](READMEja.md)
+
+# YouTube Dislike Sayısını Geri Getir
+
+<p align="center">
+ <b>YouTube Dislike Sayısını Geri Getir, YouTube'daki dislike sayısını gösteren açık-kaynaklı bir uzantıdır.</b><br>
+ Chrome ve Firefox'da bir Web Uzantısı olarak mevcuttur.<br>
+ Ayrıca diğer tarayıcılar için JS Userscript olarak da mevcuttur.<br><br>
+ <img width="400px" src="https://user-images.githubusercontent.com/18729296/141743755-2be73297-250e-4cd1-ac93-8978c5a39d10.png"/>
+</p>
+
+## Hikâyesi
+
+10 Kasım 2021 tarihinde Google, YouTube dislike sayısının kaldırılacağını [duyurdu](https://blog.youtube/news-and-events/update-to-youtube/).
+
+Ek olarak, YouTube API'sindeki "dislike" alanı 13 Aralık 2021 tarihinde [kaldırıldı](https://support.google.com/youtube/thread/134791097/update-to-youtube-dislike-counts) ve içeriğin kalitesini izlemeden önce yargılayabilme olanağı ortadan kaldırıldı.
+
+## Ne İşe Yarar
+
+YouTube API'sinden dislike istatistiklerinin kaldırılmasıyla, backend'imiz, uzantı kullanıcı verilerinden tahmin edilen, toplanmış dislike istatistiklerinin bir birleşimini kullanmaya başladı.
+
+[SSS](https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/FAQ.md)
+
+## Neden Önemlidir
+
+Sitemizden daha fazla bilgi edinebilirsiniz: [returnyoutubedislike.com](https://www.returnyoutubedislike.com/)
+
+## API Belgelemesi
+
+Bu açık API'nin üçüncü taraflarca kullanımına, aşağıdaki kısıtlamalarla izin verilir:
+
+- **Atfetme**: Bu proje, açık bir biçimde [returnyoutubedislike.com](https://returnyoutubedislike.com/) adresine yönlendirilmelidir.
+- **Hız Sınırlaması**: Kullanıcı başına dakikada 100 ve günde 10.000 hız sınırlaması vardır. Bu, uygulamanızın geri çekilmesi gerektiğini belirten 429 durum kodunu döndürür
+
+API'ye aşağıdaki temel URL üzerinden erişilebilir:
+https://returnyoutubedislikeapi.com
+
+Kullanılabilir endpoint'lerin listesi burada mevcuttur:
+https://returnyoutubedislikeapi.com/swagger/index.html
+
+### Oylamaları Elde Etme
+Belirli bir YouTube video ID'sinin oylamalarını elde etmek için bir örnek:
+`/votes?videoId=kxOuG8jMIgI`
+
+```json
+{
+ "id": "kxOuG8jMIgI",
+ "dateCreated": "2021-12-20T12:25:54.418014Z",
+ "likes": 27326,
+ "dislikes": 498153,
+ "rating": 1.212014408444885,
+ "viewCount": 3149885,
+ "deleted": false
+}
+```
+
+
+Hiçbir mevcut YouTube ID'si *404* "Not Found" durum kodunu döndürmez.
+Yanlış oluşturulmuş bir YouTube ID'si *400* "Bad Request" durum kodunu döndürür.
+
+
+
+<!---
+## API Belgelemesi
+
+Tüm belgelemeleri sitemizden inceleyebilirsiniz.
+[https://returnyoutubedislike.com/documentation/](https://returnyoutubedislike.com/documentation/) -->
+
+
+## Katkıda Bulunma
+
+Lütfen [katkı kılavuzu](https://github.com/Anarios/return-youtube-dislike/blob/main/CONTRIBUTING.md)nu okuyun.
+
+## Bu Projeyi Destekle!
+
+Aşağıdaki bağlantıdan bize bağış yapabilir ve bu projeye destek olabilirsiniz:
+
+[Bağış Yapın](https://returnyoutubedislike.com/donate)
+
+## Sponsorlar
+[Piepacker](https://piepacker.com)
+
+[Seed4.Me VPN](https://www.seed4.me/users/register?gift=ReturnYoutubeDislike)
+
+[PocketTube](https://yousub.info/?utm_source=returnyoutubedislike)
+
+[Sponsorumuz olun](https://www.patreon.com/join/returnyoutubedislike/checkout?rid=8008601)
diff --git a/Website/_locales/en.ts b/Website/_locales/en.ts
index 8e211ae..bbe39db 100644
--- a/Website/_locales/en.ts
+++ b/Website/_locales/en.ts
@@ -97,5 +97,8 @@ export default {
subtitle: 'Links to the project and its developers',
contact: 'Contact Me',
translators: 'Translators',
+ coolProjects: 'Cool Projects',
+ sponsorBlockDescription: 'Skips ads integrated in video',
+ filmotDescription: 'Search YouTube videos by subtitles'
},
-} \ No newline at end of file
+}
diff --git a/Website/_locales/ja.ts b/Website/_locales/ja.ts
new file mode 100644
index 0000000..d68c606
--- /dev/null
+++ b/Website/_locales/ja.ts
@@ -0,0 +1,101 @@
+import { en } from 'vuetify/src/locale'
+
+export default {
+ ...ja,
+ home: {
+ name: 'z[',
+ title: 'Return YouTube Dislike',
+ subtitle: 'YouTube̒]̕\𕜌uEUg@\API',
+ ukraine: 'ENCiT|[g',
+ sponsors: 'X|T[',
+ },
+ install: {
+ name: 'CXg[',
+ title: 'vbgtH[̑I',
+ subtitle: 'FirefoxƂׂĂChromiumuEUɑΉĂ܂B',
+ title2: '̑̃vbgtH[',
+ subtitle2: 'Ή̃uEUg̏ꍇ́AȉUserScriptB',
+ title3: 'T[hp[eB[ɂ',
+ subtitle3: 'J҂ł͐ӔC𕉂˂܂̂ŁAg̔fɂĂpB',
+ },
+ api: {
+ name: 'API',
+ title: 'RYDhLgւ悤!',
+ subtitle: '܂Aj[ZNVIĂB,
+ rights: {
+ title: 'gp',
+ subtitle: '̃I[vAPIO҂gp邱Ƃ́Aȉ̐tŋ‚Ă܂F',
+ bullet1: 'F',
+ bullet1text: '̃|A returnyoutubedislike.com ւ̃N̂ǂ炩ɂāAmɋAKv܂B',
+ bullet2: 'ʐMʐF',
+ bullet2text: 'NCAgƂɁA1100E110,000ƂʐMʐ݂Ă܂B𒴂ꍇɂ́AAvP[VɒʐMT悤Xe[^XR[h 429 Ԃ܂B',
+ },
+ url: {
+ title: 'URL',
+ subtitle: 'APIւ̃ANZX́Aȉ̃x[XURL”\łF',
+ },
+ endpoints: {
+ title: 'p”\ȃGh|Cg',
+ subtitle: 'p”\ȃGh|Cg̈ꗗ͂ł܂F',
+ },
+ fetching: {
+ title: '{IȃtFb`̃`[gA',
+ subtitle: 'ȉYouTube ID]oꍇ̗łF',
+ title2: 'NGXgF',
+ url: 'NGXgURLF',
+ method: 'NGXg@F',
+ headers: 'wb_[F',
+ response: 'X|XF',
+ error1: 'YouTube IDȏꍇAXe[^XR[h 404 "Not Found" Ԃ܂B',
+ error2: 'YouTube ID̃tH[}bgȂꍇAXe[^XR[h 400 "Bad Request" Ԃ܂B'
+ },
+ },
+ help: {
+ name: 'wv',
+ title: 'guV[eBO',
+ bullet1: 'ŐVo[W̊g@\',
+ bullet11: 'CXg[Ă邱ƂmFĂB',
+ bullet2: 'g@\폜čăCXg[AׂẴEBhE‚ŃuEUċNĂB',
+ bullet3: 'ȉ̃NJƂmFĂF',
+ bullet31: 'ȉ̃v[eLXg\܂F',
+ bullet4: 'LŖ肪ȂꍇAȉ̃`lɂĖ񍐂ĂB',
+ bullet41: 'QƁF',
+ bullet4a: 'gOSAuEUƃo[WĂB',
+ bullet4b: 'R\[Ji',
+ bullet4b1: 'L[jÂy[WiFYouTube̓y[Wj̃XN[VbgBe܂B',
+ bullet4c: 'g@\CXg[ĂuEŮg@\y[W̃XN[VbgBe܂B',
+ bullet4c1: 'g@\y[W\ɂ́Aȉ̂悤ɓ͂ĂF',
+ firefox: 'FFirefox',
+ chrome: 'FChrome, Edge, Brave, Opera, Vivaldi',
+ },
+ faq: {
+ name: 'Q&A',
+ title: '悭鎿',
+ subtitle: 'ɂ₪܂HXDiscordɂCyɂQB',
+ bullet1: 'g@\̃f[^͂ǂ擾Ă̂łH',
+ bullet1text: 'YouTube̒]API~Oɕۑf[^ƁAg@\[U[̍]/]ɂlgݍ킹Ď擾Ă܂B',
+ bullet2: ']XVȂ̂͂ȂłH',
+ bullet2text: '݁A]̓f[^x[XĂ邽߁A܂pɂɍXV܂B̍ĐɂĈقȂ܂AXVɂ͐Ԃ琔邱Ƃ܂B',
+ bullet3: 'ǂ̂悤Ȏdg݂œ삵Ă܂H',
+ bullet3text: '܂A̓ID WAAPI gpĒ]AĐA]Ȃǂ̍ڂ擾܂BɁAy[Wɒ]Ɣ䗦\܂Bɍ]]ƁAꂪL^ăf[^x[Xɒ~ς邽߁AmȒ]𐄒肷邱Ƃł܂B',
+ bullet4: ']L邱Ƃ͂ł܂H',
+ bullet4text: 'ߓɌJ\łB@\̎̂߂ɁAOauth ܂͔͈͂肵ʂ̓ǂݎpAPIgp邱ƂĂ܂B',
+ bullet5: 'ǂ̂悤ȃf[^WAǂ̂悤Ɏ舵Ă܂H',
+ bullet5text: '{g@\ł́AIPAhX⎋Ă铮IDȂǁA@\邽߂ɕKvȃf[^݂̂WĂ܂BȂ̃f[^́AO҂ɔ̔邱Ƃ͌Ă܂BZLeBƃvCoV[̎舵ɂ‚Ăƒm肽ꍇɂ́A <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">ZLeBFAQ</a> QƂB ',
+ bullet6: 'API/obNGh͂ǂ̂悤Ȏdg݂œ삵Ă܂H',
+ bullet6text: 'obNGh́AYouTube̒]API~Oɕۑf[^Ɗg@\[U[̍]/]ɂlgݍ킹Ď擾Ă܂B߂ARec҂ȒPˆSɒ]񋟂ł悤ɂAArchive Team ̃A[JCuf[^i456000j݂̃f[^x[Xɒlj\łB܂ÃgsbNɊւrfI܂B',
+ bullet7: ']Ɂue҂ɂ薳vƕ\̂͂ȂłH',
+ bullet7text: 'ŋߓeꂽł́Ae҂ɂĖɂĂȂĂue҂ɂ薳vƕ\邱Ƃ܂B́A]̕\ɂȂĂ邩ǂoVXeɂ镛pŁAԌA܂͓ɍ]Ȃ]ăy[WXVƏ̂Ǝv܂B',
+ },
+ donate: {
+ name: 't',
+ subtitle: 'C^[lbg̎R邽߂̉X̊AtɂĉĂI',
+ },
+ links: {
+ name: 'N',
+ title: 'vWFNgNW',
+ subtitle: 'vWFNgъJ҂ւ̃N',
+ contact: '₢킹',
+ translators: '|',
+ },
+} \ No newline at end of file
diff --git a/Website/_locales/ru.ts b/Website/_locales/ru.ts
index c4985b9..e4a0601 100644
--- a/Website/_locales/ru.ts
+++ b/Website/_locales/ru.ts
@@ -11,11 +11,11 @@ export default {
},
install: {
name: 'Скачать',
- title: 'Выберите Свою Платформу',
+ title: 'Выберите свою платформу',
subtitle: 'Доступно в Firefox и во всех Chromium браузерах',
- title2: 'Другие Платформы',
+ title2: 'Другие платформы',
subtitle2: 'Если ваш браузер еще не поддерживается, попробуйте этот пользовательский скрипт',
- title3: 'От Других Разработчиков',
+ title3: 'От других разработчиков',
subtitle3: 'Никакой ответственности с нашей стороны, используйте на свой страх и риск',
},
api: {
@@ -89,13 +89,15 @@ export default {
},
donate: {
name: 'Пожертвовать',
- subtitle: 'Вы можете поддержать наши усилия по обеспечению бесплатного Интернета пожертвованием!',
+ subtitle: 'Вы можете поддержать пожертвованием наши усилия по обеспечению свободного Интернета!',
},
links: {
name: 'Ссылки',
- title: 'Ссылки Проекта',
+ title: 'Ссылки',
subtitle: 'Ссылки на проект и его разработчиков',
contact: 'Связаться',
translators: 'Переводчики',
+ sponsorBlockDescription: 'Проматывает рекламу встроенную в видео',
+ filmotDescription: 'Поиск по субтитрам YouTube'
},
-} \ No newline at end of file
+}
diff --git a/Website/_locales/tr.ts b/Website/_locales/tr.ts
index 8615175..f064e10 100644
--- a/Website/_locales/tr.ts
+++ b/Website/_locales/tr.ts
@@ -1,101 +1,104 @@
-import { tr } from 'vuetify/src/locale'
-// By Batuhan Kara
+import { tr } from 'vuetify/src/locale'
+// By Batuhan Kara & İlyas Zan
export default {
...tr,
home: {
name: 'Ana Sayfa',
- title: 'YouTube Beğenmeme Sayısını Gör',
- subtitle: 'YouTube\'da beğenmeme sayılarını gösteren tarayıcı uzantısı ve API',
+ title: 'YouTube Dislike Sayısını Geri Getir',
+ subtitle: 'Tarayıcı uzantısı ve bir API, YouTube\'daki dislike sayınızı geri getirir',
ukraine: 'Ukrayna\'ya Destek Ol',
sponsors: 'Sponsorlar',
},
install: {
name: 'Yükle',
title: 'Platformunuzu Seçin',
- subtitle: 'Firefox ve bütün Chromium tarayıcılarda kullanılabilir',
+ subtitle: 'Firefox ve bütün Chromium tabanlı tarayıcılarda kullanılabilir',
title2: 'Diğer Platformlar',
- subtitle2: 'Tarayıcınız henüz desteklenmiyorsa, UserScript yöntemini deneyin',
- title3: 'Üçüncü Parti Uygulamaları',
+ subtitle2: 'Tarayıcınız henüz desteklenmiyorsa UserScript yöntemini deneyin',
+ title3: 'Üçüncü Parti Uygulamalar',
subtitle3: 'Riski tamamen size aittir, bizim tarafımızda sorumluluk kabul edilmemektedir',
},
api: {
name: 'API',
- title: 'Resmi RYD belgelerine hoş geldiniz!',
- subtitle: 'Başlamak için, menüden bir bölüm seçin.',
+ title: 'Resmî RYD belgelerine hoş geldiniz!',
+ subtitle: 'Başlamak için menüden bir bölüm seçin.',
rights: {
title: 'Kullanım Hakları',
- subtitle: 'Herkese açık API\'nin üçüncü parti kişilerin kullanımında aşağıdaki kısıtlamalara izin verir: ',
+ subtitle: 'Herkese açık API\'nin üçüncü parti kişilerin kullanımında aşağıdaki kısıtlamalara izin verir:',
bullet1: 'Atıf: ',
- bullet1text: 'TBu proje bu depo(repo)\'ya bir bağlantı ile ya da returnyoutubedislike.com\'a bağlantı olarak açıkça ilişkilendirilmelidir',
- bullet2: 'Oranı Sınırlama',
- bullet2text: 'Dakikada 100 ve günde 10.000 müşteri başına oranı sınırlama vardır. Uygulamınızın geri çekmesi gerektiğini belirten bir 429 durum kodu döndürür.',
+ bullet1text: 'Bu proje, bu depoya ya da returnyoutubedislike.com sitesine bir bağlantı ile açıkça atfedilmelidir',
+ bullet2: 'Hız Sınırlaması: ',
+ bullet2text: 'Kullanıcı başına dakikada 100 ve günde 10.000 hız sınırlaması vardır. Bu, uygulamanızın geri çekilmesi gerektiğini belirten 429 durum kodunu döndürür',
},
url: {
title: 'URL Bilgisi',
- subtitle: 'API\'ye bu URL üzerinden ulaşılabilir: ',
+ subtitle: 'API\'ye şu URL üzerinden ulaşılabilir: ',
},
endpoints: {
title: 'Kullanılabilir Endpoint\'ler',
- subtitle: 'Kullanılabilir endpointlerin listesi burada mevcuttur: ',
+ subtitle: 'Kullanılabilir endpoint\'lerin listesi burada mevcuttur: ',
},
fetching: {
- title: 'Temel Fetching Öğretici',
- subtitle: 'Belirli bir YouTube ID kimliğinin oylarını almak için örnek: ',
+ title: 'Temel Veri Alma Eğitimi',
+ subtitle: 'Belirli bir YouTube ID\'sinin oylamalarını elde etmek için bir örnek: ',
title2: 'Örnek İstek: ',
- url: 'İstek URL: ',
+ url: 'İstek URL\'si: ',
method: 'İstek Yöntemi: ',
- headers: 'Başlık: ',
+ headers: 'Header\'lar: ',
response: 'Sonuç: ',
- error1: 'Geçersiz bir YouTube ID kimliği 404 "Bulunamadı" olarak döner.',
- error2: 'Yanlış biçimlendirilmeş bir YouTube ID kimliği 400 "Geçersiz İstek" olarak döner.'
+ error1: 'Geçersiz bir YouTube ID\'si, 404 "Not Found" olarak döndürülür',
+ error2: 'Yanlış biçimlendirilmiş bir YouTube ID\'si, 400 "Bad Request" olarak döndürülür'
},
},
help: {
name: 'Yardım',
- title: 'Sorunu Giderin',
- bullet1: 'Uzantının en son sürümünün kurulu olduğundan emin olun, şu anki sürüm ',
- bullet11: '',
- bullet2: 'Uzantıyı kaldırp yeniden yüklemeyi deneyin, sonra tarayıcınızı yeniden başlatın(tüm aktif sekmeler, sadece tek sekme değil).',
- bullet3: 'Bu bağlantıyı açtığınızdan emin olun: ',
- bullet31: 'şöyle düz metin göreceksiniz: ',
- bullet4: 'Yukarıdakiler yardımcı olmadıysa, ',
- bullet41: ' kanalında raporu bildirin',
- bullet4a: 'Bize İşletim sistemini, tarayıcı adını ve tarayıcı sürümünü söyleyin',
- bullet4b: 'Konsol açıkken (F12',
- bullet4b1: '\'ye basın) sorunu yaşadığınız sayfanın ekran görüntüsünü alın (yani YouTube izleme sayfası) - Ekran görüntüsü örneği aşağıdadır.',
+ title: 'Sorun Giderme',
+ bullet1: 'Uzantının en son sürümü olan ',
+ bullet11: ' sürümünün kurulu olduğundan emin olun',
+ bullet2: 'Uzantıyı kaldırıp yeniden yüklemeyi deneyin, sonra tarayıcınızı yeniden başlatın (tüm aktif sekmeleri kapatın, sadece tek bir sekmeyi değil)',
+ bullet3: 'Şu bağlantıyı açtığınızdan emin olun: ',
+ bullet31: 'şöyle bir düz metin görmelisiniz: ',
+ bullet4: 'Yukarıdakiler yardımcı olmadıysa - Discord sunucumuzdaki ',
+ bullet41: ' kanalından problemi bildirin (İngilizce bir şekilde) Discord sunucumuz: ',
+ bullet4a: 'Bize İşletim Sisteminizi, Tarayıcı Adınızı ve Tarayıcı Sürümünüzü söyleyin',
+ bullet4b: 'Konsol açıkken (açmak için ',
+ bullet4b1: ' tuşuna basın) sorunu yaşadığınız sayfanın ekran görüntüsünü alın (yani YouTube watch sayfasının) - Ekran görüntüsü örneği aşağıdadır.',
bullet4c: 'Uzantı yüklüyken tarayıcınızın uzantılar sayfasının ekran görüntüsünü alın.',
- bullet4c1: 'Uzantıları görmek için bunu adres çubuğuna kopyalayın: ',
- firefox: 'Firefox için',
- chrome: 'Chrome, Edge, Brave, Opera ve Vivaldi için',
+ bullet4c1: 'Uzantıları görmek için şu linki adres çubuğuna yapıştırın: ',
+ firefox: '(Firefox için)',
+ chrome: '(Chrome, Edge, Brave, Opera ve Vivaldi için)',
},
faq: {
name: 'SSS',
title: 'Sıkça Sorulan Sorular',
- subtitle: 'Hala sorularınız mı var? Discordumuza katılmaktan çekinmeyin!',
- bullet1: 'Uzantı verilerini nereden alıyor?',
- bullet1text: 'Resmi YouTube beğenmeme sayısı API\'si kapatılmadan önceki arşivlenmiş verilerden ve uzantının kullanıcının davranışlarıyla tahmin eder.',
- bullet2: 'Beğenmeme sayısı neden güncellenmiyor?',
- bullet2text: 'Şu anda beğenmeme durumları önbelleğe alınır ve çok sık güncellenmez. Bir videonun popülerliğine göre değişir ancak güncellenmesi birkaç saat ile birkaç gün arasında sürebilir.',
- bullet3: 'Nasıl Çalışır?',
- bullet3text: 'Uzantı izlediğiniz videonun kimliğini toplar, API\'mizi kullanarak beğenmediğinizi (ve görüntülenme, beğeni vb.) getirir. Uzantı daha sonra sayfada beğenmeme sayısını ve oranını görüntüler. Bir videoyu beğenirseniz veya beğenmezseniz kaydedilir ve veri tabanına gönderilir, böylece doğru beğenmeme sayısını tahmin edebilir.',
- bullet4: 'Beğenmeme sayımı sizinle paylaşabilirmiyim?',
- bullet4text: 'Çok yakında. İçerik üreticilerin beğenmeme sayıları doğrulanabilirliğini paylaşabilmeleri için Oauth ya da sınırlı kapsamda farklı salt okunur API kullanmayı düşünüyoruz.',
+ subtitle: 'Hâlâ sorun mu yaşıyorsunuz? Discord sunucumuza katılmaktan çekinmeyin! (İngilizce)',
+ bullet1: 'Uzantı, verileri nereden alıyor?',
+ bullet1text: 'Resmî YouTube dislike sayısı API\'si kapatılmadan önceki arşivlenmiş verilerden ve tahmin edilen uzantı kullanıcısı davranışının bir birleşimiyle.',
+ bullet2: 'Dislike sayısı neden güncellenmiyor?',
+ bullet2text: 'Şu anda dislike durumları önbelleğe alınır ve çok sık güncellenmez. Bir videonun popülerliğine bağlı olarak değişir ancak güncellenmesi birkaç saat ilâ birkaç gün sürebilir.',
+ bullet3: 'Bu nasıl çalışıyor?',
+ bullet3text: 'Uzantı, izlediğiniz videonun ID\'sini alır, API\'miz üzerinden dislike sayılarınızı geri getirir (aynı zamanda görüntülenmenizi, like\'ınızı vb. diğer alanları da). Uzantı daha sonra sayfada dislike sayısını ve oranını görüntüler. Bir videoya like veya dislike atarsanız bu kaydedilir ve veri tabanına gönderilir, böylece doğru dislike sayısını tahmin edebilir.',
+ bullet4: 'Dislike sayımı sizinle paylaşabilir miyim?',
+ bullet4text: 'Çok yakında evet. İçerik üreticilerinin dislike sayıları için doğrulanabilirliğini paylaşabilmeleri amacıyla Oauth ya da sınırlı bir kapsamda farklı bir salt okunur API kullanmayı düşünüyoruz.',
bullet5: 'Hangi verileri topluyorsunuz ve bunlar nasıl işleniyor?',
- bullet5text: 'Uzantı yalnızca izlediğiniz videonun IP adresi veya videonun ID\'si gibi düzgün çalışması için, kesinlikle gerekli olan verileri toplar. Verileriniz asla 3. şahıslara satılmayacaktır. Güvenliği ve gizliliği nasıl ele aldığımız hakkında daha fazla bilgi için <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ</a> adresine gidin.',
- bullet6: 'API/Arka uç(Backend) nasıl çalışıyor?',
- bullet6text: 'Arka uç(backend) YouTube API\'nin beğenmeme sayısını ve uzantı kullanıcılarının beğenme/beğenmeme sayısı sonuçların genişletilmesinin döndürmeye devam ettiği zamana ait arşivlenmiş verileri kullanır. Yakın zamanda içerik üreticilerin beğenmeme sayısını kolay ve güvenli bir şekilde göndermelerine izin vereceğiz ve ArchiveTeam\'in arşivlenmiş verilerini (4.56 milyar video) veritabanımıza ekleyeceğiz. Konu ile ilgili videoyu izleyebilirsiniz.',
- bullet7: 'Beğenmeme sayısı neden \'DISLIKES DISABLED\' olarak gözüküyor',
- bullet7text: 'Bazen yakın zamanda yüklenen bir videoda, içerik üreticisi onu devre dışı bırakmamış olsa bile \'DISLIKES DISABLED\' olarak gözükebilir. Bunun nedeni, beğenmeme sayısını devre dışı bırakıp bırakmadığını tespit etmemizdir. Birkaç saat içinde videoyu beğenerek ya da beğenmeyerek veya sayfayı yenileyerek(umarım) kaybolması gerekir.',
+ bullet5text: 'Uzantı, yalnızca izlediğiniz videonun IP adresi veya videonun ID\'si gibi düzgün çalışması için kesinlikle gerekli olan verileri toplar. Verileriniz asla 3. taraflara satılmayacaktır. Güvenliği ve gizliliği nasıl ele aldığımız hakkında daha fazla bilgi için <a href="https://github.com/Anarios/return-youtube-dislike/blob/main/Docs/SECURITY-FAQ.md">security FAQ</a>\'ya gidin.',
+ bullet6: 'API/Yazılım(Backend) nasıl çalışıyor?',
+ bullet6text: 'Yazılım, YouTube API\'sinin dislike sayısını ve uzantı kullanıcılarının like/dislike sayısı sonuçların genişletilmesinin döndürmeye devam ettiği zamana ait arşivlenmiş verileri kullanır. Yakın zamanda içerik üreticilerin dislike sayısını kolay ve güvenli bir şekilde göndermelerine izin vereceğiz ve ArchiveTeam\'in arşivlenmiş verilerini (4,56 milyar video) veri tabanımıza ekleyeceğiz. Ayrıca konu ile ilgili videoyu da izleyebilirsiniz.',
+ bullet7: 'Dislike sayısı neden \'DISLIKES DISABLED\'(DISLIKE\'LAR AKTİF DEĞİL) olarak gözüküyor?',
+ bullet7text: 'Yazma sırasında like ve dislike sayısını devre dışı bırakan videoların dislike sayılarını göstermiyoruz. Uzantı, bu videolar için \'DISLIKES DISABLED\'(DISLIKE\'LAR AKTİF DEĞİL) mesajını görüntüler. Yakında tüm videolarda dislike sayısını göstereceğiz. Bu, yalnızca geçici bir çözümdür. Bu nedenle insanlar uzantının bozuk olduğunu düşünmez (zaten iyi çalışmıyor). Bazen yakın zamanda yüklenen bir videoda, içerik üreticisi onu devre dışı bırakmamış olsa bile \'DISLIKES DISABLED\' olarak gözükebilir. Bunun nedeni, dislike sayısını devre dışı bırakıp bırakmadığını tespit etmemizdir. Birkaç saat içinde videoyu like ya da dislike atarsanız veya sayfayı yenilerseniz kaybolması gerekir (umarız).',
},
donate: {
- name: 'Bağış yap',
- subtitle: 'İnterneti özgür bırakma çabalarımızla bize bir bağışla destekleyebilirsiniz!',
+ name: 'Bağış Yap',
+ subtitle: 'İnterneti özgür bırakma çabamızda bize bağışınızla destek olabilirsiniz!',
},
links: {
name: 'Bağlantılar',
- title: 'Projeler için Bağlantılar',
- subtitle: 'Proje ve geliştiriciler için bağlantılar',
- contact: 'Bana Ulaş',
- translators: 'Çevirenler',
+ title: 'Proje Bağlantıları',
+ subtitle: 'Projeye ve geliştiricilerine bağlantılar',
+ contact: 'Bana Ulaşın',
+ translators: 'Çevirmenler',
+ coolProjects: 'Hoş Projeler',
+ sponsorBlockDescription: 'Videolara gömülü reklamları pas geçer',
+ filmotDescription: 'YouTube videolarını alt yazılara göre aramanızı sağlar'
},
-} \ No newline at end of file
+}
diff --git a/Website/pages/links.vue b/Website/pages/links.vue
index c13f59c..3fbe465 100644
--- a/Website/pages/links.vue
+++ b/Website/pages/links.vue
@@ -22,10 +22,8 @@
{{ $vuetify.lang.t("$vuetify.links.contact") }}
</h1>
- <v-btn class="mainAltButton" :href="emailLink" target="_blank">
- <v-icon style="margin-right: 0.5em">mdi-email</v-icon>
- selivano.d@gmail.com
- </v-btn>
+ <v-icon style="margin-right: 0.5em">mdi-email</v-icon>
+ selivano.d@gmail.com
<p style="color: #555" class="my-8">
Site by <v-icon color="#555">mdi-discord</v-icon>
@@ -39,7 +37,7 @@
</a>
</p>
<!-- Translators -->
- <div style="color: #555; width: 250px">
+ <div style="color: #555; width: 250px" class="my-8">
<b class="white--text">
{{ $vuetify.lang.t("$vuetify.links.translators") }}
</b>
@@ -52,6 +50,20 @@
{{ translator.lang }} - <v-spacer /> {{ translator.tag }}
</div>
</div>
+ <!-- Cool Projects -->
+ <div style="color: #555; width: 400px">
+ <b class="white--text">
+ {{ $vuetify.lang.t("$vuetify.links.coolProjects") }}
+ </b>
+ <br />
+ <div
+ v-for="project in coolProjects"
+ :key="project.url"
+ class="d-flex justify-center"
+ >
+ <a class="attr-link" :href="project.url" target="_blank">{{ project.name }} - {{ $vuetify.lang.t(project.description) }} </a>
+ </div>
+ </div>
</div>
</template>
@@ -80,10 +92,18 @@ export default {
lang: "Türkçe",
},
{
+ tag: "iLBAn#7421",
+ lang: "Türkçe",
+ },
+ {
tag: "PickleNik#0864",
lang: "Русский",
},
],
+ coolProjects: [
+ { name: "SponsorBlock", url: "https://sponsor.ajay.app/", description: "$vuetify.links.sponsorBlockDescription" },
+ { name: "Filmot", url: "https://filmot.com/", description: "$vuetify.links.filmotDescription" }
+ ],
}),
};
</script>
diff --git a/extension-description-store-russian.txt b/extension-description-store-russian.txt
index ec36a92..aece271 100644
--- a/extension-description-store-russian.txt
+++ b/extension-description-store-russian.txt
@@ -1,4 +1,4 @@
-Return YouTube Dislike восстанавливает возвращает возможность видеть отметки «Не нравится» на YouTube.
+Return YouTube Dislike восстанавливает возможность видеть отметки «Не нравится» на YouTube.
Если не работает: откройте вкладку расширений (chrome://extensions/), отключите это расширение и включите его снова. Это ошибка в chromium, которая в некоторых случаях приводит к сбою расширения. Это должно устранить большинство проблем. Надеюсь, команда chromium скоро исправит это
@@ -17,4 +17,4 @@ Return YouTube Dislike восстанавливает возвращает во
Больше возможностей появится в ближайшее время!
-https://github.com/Anarios/return-youtube-dislike \ No newline at end of file
+https://github.com/Anarios/return-youtube-dislike
diff --git a/extension-description-store-turkish.txt b/extension-description-store-turkish.txt
new file mode 100644
index 0000000..067eece
--- /dev/null
+++ b/extension-description-store-turkish.txt
@@ -0,0 +1,20 @@
+YouTube Dislike Sayısını Geri Getir, YouTube'da dislike durumlarını görme özelliğini geri getirir.
+
+Eğer çalışmazsa: uzantılar sekmesini açın (chrome://extensions/) bu uzantıyı devre dışı bırakın ve yeniden aktifleştirin. Bu, chromium'daki bazı durumlarda uzantıyı bozan bir hatadır. Bu, sorunların çoğunu çözmelidir. Umarız chromium ekibi bunu yakın zamanda düzeltir.
+
+13 Aralık 2021 tarihinden itibaren YouTube, API'lerinden dislike'ları görme özelliğini kaldırdı.
+Bu uzantı, önceden arşivlenmiş like ve dislike verilerinin bir birleşiminin yanı sıra, uzantı kullanıcıları tarafından en doğru derecelendirmeleri göstermek için yapılan like ve dislike'ların bir birleşimini kullanarak kullanıcılara gücü geri kazandırmayı amaçlar.
+
+Şu anda 13 Aralık 2021 tarihinden önce depolanmış tamı tamına 200 milyondan fazla videonun like/dislike verisi mevcut durumda
+
+13 Aralık 2021 tarihinden sonra ise yapılan yüklemelerle aktif olarak büyüyor ve güncel kalmaya devam ediyor
+
+Uzantıyı ne kadar çok kullanıcı kullanırsa, veriler de o kadar doğru olur.
+
+13 Aralık 2021 tarihinden sonra yüklenen ama popüler olmayan videolar, daha popüler videolara nazaran daha az doğru verilere sahip olabilir.
+
+Bu uzantı şu anda aktif bir geliştirme aşamasındadır, bu nedenle herhangi bir sorun yaşarsanız, bunları GitHub sayfamızda veya Discord sunucumuzda bildirmekten çekinmeyin.
+
+Daha fazla özellik yakında geliyor!
+
+https://github.com/Anarios/return-youtube-dislike