mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-24 16:38:47 +03:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
28cddf92d5 | ||
|
|
465a6dde9b | ||
|
|
5336399365 | ||
|
|
3f69b19e23 | ||
|
|
23103f1274 | ||
|
|
9bfaf98dda | ||
|
|
f21be82cce | ||
|
|
39155fdf99 | ||
|
|
1676e50e15 | ||
|
|
f165b3b602 | ||
|
|
0f82c16940 | ||
|
|
9ef3ef03a4 | ||
|
|
ef17cae9a1 | ||
|
|
05acb1669e | ||
|
|
0850421afb | ||
|
|
edf06ac908 | ||
|
|
842d35235a | ||
|
|
45d20574d9 | ||
|
|
252da8c56a | ||
|
|
99373c3e55 | ||
|
|
dce69b3642 | ||
|
|
bb670b93e9 | ||
|
|
c011ad105d | ||
|
|
856125f7fd | ||
|
|
178b122ab8 | ||
|
|
7b0488d068 | ||
|
|
02a9238869 | ||
|
|
2fb97409a1 | ||
|
|
3640463112 | ||
|
|
d872ed642d | ||
|
|
1ab1f33caf | ||
|
|
ba13f5951e | ||
|
|
f66e8ddf92 | ||
|
|
cff72b19c7 | ||
|
|
c046df7d18 | ||
|
|
941bd41cdb | ||
|
|
dd5ed6ce42 | ||
|
|
3a0d5221f6 | ||
|
|
a72f571bd4 |
80
.github/workflows/release.yml
vendored
80
.github/workflows/release.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
- run: npm install
|
- run: npm install
|
||||||
- name: Copy configuration
|
- name: Copy configuration
|
||||||
run: cp config.json.example config.json
|
run: cp config.json.example config.json
|
||||||
|
|
||||||
# Create Chrome artifacts
|
# Create Chrome artifacts
|
||||||
- name: Create Chrome artifacts
|
- name: Create Chrome artifacts
|
||||||
run: npm run build:chrome
|
run: npm run build:chrome
|
||||||
@@ -27,11 +27,7 @@ jobs:
|
|||||||
path: dist
|
path: dist
|
||||||
- run: mkdir ./builds
|
- run: mkdir ./builds
|
||||||
- name: Zip Artifacts
|
- name: Zip Artifacts
|
||||||
run: cd ./dist
|
run: cd ./dist ; zip -r ../builds/ChromeExtension.zip *
|
||||||
- uses: montudor/action-zip@v0.1.0
|
|
||||||
with:
|
|
||||||
args: zip -r ../builds/ChromeExtension.zip *
|
|
||||||
- run: cd ../
|
|
||||||
|
|
||||||
# Create Firefox artifacts
|
# Create Firefox artifacts
|
||||||
- name: Create Firefox artifacts
|
- name: Create Firefox artifacts
|
||||||
@@ -41,11 +37,7 @@ jobs:
|
|||||||
name: FirefoxExtension
|
name: FirefoxExtension
|
||||||
path: dist
|
path: dist
|
||||||
- name: Zip Artifacts
|
- name: Zip Artifacts
|
||||||
run: cd ./dist
|
run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip *
|
||||||
- uses: montudor/action-zip@v0.1.0
|
|
||||||
with:
|
|
||||||
args: zip -r ../builds/FirefoxExtension.zip *
|
|
||||||
- run: cd ../
|
|
||||||
|
|
||||||
# Create Beta artifacts (Builds with the name changed to beta)
|
# Create Beta artifacts (Builds with the name changed to beta)
|
||||||
- name: Create Chrome Beta artifacts
|
- name: Create Chrome Beta artifacts
|
||||||
@@ -55,12 +47,32 @@ jobs:
|
|||||||
name: ChromeExtensionBeta
|
name: ChromeExtensionBeta
|
||||||
path: dist
|
path: dist
|
||||||
- name: Zip Artifacts
|
- name: Zip Artifacts
|
||||||
run: cd ./dist
|
run: cd ./dist ; zip -r ../builds/ChromeExtensionBeta.zip *
|
||||||
- uses: montudor/action-zip@v0.1.0
|
|
||||||
with:
|
|
||||||
args: zip -r ../builds/ChromeExtensionBeta.zip *
|
|
||||||
- run: cd ../
|
|
||||||
|
|
||||||
|
# Upload each release asset
|
||||||
|
- name: Upload ChromeExtension to release
|
||||||
|
uses: Shopify/upload-to-release@master
|
||||||
|
with:
|
||||||
|
args: builds/ChromeExtension.zip
|
||||||
|
name: ChromeExtension.zip
|
||||||
|
path: ./builds/ChromeExtension.zip
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Upload ChromeExtensionBeta to release
|
||||||
|
uses: Shopify/upload-to-release@master
|
||||||
|
with:
|
||||||
|
args: builds/ChromeExtensionBeta.zip
|
||||||
|
name: ChromeExtensionBeta.zip
|
||||||
|
path: ./builds/ChromeExtensionBeta.zip
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Upload FirefoxExtension to release
|
||||||
|
uses: Shopify/upload-to-release@master
|
||||||
|
with:
|
||||||
|
args: builds/FirefoxExtension.zip
|
||||||
|
name: FirefoxExtension.zip
|
||||||
|
path: ./builds/FirefoxExtension.zip
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# Firefox Beta
|
||||||
- name: Create Firefox Beta artifacts
|
- name: Create Firefox Beta artifacts
|
||||||
run: npm run build:firefox -- --env.stream=beta
|
run: npm run build:firefox -- --env.stream=beta
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
@@ -68,11 +80,7 @@ jobs:
|
|||||||
name: FirefoxExtensionBeta
|
name: FirefoxExtensionBeta
|
||||||
path: dist
|
path: dist
|
||||||
- name: Zip Artifacts
|
- name: Zip Artifacts
|
||||||
run: cd ./dist
|
run: cd ./dist ; zip -r ../builds/FirefoxExtensionBeta.zip *
|
||||||
- uses: montudor/action-zip@v0.1.0
|
|
||||||
with:
|
|
||||||
args: zip -r ../builds/FirefoxExtensionBeta.zip *
|
|
||||||
- run: cd ../
|
|
||||||
|
|
||||||
# Create Firefox Signed Beta version
|
# Create Firefox Signed Beta version
|
||||||
- name: Create Firefox Signed Beta artifacts
|
- name: Create Firefox Signed Beta artifacts
|
||||||
@@ -82,38 +90,14 @@ jobs:
|
|||||||
WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }}
|
WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }}
|
||||||
- name: Install rename
|
- name: Install rename
|
||||||
run: sudo apt-get install rename
|
run: sudo apt-get install rename
|
||||||
- name: Install signed file
|
- name: Rename signed file
|
||||||
run: cd ./web-ext-artifacts
|
run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' *
|
||||||
- run: rename 's/.*/FirefoxSignedInstaller.xpi/' *
|
|
||||||
- run: cd ..
|
|
||||||
- uses: actions/upload-artifact@v1
|
- uses: actions/upload-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: FirefoxExtensionSigned.xpi
|
name: FirefoxExtensionSigned.xpi
|
||||||
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
|
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||||
|
|
||||||
# Upload each release asset
|
- name: Upload FirefoxSignedInstaller.xpi to release
|
||||||
- name: Upload to release
|
|
||||||
uses: Shopify/upload-to-release@master
|
|
||||||
with:
|
|
||||||
args: builds/ChromeExtension.zip
|
|
||||||
name: ChromeExtension.zip
|
|
||||||
path: ./builds/ChromeExtension.zip
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Upload to release
|
|
||||||
uses: Shopify/upload-to-release@master
|
|
||||||
with:
|
|
||||||
args: builds/ChromeExtensionBeta.zip
|
|
||||||
name: ChromeExtensionBeta.zip
|
|
||||||
path: ./builds/ChromeExtensionBeta.zip
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Upload to release
|
|
||||||
uses: Shopify/upload-to-release@master
|
|
||||||
with:
|
|
||||||
args: builds/FirefoxExtension.zip
|
|
||||||
name: FirefoxExtension.zip
|
|
||||||
path: ./builds/FirefoxExtension.zip
|
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Upload to release
|
|
||||||
uses: Shopify/upload-to-release@master
|
uses: Shopify/upload-to-release@master
|
||||||
with:
|
with:
|
||||||
args: web-ext-artifacts/FirefoxSignedInstaller.xpi
|
args: web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"serverAddress": "https://sponsor.ajay.app",
|
"serverAddress": "https://sponsor.ajay.app",
|
||||||
"testingServerAddress": "https://sponsor.ajay.app/test",
|
"testingServerAddress": "https://sponsor.ajay.app/test",
|
||||||
"serverAddressComment": "This specifies the default SponsorBlock server to conect to",
|
"serverAddressComment": "This specifies the default SponsorBlock server to connect to",
|
||||||
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"]
|
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "__MSG_fullName__",
|
"name": "__MSG_fullName__",
|
||||||
"short_name": "__MSG_Name__",
|
"short_name": "__MSG_Name__",
|
||||||
"version": "1.2.28.1",
|
"version": "1.2.30",
|
||||||
"default_locale": "en",
|
"default_locale": "en",
|
||||||
"description": "__MSG_Description__",
|
"description": "__MSG_Description__",
|
||||||
"content_scripts": [{
|
"content_scripts": [{
|
||||||
@@ -30,6 +30,8 @@
|
|||||||
"icons/PlayerUploadFailedIconSponsorBlocker256px.png",
|
"icons/PlayerUploadFailedIconSponsorBlocker256px.png",
|
||||||
"icons/upvote.png",
|
"icons/upvote.png",
|
||||||
"icons/downvote.png",
|
"icons/downvote.png",
|
||||||
|
"icons/thumbs_down.svg",
|
||||||
|
"icons/thumbs_up.svg",
|
||||||
"icons/report.png",
|
"icons/report.png",
|
||||||
"icons/close.png",
|
"icons/close.png",
|
||||||
"icons/beep.ogg",
|
"icons/beep.ogg",
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"web-run": "npm run web-run:chrome",
|
"web-run": "npm run web-run:chrome",
|
||||||
"web-sign": "web-ext sign -s dist",
|
"web-sign": "web-ext sign -s dist --id sponsorBlockerBETA@ajay.app",
|
||||||
"web-run:firefox": "cd dist && web-ext run --start-url https://addons.mozilla.org/firefox/addon/ublock-origin/",
|
"web-run:firefox": "cd dist && web-ext run --start-url https://addons.mozilla.org/firefox/addon/ublock-origin/",
|
||||||
"web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium",
|
"web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium",
|
||||||
"build": "npm run build:chrome",
|
"build": "npm run build:chrome",
|
||||||
|
|||||||
@@ -1 +1,131 @@
|
|||||||
{}
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"fullName": {
|
||||||
|
"message": "SponsorBlock за YouTube - пропускай спонсорства",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"Description": {
|
||||||
|
"message": "Пропускай спонсорствата в YouTube клипове. Докладвай за спонсорства в клиповете които гледате, за да спестите време на други хора.",
|
||||||
|
"description": "Description of the extension."
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"message": "Сървърът каза, че тази заявка е невалидна"
|
||||||
|
},
|
||||||
|
"429": {
|
||||||
|
"message": "Подали сте прекалено много спонсорства за едно видео, сигурни ли сте, че има толкова много?"
|
||||||
|
},
|
||||||
|
"409": {
|
||||||
|
"message": "Това спонсорство вече е подадено"
|
||||||
|
},
|
||||||
|
"channelWhitelisted": {
|
||||||
|
"message": "Каналът е добавен към Whitelist!"
|
||||||
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "спонсор"
|
||||||
|
},
|
||||||
|
"Sponsors": {
|
||||||
|
"message": "спонсори"
|
||||||
|
},
|
||||||
|
"Segment": {
|
||||||
|
"message": "част със спонсорство"
|
||||||
|
},
|
||||||
|
"Segments": {
|
||||||
|
"message": "части със спонсорство"
|
||||||
|
},
|
||||||
|
"reportButtonTitle": {
|
||||||
|
"message": "Докладвай"
|
||||||
|
},
|
||||||
|
"Dismiss": {
|
||||||
|
"message": "Отхвърли"
|
||||||
|
},
|
||||||
|
"Loading": {
|
||||||
|
"message": "Зареждане..."
|
||||||
|
},
|
||||||
|
"Mins": {
|
||||||
|
"message": "Минути"
|
||||||
|
},
|
||||||
|
"Secs": {
|
||||||
|
"message": "Секунди"
|
||||||
|
},
|
||||||
|
"Hide": {
|
||||||
|
"message": "Никога не показвай"
|
||||||
|
},
|
||||||
|
"hitGoBack": {
|
||||||
|
"message": "Натиснете \"върни\" за да се върнете където бяхте."
|
||||||
|
},
|
||||||
|
"unskip": {
|
||||||
|
"message": "Върни"
|
||||||
|
},
|
||||||
|
"reskip": {
|
||||||
|
"message": "Пропусни отново"
|
||||||
|
},
|
||||||
|
"paused": {
|
||||||
|
"message": "На пауза"
|
||||||
|
},
|
||||||
|
"confirmMSG": {
|
||||||
|
"message": "За да редактирате или изтриете някои стойности, натиснете на \"инфо\" бутона или отворете изкачащият прозорец на добавката чрез кликване на иконата на добавката в горният ляв ъгъл."
|
||||||
|
},
|
||||||
|
"clearThis": {
|
||||||
|
"message": "Сигурни ли сте, че искате да изчистите това?\n\n"
|
||||||
|
},
|
||||||
|
"Unknown": {
|
||||||
|
"message": "Възникна грешка при подаването на Вашите спонсорски времена, моля опитайте отново по-късно."
|
||||||
|
},
|
||||||
|
"sponsorFound": {
|
||||||
|
"message": "Спонсорите на това видео са в базата данни!"
|
||||||
|
},
|
||||||
|
"sponsor404": {
|
||||||
|
"message": "Няма намерени спонсорства"
|
||||||
|
},
|
||||||
|
"sponsorStart": {
|
||||||
|
"message": "Спонсорството Започва Сега"
|
||||||
|
},
|
||||||
|
"sponsorEnd": {
|
||||||
|
"message": "Спонсорството Започва Сега"
|
||||||
|
},
|
||||||
|
"noVideoID": {
|
||||||
|
"message": "Не е намерено YouTube видео в този раздел. Ако сте сигурни, че това е YouTube раздел, затворете този изскачащ прозорец и го отворете отново. Ако това не проработи, опитайте се да презаредите раздела."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"message": "Успешно!"
|
||||||
|
},
|
||||||
|
"voted": {
|
||||||
|
"message": "Гласувано!"
|
||||||
|
},
|
||||||
|
"voteFail": {
|
||||||
|
"message": "Вече сте гласували така преди."
|
||||||
|
},
|
||||||
|
"connectionError": {
|
||||||
|
"message": "Възникна грешка с връзката. Код на грешката: "
|
||||||
|
},
|
||||||
|
"wantToSubmit": {
|
||||||
|
"message": "Искате ли да подадете спонсорствата за това видео ID"
|
||||||
|
},
|
||||||
|
"leftTimes": {
|
||||||
|
"message": "Изглежда, че не сте подали някои спонсорства. Върнете се в страницата и ги подайте (те не са изтрити)."
|
||||||
|
},
|
||||||
|
"clearTimes": {
|
||||||
|
"message": "Премахни Спонсорствата"
|
||||||
|
},
|
||||||
|
"openPopup": {
|
||||||
|
"message": "Отворете изскачащия прозорец на SponsorBlock"
|
||||||
|
},
|
||||||
|
"SubmitTimes": {
|
||||||
|
"message": "Подайте спонсорите"
|
||||||
|
},
|
||||||
|
"submitCheck": {
|
||||||
|
"message": "Сигурни ли сте, че искате да подадете това?"
|
||||||
|
},
|
||||||
|
"whitelistChannel": {
|
||||||
|
"message": "Добавяне на канала към Whitelist"
|
||||||
|
},
|
||||||
|
"removeFromWhitelist": {
|
||||||
|
"message": "Премахване на канала от Whitelist"
|
||||||
|
},
|
||||||
|
"voteOnTime": {
|
||||||
|
"message": "Гласуване за спонсорства"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,15 +35,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "gesponsorte Inhalte"
|
"message": "gesponsorte Inhalte"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Sponsor übersprungen"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Melden"
|
"message": "Melden"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Melde dieses Segment als unzulässig."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Abbrechen"
|
"message": "Abbrechen"
|
||||||
},
|
},
|
||||||
@@ -71,6 +65,9 @@
|
|||||||
"paused": {
|
"paused": {
|
||||||
"message": "Pausiert"
|
"message": "Pausiert"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Timer angehalten"
|
||||||
|
},
|
||||||
"confirmMSG": {
|
"confirmMSG": {
|
||||||
"message": "\n\nUm einzelne Werte zu löschen oder zu ändern, klicke auf den Info-Button, oder öffne die Erweiterungs-Übersicht, indem du das Erweiterungssymbol in der rechten oberen Ecke anklickst."
|
"message": "\n\nUm einzelne Werte zu löschen oder zu ändern, klicke auf den Info-Button, oder öffne die Erweiterungs-Übersicht, indem du das Erweiterungssymbol in der rechten oberen Ecke anklickst."
|
||||||
},
|
},
|
||||||
@@ -104,9 +101,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Du hast bereits so abgestimmt."
|
"message": "Du hast bereits so abgestimmt."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Der Server ist scheinbar offline. Bitte unverzüglich dem Entwickler melden."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
|
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
|
||||||
},
|
},
|
||||||
@@ -272,12 +266,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Fehlermeldung: "
|
"message": "Fehlermeldung: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Sponsor überspringen?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Überspringen"
|
"message": "Überspringen"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Übersprungen"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Auto-Überspringen deaktivieren"
|
"message": "Auto-Überspringen deaktivieren"
|
||||||
},
|
},
|
||||||
@@ -350,6 +344,9 @@
|
|||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Unterstütze Invidious"
|
"message": "Unterstütze Invidious"
|
||||||
},
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) ist ein Drittanbieter-YouTube-Client. Um Support zu aktivieren, müssen Sie die zusätzlichen Berechtigungen akzeptieren. Dies funktioniert NICHT im Incongnito-modus auf Chrome und anderen Chromium-Varianten."
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Invidious Support aktivieren, Autoskip deaktivieren, Tasten ausblenden und vieles mehr."
|
"message": "Invidious Support aktivieren, Autoskip deaktivieren, Tasten ausblenden und vieles mehr."
|
||||||
},
|
},
|
||||||
@@ -374,12 +371,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Aktuelle Instanzen:"
|
"message": "Aktuelle Instanzen:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Automatisches Liken"
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "Wenn dies aktiviert ist, wird die Erweiterung alle Beiträge hochladen, die Sie ansehen, wenn Sie sie nicht melden. Wenn die Benachrichtigung deaktiviert ist, wird dies nicht geschehen."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Minimale Dauer (Sekunden):"
|
"message": "Minimale Dauer (Sekunden):"
|
||||||
},
|
},
|
||||||
@@ -486,9 +477,24 @@
|
|||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "Sponsor"
|
"message": "Sponsor"
|
||||||
},
|
},
|
||||||
|
"category_intro": {
|
||||||
|
"message": "Intro Animation"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "Endkarten/Credits"
|
||||||
|
},
|
||||||
|
"category_interaction": {
|
||||||
|
"message": "Interaktions-Erinnerung (Abonnieren)"
|
||||||
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "Eigenwerbung und Merchandise"
|
"message": "Eigenwerbung und Merchandise"
|
||||||
},
|
},
|
||||||
|
"category_music_offtopic": {
|
||||||
|
"message": "Musik: Nicht-Musik-Abschnitt"
|
||||||
|
},
|
||||||
|
"category_livestream_messages": {
|
||||||
|
"message": "Livestream: Spenden/Nachrichten vorlesen"
|
||||||
|
},
|
||||||
"disable": {
|
"disable": {
|
||||||
"message": "Deaktivieren"
|
"message": "Deaktivieren"
|
||||||
},
|
},
|
||||||
@@ -512,5 +518,41 @@
|
|||||||
},
|
},
|
||||||
"moreCategories": {
|
"moreCategories": {
|
||||||
"message": "Weitere Kategorien"
|
"message": "Weitere Kategorien"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Ende)"
|
||||||
|
},
|
||||||
|
"hiddenDueToDownvote": {
|
||||||
|
"message": "versteckt: downvote"
|
||||||
|
},
|
||||||
|
"hiddenDueToDuration": {
|
||||||
|
"message": "verborgen: zu kurz"
|
||||||
|
},
|
||||||
|
"channelDataNotFound": {
|
||||||
|
"message": "Kanal-ID wurde noch nicht geladen."
|
||||||
|
},
|
||||||
|
"adblockerIssue": {
|
||||||
|
"message": "Irgendwas hält SponsorBlock davon ab, die Videodaten abzurufen. Möglicherweise ist das dein Werbeblocker. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"itCouldBeAdblockerIssue": {
|
||||||
|
"message": "Falls dies weiterhin geschieht, könnte dies durch Ihren Werbeblocker verursacht werden. Bitte überprüfen Sie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"forceChannelCheck": {
|
||||||
|
"message": "Kanalprüfung erzwingen vor dem Überspringen von Sponsoren"
|
||||||
|
},
|
||||||
|
"whatForceChannelCheck": {
|
||||||
|
"message": "Standardmäßig überspringt er Sponsoren sofort, bevor er überhaupt weiß, was der Kanal ist. Standardmäßig werden auf den Kanälen auf der Whitelist-Liste einige null Sekunden Sponsoren übersprungen. Das Aktivieren dieser Option verhindert dies, aber das Überspringen hat eine leichte Verzögerung, da die Kanal-ID einige Zeit in Anspruch nehmen kann. Diese Verzögerung kann bei schnellen Internetverbindungen unauffällig sein."
|
||||||
|
},
|
||||||
|
"forceChannelCheckPopup": {
|
||||||
|
"message": "Bedenken Sie die Aktivierung der Force-Channel-Prüfung vor dem Überspringen von Sponsoren"
|
||||||
|
},
|
||||||
|
"downvoteDescription": {
|
||||||
|
"message": "Nicht korrektes/Falsches Timing"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Falsche Kategorie"
|
||||||
|
},
|
||||||
|
"nonMusicCategoryOnMusic": {
|
||||||
|
"message": "Dieses Video ist als Musik kategorisiert. Sind Sie sicher, dass Sie Segmente mit Nicht-Musikkategorien einreichen möchten? Wenn dieses Video nicht wirklich Musik ist, sollten Sie dieses Segment nicht einreichen. Bitte lesen Sie die Richtlinien, wenn Sie verwirrt sind."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,14 +35,14 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "sponsor segments"
|
"message": "sponsor segments"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
"upvoteButtonInfo": {
|
||||||
"message": "Sponsor Skipped"
|
"message": "Upvote this submission"
|
||||||
},
|
},
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Report"
|
"message": "Report"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
"reportButtonInfo": {
|
||||||
"message": "Report this sponsor submission as incorrect."
|
"message": "Report this submission as incorrect."
|
||||||
},
|
},
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Dismiss"
|
"message": "Dismiss"
|
||||||
@@ -71,6 +71,9 @@
|
|||||||
"paused": {
|
"paused": {
|
||||||
"message": "Paused"
|
"message": "Paused"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Timer Stopped"
|
||||||
|
},
|
||||||
"confirmMSG": {
|
"confirmMSG": {
|
||||||
"message": "To edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
|
"message": "To edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
|
||||||
},
|
},
|
||||||
@@ -101,11 +104,8 @@
|
|||||||
"voted": {
|
"voted": {
|
||||||
"message": "Voted!"
|
"message": "Voted!"
|
||||||
},
|
},
|
||||||
"voteFail": {
|
|
||||||
"message": "You have already voted this way before."
|
|
||||||
},
|
|
||||||
"serverDown": {
|
"serverDown": {
|
||||||
"message": "It seems the sever is down. Contact the dev immediately."
|
"message": "It seems the server is down. Contact the dev immediately."
|
||||||
},
|
},
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "A connection error has occured. Error code: "
|
"message": "A connection error has occured. Error code: "
|
||||||
@@ -272,12 +272,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Error Code: "
|
"message": "Error Code: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Skip Sponsor?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Skip"
|
"message": "Skip"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Skipped"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Disable Auto Skip"
|
"message": "Disable Auto Skip"
|
||||||
},
|
},
|
||||||
@@ -377,12 +377,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Current Instances:"
|
"message": "Current Instances:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Auto Upvote"
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "With this enabled, the extension will upvote all submissions you view if you do not report them. If the notice is disabled, this will not occur."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Minimum duration (seconds):"
|
"message": "Minimum duration (seconds):"
|
||||||
},
|
},
|
||||||
@@ -499,7 +493,7 @@
|
|||||||
"message": "Interaction Reminder (Subscribe)"
|
"message": "Interaction Reminder (Subscribe)"
|
||||||
},
|
},
|
||||||
"category_selfpromo": {
|
"category_selfpromo": {
|
||||||
"message": "Self-Promotion and Merchandise"
|
"message": "Unpaid/Self Promotion"
|
||||||
},
|
},
|
||||||
"category_music_offtopic": {
|
"category_music_offtopic": {
|
||||||
"message": "Music: Non-Music Section"
|
"message": "Music: Non-Music Section"
|
||||||
@@ -559,12 +553,15 @@
|
|||||||
"message": "Consider Enabling Force Channel Check Before Skipping Sponsors"
|
"message": "Consider Enabling Force Channel Check Before Skipping Sponsors"
|
||||||
},
|
},
|
||||||
"downvoteDescription": {
|
"downvoteDescription": {
|
||||||
"message": "Incorrect"
|
"message": "Incorrect/Wrong Timing"
|
||||||
},
|
},
|
||||||
"incorrectCategory": {
|
"incorrectCategory": {
|
||||||
"message": "Wrong Category"
|
"message": "Wrong Category"
|
||||||
},
|
},
|
||||||
"nonMusicCategoryOnMusic": {
|
"nonMusicCategoryOnMusic": {
|
||||||
"message": "This video is categorized as music. Are you sure you would like to submit segments with non-music categories? Unless this video is not actually music, you should not be submitting this segment. Please read the guidelines if you are confused."
|
"message": "This video is categorized as music. Are you sure you would like to submit segments with non-music categories? Unless this video is not actually music, you should not be submitting this segment. Please read the guidelines if you are confused."
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Multiple Segments"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,500 @@
|
|||||||
{}
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"fullName": {
|
||||||
|
"message": "SponsorBlock para YouTube - Omitir Sponsors",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"Description": {
|
||||||
|
"message": "Omitir sponsors en videos de YouTube. Infórmanos de sponsors en videos que ves para ahorrar el tiempo de otros.",
|
||||||
|
"description": "Description of the extension."
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"message": "Servidor dijo que esta solicitud no es valida"
|
||||||
|
},
|
||||||
|
"429": {
|
||||||
|
"message": "Has enviado demasiados tiempos de sponsor en este video, ¿estas seguro de que hay tantos?"
|
||||||
|
},
|
||||||
|
"409": {
|
||||||
|
"message": "Esto ya ha sido enviado antes"
|
||||||
|
},
|
||||||
|
"channelWhitelisted": {
|
||||||
|
"message": "Canal Permitido!"
|
||||||
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "sponsor"
|
||||||
|
},
|
||||||
|
"Sponsors": {
|
||||||
|
"message": "sponsors"
|
||||||
|
},
|
||||||
|
"Segment": {
|
||||||
|
"message": "segmento de sponsor"
|
||||||
|
},
|
||||||
|
"Segments": {
|
||||||
|
"message": "segmentos de sponsor"
|
||||||
|
},
|
||||||
|
"upvoteButtonInfo": {
|
||||||
|
"message": "Votar a favor de esta sumisión"
|
||||||
|
},
|
||||||
|
"reportButtonTitle": {
|
||||||
|
"message": "Denunciar"
|
||||||
|
},
|
||||||
|
"reportButtonInfo": {
|
||||||
|
"message": "Denunciar esta sumisión como incorrecta."
|
||||||
|
},
|
||||||
|
"Dismiss": {
|
||||||
|
"message": "Descartar"
|
||||||
|
},
|
||||||
|
"Loading": {
|
||||||
|
"message": "Cargando..."
|
||||||
|
},
|
||||||
|
"Mins": {
|
||||||
|
"message": "Minutos"
|
||||||
|
},
|
||||||
|
"Secs": {
|
||||||
|
"message": "Segundos"
|
||||||
|
},
|
||||||
|
"Hide": {
|
||||||
|
"message": "Nunca Mostrar"
|
||||||
|
},
|
||||||
|
"hitGoBack": {
|
||||||
|
"message": "Haz clic en no omitir para volver a donde estabas."
|
||||||
|
},
|
||||||
|
"unskip": {
|
||||||
|
"message": "No omitir"
|
||||||
|
},
|
||||||
|
"reskip": {
|
||||||
|
"message": "Volver a saltar"
|
||||||
|
},
|
||||||
|
"paused": {
|
||||||
|
"message": "Pausado"
|
||||||
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Temporizador Detenido"
|
||||||
|
},
|
||||||
|
"confirmMSG": {
|
||||||
|
"message": "Para editar o eliminar valores individuales, haz clic en el botón de información o abre la ventana de extensión haciendo clic en el icono de extensión en la esquina superior derecha."
|
||||||
|
},
|
||||||
|
"clearThis": {
|
||||||
|
"message": "¿Estas seguro de que quieres eliminar esto?\n\n"
|
||||||
|
},
|
||||||
|
"Unknown": {
|
||||||
|
"message": "Se ha producido un error enviando tus tiempos de sponsor, por favor inténtalo de nuevo más tarde."
|
||||||
|
},
|
||||||
|
"sponsorFound": {
|
||||||
|
"message": "¡Los sponsors de este video están en la base de datos!"
|
||||||
|
},
|
||||||
|
"sponsor404": {
|
||||||
|
"message": "No se encontró ningún sponsor"
|
||||||
|
},
|
||||||
|
"sponsorStart": {
|
||||||
|
"message": "Sponsor Empieza Ahora"
|
||||||
|
},
|
||||||
|
"sponsorEnd": {
|
||||||
|
"message": "Sponsor Acaba Ahora"
|
||||||
|
},
|
||||||
|
"noVideoID": {
|
||||||
|
"message": "Ningún video de YouTube se encontró en esta pestaña. Si sabes que esto es una pestaña de YouTube, cierra esta ventana y ábrela otra vez. Si eso no funciona, intenta recargar la pestaña."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"message": "¡Completado!"
|
||||||
|
},
|
||||||
|
"voted": {
|
||||||
|
"message": "¡Votado!"
|
||||||
|
},
|
||||||
|
"serverDown": {
|
||||||
|
"message": "Parece que el servidor está desconectado. Póngase en contacto con el desarrollador inmediatamente."
|
||||||
|
},
|
||||||
|
"connectionError": {
|
||||||
|
"message": "Ha ocurrido un error de conexión. Código de error: "
|
||||||
|
},
|
||||||
|
"wantToSubmit": {
|
||||||
|
"message": "¿Quieres enviar los tiempos de sponsor para el vídeo id"
|
||||||
|
},
|
||||||
|
"leftTimes": {
|
||||||
|
"message": "Parece que has dejado algunos tiempos de sponsor sin enviar. Vuelve a esa página para enviarlos (no se eliminaron)."
|
||||||
|
},
|
||||||
|
"clearTimes": {
|
||||||
|
"message": "Eliminar Tiempos de Sponsor"
|
||||||
|
},
|
||||||
|
"openPopup": {
|
||||||
|
"message": "Abrir Ventana de SponsorBlock"
|
||||||
|
},
|
||||||
|
"SubmitTimes": {
|
||||||
|
"message": "Enviar Tiempos de Sponsor"
|
||||||
|
},
|
||||||
|
"submitCheck": {
|
||||||
|
"message": "¿Estás seguro de que quieres enviar esto?"
|
||||||
|
},
|
||||||
|
"whitelistChannel": {
|
||||||
|
"message": "Permitir Canal"
|
||||||
|
},
|
||||||
|
"removeFromWhitelist": {
|
||||||
|
"message": "Parar De Permitir Canal"
|
||||||
|
},
|
||||||
|
"voteOnTime": {
|
||||||
|
"message": "Votar en un tiempo de sponsor"
|
||||||
|
},
|
||||||
|
"recordTimes": {
|
||||||
|
"message": "Registrar los tiempos de un sponsor"
|
||||||
|
},
|
||||||
|
"soFarUHSubmited": {
|
||||||
|
"message": "Hasta ahora, has enviado"
|
||||||
|
},
|
||||||
|
"savedPeopleFrom": {
|
||||||
|
"message": "Has salvado personas de "
|
||||||
|
},
|
||||||
|
"viewLeaderboard": {
|
||||||
|
"message": "Ver la tabla de clasificación"
|
||||||
|
},
|
||||||
|
"here": {
|
||||||
|
"message": "aquí"
|
||||||
|
},
|
||||||
|
"recordTimesDescription": {
|
||||||
|
"message": "Haga clic en el botón de abajo cuando el sponsor comienza y termina para registrarlo y\nenviarlo a la base de datos."
|
||||||
|
},
|
||||||
|
"popupHint": {
|
||||||
|
"message": "Consejo: Presiona la tecla de punto y coma mientras enfocado en un video para registrar el comienzo/fin de un sponsor y presiona comillas para enviar. (Esto se puede cambiar en las opciones)"
|
||||||
|
},
|
||||||
|
"lastTimes": {
|
||||||
|
"message": "Últimos mensajes de sponsor elegidos"
|
||||||
|
},
|
||||||
|
"clearTimesButton": {
|
||||||
|
"message": "Eliminar Tiempos"
|
||||||
|
},
|
||||||
|
"submitTimesButton": {
|
||||||
|
"message": "Enviar Tiempos"
|
||||||
|
},
|
||||||
|
"publicStats": {
|
||||||
|
"message": "Esto se utiliza en la página de estadísticas públicas para mostrar cuánto has contribuido. Véala"
|
||||||
|
},
|
||||||
|
"setUsername": {
|
||||||
|
"message": "Escoger Nombre De Usuario"
|
||||||
|
},
|
||||||
|
"discordAdvert": {
|
||||||
|
"message": "¡Únete al servidor oficial de discord para darnos sugerencias y comentarios!"
|
||||||
|
},
|
||||||
|
"hideThis": {
|
||||||
|
"message": "No mostrar esto"
|
||||||
|
},
|
||||||
|
"Options": {
|
||||||
|
"message": "Opciones"
|
||||||
|
},
|
||||||
|
"showButtons": {
|
||||||
|
"message": "Mostrar botones en el reproductor de YouTube"
|
||||||
|
},
|
||||||
|
"hideButtons": {
|
||||||
|
"message": "Ocultar botones en el reproductor de YouTube"
|
||||||
|
},
|
||||||
|
"hideButtonsDescription": {
|
||||||
|
"message": "Esto oculta los botones que aparecen en el reproductor de YouTube que se usan para enviar segmentos saltados."
|
||||||
|
},
|
||||||
|
"showInfoButton": {
|
||||||
|
"message": "Mostrar botón de información en el reproductor de YouTube"
|
||||||
|
},
|
||||||
|
"hideInfoButton": {
|
||||||
|
"message": "Ocultar botón de información en el reproductor de YouTube"
|
||||||
|
},
|
||||||
|
"whatInfoButton": {
|
||||||
|
"message": "Este es el botón que abre una ventana en la página de YouTube."
|
||||||
|
},
|
||||||
|
"hideDeleteButton": {
|
||||||
|
"message": "Ocultar botón de eliminar en el reproductor de YouTube"
|
||||||
|
},
|
||||||
|
"showDeleteButton": {
|
||||||
|
"message": "Mostrar botón de eliminar en el reproductor de YouTube"
|
||||||
|
},
|
||||||
|
"whatDeleteButton": {
|
||||||
|
"message": "Este es el botón en el reproductor de YouTube que eliminará todos tus segmentos no enviados para el vídeo actual."
|
||||||
|
},
|
||||||
|
"disableViewTracking": {
|
||||||
|
"message": "Desactivar seguimiento de numero de sponsorsomitidos"
|
||||||
|
},
|
||||||
|
"enableViewTracking": {
|
||||||
|
"message": "Activar seguimiento de numero de sponsors omitidos"
|
||||||
|
},
|
||||||
|
"whatViewTracking": {
|
||||||
|
"message": "Esta opción registra los sponsors que te has saltado para que los otros usuarios sepan cuánto su sumisión ha ayudado a otros y\nes usado como métrica junto con votos positivos para asegurar que el spam no ingrese a la base de datos. La extensión envía un mensaje\nal servidor cada vez que se salta un patrocinador. Esperemos que la mayoría de la gente no cambie esta opción para que los números de vista sean exactos. :)"
|
||||||
|
},
|
||||||
|
"showNotice": {
|
||||||
|
"message": "Mostrar aviso de nuevo"
|
||||||
|
},
|
||||||
|
"longDescription": {
|
||||||
|
"message": "SponsorBlock es una extensión que se omitira segmentos de sponsor de vídeos de YouTube. SponsorBlock es una extensión de navegador que permite a cualquiera enviar los tiempos de comienzo y fin de segmentos de sponsor de vídeos de YouTube. Una vez que una persona envíe esta información, todos los demás con esta extensión pueden omitir directamente el segmento de sponsor.",
|
||||||
|
"description": "Full description of the extension on the store pages."
|
||||||
|
},
|
||||||
|
"website": {
|
||||||
|
"message": "Sitio Web",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"sourceCode": {
|
||||||
|
"message": "Código Fuente",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"noticeUpdate": {
|
||||||
|
"message": "¡El aviso ha sido actualizado!",
|
||||||
|
"description": "The first line of the message displayed after the notice was upgraded."
|
||||||
|
},
|
||||||
|
"noticeUpdate2": {
|
||||||
|
"message": "Si aún no te gusta, pulsa el botón de nunca mostrar.",
|
||||||
|
"description": "The second line of the message displayed after the notice was upgraded."
|
||||||
|
},
|
||||||
|
"setStartSponsorShortcut": {
|
||||||
|
"message": "Establecer botón de inicio de sponsor"
|
||||||
|
},
|
||||||
|
"setSubmitKeybind": {
|
||||||
|
"message": "Establecer botón de envio"
|
||||||
|
},
|
||||||
|
"keybindDescription": {
|
||||||
|
"message": "Seleccione un botón escribiéndolo"
|
||||||
|
},
|
||||||
|
"keybindDescriptionComplete": {
|
||||||
|
"message": "El botón se ha establecido a: "
|
||||||
|
},
|
||||||
|
"0": {
|
||||||
|
"message": "Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado."
|
||||||
|
},
|
||||||
|
"disableSkipping": {
|
||||||
|
"message": "Desactivar SponsorBlock"
|
||||||
|
},
|
||||||
|
"enableSkipping": {
|
||||||
|
"message": "Activar SponsorBlock"
|
||||||
|
},
|
||||||
|
"yourWork": {
|
||||||
|
"message": "Tu trabajo",
|
||||||
|
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||||
|
},
|
||||||
|
"502": {
|
||||||
|
"message": "El servidor parece estar sobrecargado. Inténtalo de nuevo en unos segundos."
|
||||||
|
},
|
||||||
|
"errorCode": {
|
||||||
|
"message": "Código de error: "
|
||||||
|
},
|
||||||
|
"skip": {
|
||||||
|
"message": "Omitir"
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Omitido"
|
||||||
|
},
|
||||||
|
"disableAutoSkip": {
|
||||||
|
"message": "Desactivar la omisión automática"
|
||||||
|
},
|
||||||
|
"enableAutoSkip": {
|
||||||
|
"message": "Activar la omisión automática"
|
||||||
|
},
|
||||||
|
"autoSkipDescription": {
|
||||||
|
"message": "La omisión automática omitirá sponsors por ti. Si esta desactivada, aparecerá un aviso preguntando si quieres omitir."
|
||||||
|
},
|
||||||
|
"audioNotification": {
|
||||||
|
"message": "Notificación de audio al omitir"
|
||||||
|
},
|
||||||
|
"audioNotificationDescription": {
|
||||||
|
"message": "Notificación de audio al omitir reproducirá un sonido cada vez que se omite un sponsor. Si está desactivada (o se desactiva la omisión automática), no se reproducirá ningún sonido."
|
||||||
|
},
|
||||||
|
"youHaveSkipped": {
|
||||||
|
"message": "Has omitido "
|
||||||
|
},
|
||||||
|
"youHaveSaved": {
|
||||||
|
"message": "Te has ahorrado "
|
||||||
|
},
|
||||||
|
"minLower": {
|
||||||
|
"message": "minuto"
|
||||||
|
},
|
||||||
|
"minsLower": {
|
||||||
|
"message": "minutos"
|
||||||
|
},
|
||||||
|
"hourLower": {
|
||||||
|
"message": "hora"
|
||||||
|
},
|
||||||
|
"hoursLower": {
|
||||||
|
"message": "horas"
|
||||||
|
},
|
||||||
|
"youHaveSavedTime": {
|
||||||
|
"message": "Has ahorrado a otras personas"
|
||||||
|
},
|
||||||
|
"youHaveSavedTimeEnd": {
|
||||||
|
"message": " de sus vidas."
|
||||||
|
},
|
||||||
|
"guildlinesSummary": {
|
||||||
|
"message": "- Asegúrate de que tu segmento sólo contiene un segmento de promoción de pago, nada más.\n- Asegúrate de que omitir este segmento no omitirá ningún contenido valioso\n- Si todo el vídeo es un sponsor, por favor, no lo envíen. Pronto saldrá un sistema completo de reportes de vídeo.\n- Por favor, no informe de los avisos que podrían mostrar parcialidad (si un vídeo de revista está patrocinado, no se salte cuando mencionen eso)."
|
||||||
|
},
|
||||||
|
"statusReminder": {
|
||||||
|
"message": "Comprueba status.sponsor.ajay.app para ver el estado del servidor."
|
||||||
|
},
|
||||||
|
"changeUserID": {
|
||||||
|
"message": "Importar/Exportar tu UserID"
|
||||||
|
},
|
||||||
|
"whatChangeUserID": {
|
||||||
|
"message": "Esto debería mantenerse privado. Es como una contraseña y no debe ser compartido con nadie. Si alguien tiene esto, pueden imitarte."
|
||||||
|
},
|
||||||
|
"setUserID": {
|
||||||
|
"message": "Definir UserID"
|
||||||
|
},
|
||||||
|
"userIDChangeWarning": {
|
||||||
|
"message": "Advertencia: Cambiar el UserID es permanente. ¿Estás seguro de que desea hacer esto? Asegúrese de hacer una copia de seguridad de su UserID anterior por si acaso."
|
||||||
|
},
|
||||||
|
"createdBy": {
|
||||||
|
"message": "Creado Por"
|
||||||
|
},
|
||||||
|
"autoSkip": {
|
||||||
|
"message": "Omisión Automática"
|
||||||
|
},
|
||||||
|
"showSkipNotice": {
|
||||||
|
"message": "Mostrar aviso después de que se omita un sponsor"
|
||||||
|
},
|
||||||
|
"keybindCurrentlySet": {
|
||||||
|
"message": ". Actualmente está establecido a:"
|
||||||
|
},
|
||||||
|
"supportInvidious": {
|
||||||
|
"message": "Soportar Invidious"
|
||||||
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) es un cliente alternativo para YouTube. Para habilitar soporte, tienes que aceptar los permisos adicionales. Esto NO funciona en modo incógnito en Chrome y otros variantes de Chromium."
|
||||||
|
},
|
||||||
|
"optionsInfo": {
|
||||||
|
"message": "Activar soporte de Invidious, deshabilitar omisión automática, ocultar botones y más."
|
||||||
|
},
|
||||||
|
"addInvidiousInstance": {
|
||||||
|
"message": "Añadir nodo de Invidious"
|
||||||
|
},
|
||||||
|
"addInvidiousInstanceDescription": {
|
||||||
|
"message": "Añadir un nodo de Invidious personalizado. Esto debe estar formateado con SOLO el dominio. Ejemplo: invidious.ajay.app"
|
||||||
|
},
|
||||||
|
"add": {
|
||||||
|
"message": "Añadir"
|
||||||
|
},
|
||||||
|
"addInvidiousInstanceError": {
|
||||||
|
"message": "Esto es un dominio inválido. Esto debería incluir SOLO el dominio. Ejemplo: invidious.ajay.app"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstance": {
|
||||||
|
"message": "Restablecer Lista de Nodos de Invidious"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstanceAlert": {
|
||||||
|
"message": "Estás a punto de restablecer la lista de nodos de invidious"
|
||||||
|
},
|
||||||
|
"currentInstances": {
|
||||||
|
"message": "Nodos actuales:"
|
||||||
|
},
|
||||||
|
"minDuration": {
|
||||||
|
"message": "Duración mínima (en segundos):"
|
||||||
|
},
|
||||||
|
"minDurationDescription": {
|
||||||
|
"message": "Los segmentos de sponsor más cortos que el valor establecido no serán omitidos ni mostrados en el reproductor."
|
||||||
|
},
|
||||||
|
"shortCheck": {
|
||||||
|
"message": "La siguiente sumisión es más corto que su opción de duración mínima. Esto podría significar que esto ya se ha enviado y que simplemente se ha ignorado debido a esta opción. ¿Está seguro de que desea enviar?"
|
||||||
|
},
|
||||||
|
"showUploadButton": {
|
||||||
|
"message": "Mostrar botón de subida"
|
||||||
|
},
|
||||||
|
"whatUploadButton": {
|
||||||
|
"message": "Este botón aparece en el reproductor de YouTube después de que has seleccionado una marca de tiempo y estas listo para enviar."
|
||||||
|
},
|
||||||
|
"customServerAddress": {
|
||||||
|
"message": "Dirección del servidor SponsorBlock"
|
||||||
|
},
|
||||||
|
"customServerAddressDescription": {
|
||||||
|
"message": "La dirección que SponsorBlock utiliza para hacer llamadas al servidor.\nA menos que tengas tu propia instancia del servidor, no debería cambiarse."
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"message": "Guardar"
|
||||||
|
},
|
||||||
|
"reset": {
|
||||||
|
"message": "Restablecer"
|
||||||
|
},
|
||||||
|
"mobileUpdateInfo": {
|
||||||
|
"message": "m.youtube.com ahora es compatible"
|
||||||
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Importar/Exportar todas las opciones"
|
||||||
|
},
|
||||||
|
"setOptions": {
|
||||||
|
"message": "Configurar opciones"
|
||||||
|
},
|
||||||
|
"confirmNoticeTitle": {
|
||||||
|
"message": "Enviar segmento"
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"message": "Enviar"
|
||||||
|
},
|
||||||
|
"cancel": {
|
||||||
|
"message": "Cancelar"
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"message": "Eliminar"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"message": "Vista Previa"
|
||||||
|
},
|
||||||
|
"edit": {
|
||||||
|
"message": "Editar"
|
||||||
|
},
|
||||||
|
"copyDebugInformation": {
|
||||||
|
"message": "Copiar información de depuración al portapapeles"
|
||||||
|
},
|
||||||
|
"copyDebugInformationFailed": {
|
||||||
|
"message": "Error al escribir al portapapeles"
|
||||||
|
},
|
||||||
|
"theKey": {
|
||||||
|
"message": "El botón"
|
||||||
|
},
|
||||||
|
"keyAlreadyUsedByYouTube": {
|
||||||
|
"message": "ya está en uso por youtube. Por favor, seleccione otro botón."
|
||||||
|
},
|
||||||
|
"keyAlreadyUsed": {
|
||||||
|
"message": "está enlazado a otra acción. Por favor, seleccione otro botón."
|
||||||
|
},
|
||||||
|
"category_sponsor": {
|
||||||
|
"message": "Sponsor"
|
||||||
|
},
|
||||||
|
"category_intro": {
|
||||||
|
"message": "Animación de introducción"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "Tarjetas/Créditos"
|
||||||
|
},
|
||||||
|
"category_interaction": {
|
||||||
|
"message": "Recordatorio de interacción (subscribir)"
|
||||||
|
},
|
||||||
|
"category_selfpromo": {
|
||||||
|
"message": "Auto-promoción y mercancía"
|
||||||
|
},
|
||||||
|
"category_music_offtopic": {
|
||||||
|
"message": "Música: Sección sin musica"
|
||||||
|
},
|
||||||
|
"category_livestream_messages": {
|
||||||
|
"message": "Directo: Lecturas de donaciones y mensajes"
|
||||||
|
},
|
||||||
|
"disable": {
|
||||||
|
"message": "Desactivar"
|
||||||
|
},
|
||||||
|
"manualSkip": {
|
||||||
|
"message": "Omisión manual"
|
||||||
|
},
|
||||||
|
"enableTestingServer": {
|
||||||
|
"message": "Habilitar Servidor de Pruebas Beta"
|
||||||
|
},
|
||||||
|
"bracketNow": {
|
||||||
|
"message": "(Ahora)"
|
||||||
|
},
|
||||||
|
"moreCategories": {
|
||||||
|
"message": "Más categorías"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Final)"
|
||||||
|
},
|
||||||
|
"channelDataNotFound": {
|
||||||
|
"message": "ID de canal no cargado todavía."
|
||||||
|
},
|
||||||
|
"downvoteDescription": {
|
||||||
|
"message": "Tiempo incorrecto"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Categoría errónea"
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Varios segmentos"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1 +1,387 @@
|
|||||||
{}
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"fullName": {
|
||||||
|
"message": "SponsorBlock YouTubelle - Ohita sponsoroinnit",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"Description": {
|
||||||
|
"message": "Ohita sponsorointi YouTube-videoissa. Ilmoita katsomiesi videoinen sponsoreista säästääksesi muiden aikaa.",
|
||||||
|
"description": "Description of the extension."
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"message": "Palvelin sanoi tämän pyynnön olevan virheellinen"
|
||||||
|
},
|
||||||
|
"429": {
|
||||||
|
"message": "Olet lähettänyt liian monta sponsorointiaikaa tälle yhdelle videolle. Oletko varma, että niitä on useita?"
|
||||||
|
},
|
||||||
|
"409": {
|
||||||
|
"message": "Tämä on jo lähetetty aiemmin"
|
||||||
|
},
|
||||||
|
"channelWhitelisted": {
|
||||||
|
"message": "Kanava lisätty valkoiselle listalle!"
|
||||||
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "sponsori"
|
||||||
|
},
|
||||||
|
"Sponsors": {
|
||||||
|
"message": "sponsorit"
|
||||||
|
},
|
||||||
|
"Segment": {
|
||||||
|
"message": "sponsoroitu kohta"
|
||||||
|
},
|
||||||
|
"Segments": {
|
||||||
|
"message": "sponsoroidut kohdat"
|
||||||
|
},
|
||||||
|
"upvoteButtonInfo": {
|
||||||
|
"message": "Äänestä tätä lähetystä"
|
||||||
|
},
|
||||||
|
"reportButtonTitle": {
|
||||||
|
"message": "Ilmoita"
|
||||||
|
},
|
||||||
|
"reportButtonInfo": {
|
||||||
|
"message": "Ilmoita tämän lähetyksen olevan virheellinen."
|
||||||
|
},
|
||||||
|
"Dismiss": {
|
||||||
|
"message": "Hylkää"
|
||||||
|
},
|
||||||
|
"Loading": {
|
||||||
|
"message": "Ladataan..."
|
||||||
|
},
|
||||||
|
"Mins": {
|
||||||
|
"message": "Minuuttia"
|
||||||
|
},
|
||||||
|
"Secs": {
|
||||||
|
"message": "Sekuntia"
|
||||||
|
},
|
||||||
|
"Hide": {
|
||||||
|
"message": "Älä näytä koskaan"
|
||||||
|
},
|
||||||
|
"hitGoBack": {
|
||||||
|
"message": "Paina 'älä ohita' mennäksesi takaisin kohtaan jossa olit."
|
||||||
|
},
|
||||||
|
"unskip": {
|
||||||
|
"message": "Älä ohita"
|
||||||
|
},
|
||||||
|
"reskip": {
|
||||||
|
"message": "Ohita uudelleen"
|
||||||
|
},
|
||||||
|
"paused": {
|
||||||
|
"message": "Pysäytetty"
|
||||||
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Ajastin pysäytetty"
|
||||||
|
},
|
||||||
|
"clearThis": {
|
||||||
|
"message": "Haluatko varmasti poistaa tämän?\n\n"
|
||||||
|
},
|
||||||
|
"Unknown": {
|
||||||
|
"message": "Sponsorointiaikoja lähetettäessä tapahtui virhe, yritä myöhemmin uudelleen."
|
||||||
|
},
|
||||||
|
"sponsorFound": {
|
||||||
|
"message": "Tämän videon sponsorit löytyvät tietokannasta!"
|
||||||
|
},
|
||||||
|
"sponsor404": {
|
||||||
|
"message": "Sponsoreita ei löytynyt"
|
||||||
|
},
|
||||||
|
"sponsorStart": {
|
||||||
|
"message": "Sponsorointi alkaa nyt"
|
||||||
|
},
|
||||||
|
"sponsorEnd": {
|
||||||
|
"message": "Sponsorointi päättyy nyt"
|
||||||
|
},
|
||||||
|
"noVideoID": {
|
||||||
|
"message": "Välilehdeltä ei löytynyt YouTube-videota. Jos olet varma, että tämä on YouTube-välilehti, sulje tämä ponnahdusikkuna ja avaa se uudelleen. Jos sekään ei toimi, yritä ladata välilehti uudelleen."
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"message": "Onnistui!"
|
||||||
|
},
|
||||||
|
"voted": {
|
||||||
|
"message": "Äänestetty!"
|
||||||
|
},
|
||||||
|
"voteFail": {
|
||||||
|
"message": "Olet jo äänestänyt näin aiemmin."
|
||||||
|
},
|
||||||
|
"serverDown": {
|
||||||
|
"message": "Palvelin näyttää olevan alhaalla. Ota heti yhteyttä kehittäjään."
|
||||||
|
},
|
||||||
|
"connectionError": {
|
||||||
|
"message": "Yhteysvirhe on tapahtunut. Virhekoodi: "
|
||||||
|
},
|
||||||
|
"clearTimes": {
|
||||||
|
"message": "Tyhjennä sponsorointiajat"
|
||||||
|
},
|
||||||
|
"openPopup": {
|
||||||
|
"message": "Avaa SponsorBlock-ponnahdusikkuna"
|
||||||
|
},
|
||||||
|
"SubmitTimes": {
|
||||||
|
"message": "Lähetä sponsorointiajat"
|
||||||
|
},
|
||||||
|
"submitCheck": {
|
||||||
|
"message": "Haluatko varmasti lähettää tämän?"
|
||||||
|
},
|
||||||
|
"whitelistChannel": {
|
||||||
|
"message": "Lisää kanava valkoiselle listalle"
|
||||||
|
},
|
||||||
|
"removeFromWhitelist": {
|
||||||
|
"message": "Poista kanava valkoiselta listalta"
|
||||||
|
},
|
||||||
|
"voteOnTime": {
|
||||||
|
"message": "Äänestä sponsorointiaikaa"
|
||||||
|
},
|
||||||
|
"recordTimes": {
|
||||||
|
"message": "Tallenna sponsoroinnin ajat"
|
||||||
|
},
|
||||||
|
"soFarUHSubmited": {
|
||||||
|
"message": "Tähän mennessä, olet lähettänyt"
|
||||||
|
},
|
||||||
|
"savedPeopleFrom": {
|
||||||
|
"message": "Olet säästänyt ihmisiltä "
|
||||||
|
},
|
||||||
|
"viewLeaderboard": {
|
||||||
|
"message": "Näytä tulostaulukko"
|
||||||
|
},
|
||||||
|
"here": {
|
||||||
|
"message": "tässä"
|
||||||
|
},
|
||||||
|
"clearTimesButton": {
|
||||||
|
"message": "Tyhjennä ajat"
|
||||||
|
},
|
||||||
|
"submitTimesButton": {
|
||||||
|
"message": "Lähetä ajat"
|
||||||
|
},
|
||||||
|
"setUsername": {
|
||||||
|
"message": "Aseta käyttäjänimi"
|
||||||
|
},
|
||||||
|
"hideThis": {
|
||||||
|
"message": "Piilota tämä"
|
||||||
|
},
|
||||||
|
"Options": {
|
||||||
|
"message": "Asetukset"
|
||||||
|
},
|
||||||
|
"showButtons": {
|
||||||
|
"message": "Näytä painikkeet YouTuben soittimessa"
|
||||||
|
},
|
||||||
|
"hideButtons": {
|
||||||
|
"message": "Piilota painikkeet YouTuben soittimessa"
|
||||||
|
},
|
||||||
|
"hideButtonsDescription": {
|
||||||
|
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
|
||||||
|
},
|
||||||
|
"showInfoButton": {
|
||||||
|
"message": "Näytä info-painike YouTuben soittimessa"
|
||||||
|
},
|
||||||
|
"hideInfoButton": {
|
||||||
|
"message": "Piilota info-painike YouTuben soittimessa"
|
||||||
|
},
|
||||||
|
"whatInfoButton": {
|
||||||
|
"message": "Tämä on painike, joka avaa ponnahdusikkunan YouTube-sivulla."
|
||||||
|
},
|
||||||
|
"hideDeleteButton": {
|
||||||
|
"message": "Piilota poista-painike YouTuben soittimessa"
|
||||||
|
},
|
||||||
|
"showDeleteButton": {
|
||||||
|
"message": "Näytä poista-painike YouTuben soittimessa"
|
||||||
|
},
|
||||||
|
"whatDeleteButton": {
|
||||||
|
"message": "Tämä on YouTuben soittimen painike, joka poistaa kaikki kyseisen videon sponsorointikohdat, joita et ole vielä lähettänyt."
|
||||||
|
},
|
||||||
|
"website": {
|
||||||
|
"message": "Sivusto",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"sourceCode": {
|
||||||
|
"message": "Lähdekoodi",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"keybindDescription": {
|
||||||
|
"message": "Valitse näppäin painamalla sitä"
|
||||||
|
},
|
||||||
|
"disableSkipping": {
|
||||||
|
"message": "Poista Sponsorblock käytöstä"
|
||||||
|
},
|
||||||
|
"enableSkipping": {
|
||||||
|
"message": "Ota SponsorBlock käyttöön"
|
||||||
|
},
|
||||||
|
"yourWork": {
|
||||||
|
"message": "Sinun työsi",
|
||||||
|
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||||
|
},
|
||||||
|
"errorCode": {
|
||||||
|
"message": "Virhekoodi: "
|
||||||
|
},
|
||||||
|
"skip": {
|
||||||
|
"message": "Ohita"
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Ohitettu"
|
||||||
|
},
|
||||||
|
"disableAutoSkip": {
|
||||||
|
"message": "Poista automaattinen ohitus käytöstä"
|
||||||
|
},
|
||||||
|
"enableAutoSkip": {
|
||||||
|
"message": "Ota automaattinen ohitus käyttöön"
|
||||||
|
},
|
||||||
|
"youHaveSkipped": {
|
||||||
|
"message": "Olet ohittanut "
|
||||||
|
},
|
||||||
|
"youHaveSaved": {
|
||||||
|
"message": "Olet säästänyt itseltäsi "
|
||||||
|
},
|
||||||
|
"minLower": {
|
||||||
|
"message": "minuutti"
|
||||||
|
},
|
||||||
|
"minsLower": {
|
||||||
|
"message": "minuuttia"
|
||||||
|
},
|
||||||
|
"hourLower": {
|
||||||
|
"message": "tunti"
|
||||||
|
},
|
||||||
|
"hoursLower": {
|
||||||
|
"message": "tuntia"
|
||||||
|
},
|
||||||
|
"youHaveSavedTime": {
|
||||||
|
"message": "Olet säästänyt ihmisiltä"
|
||||||
|
},
|
||||||
|
"youHaveSavedTimeEnd": {
|
||||||
|
"message": " heidän elämästään."
|
||||||
|
},
|
||||||
|
"changeUserID": {
|
||||||
|
"message": "Tuo/vie sinun UserID:si"
|
||||||
|
},
|
||||||
|
"setUserID": {
|
||||||
|
"message": "Aseta UserID"
|
||||||
|
},
|
||||||
|
"supportInvidious": {
|
||||||
|
"message": "Tue Invidious:ta"
|
||||||
|
},
|
||||||
|
"addInvidiousInstance": {
|
||||||
|
"message": "Lisää Invidious-instanssi"
|
||||||
|
},
|
||||||
|
"add": {
|
||||||
|
"message": "Lisää"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstance": {
|
||||||
|
"message": "Nollaa Invidious-instanssien lista"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstanceAlert": {
|
||||||
|
"message": "Olet nollaamassa Invidious-instanssien listan"
|
||||||
|
},
|
||||||
|
"currentInstances": {
|
||||||
|
"message": "Nykyiset instanssit:"
|
||||||
|
},
|
||||||
|
"minDuration": {
|
||||||
|
"message": "Vähimmäiskesto (sekuntia):"
|
||||||
|
},
|
||||||
|
"showUploadButton": {
|
||||||
|
"message": "Näytä lähetä-painike"
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"message": "Tallenna"
|
||||||
|
},
|
||||||
|
"reset": {
|
||||||
|
"message": "Nollaa"
|
||||||
|
},
|
||||||
|
"mobileUpdateInfo": {
|
||||||
|
"message": "m.youtube.com-osoitetta tuetaan nyt"
|
||||||
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Vie/tuo kaikki asetukset"
|
||||||
|
},
|
||||||
|
"setOptions": {
|
||||||
|
"message": "Käytä asetuksia"
|
||||||
|
},
|
||||||
|
"confirmNoticeTitle": {
|
||||||
|
"message": "Lähetä kohta"
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"message": "Jatka"
|
||||||
|
},
|
||||||
|
"cancel": {
|
||||||
|
"message": "Peruuta"
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"message": "Poista"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"message": "Esikatsele"
|
||||||
|
},
|
||||||
|
"edit": {
|
||||||
|
"message": "Muokkaa"
|
||||||
|
},
|
||||||
|
"copyDebugInformationFailed": {
|
||||||
|
"message": "Kirjoittaminen leikepöydälle epäonnistui"
|
||||||
|
},
|
||||||
|
"theKey": {
|
||||||
|
"message": "Näppäin"
|
||||||
|
},
|
||||||
|
"keyAlreadyUsedByYouTube": {
|
||||||
|
"message": "on jo YouTuben käytössä. Valitse toinen näppäin."
|
||||||
|
},
|
||||||
|
"keyAlreadyUsed": {
|
||||||
|
"message": "on jo liitetty toiseen toimintoon. Valitse toinen näppäin."
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"message": "-",
|
||||||
|
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||||
|
},
|
||||||
|
"category_sponsor": {
|
||||||
|
"message": "Sponsori"
|
||||||
|
},
|
||||||
|
"category_intro": {
|
||||||
|
"message": "Intro-animaatio"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "Loppukortit/-tekstit"
|
||||||
|
},
|
||||||
|
"category_interaction": {
|
||||||
|
"message": "Vuorovaikutusmuistutus (tilaaminen)"
|
||||||
|
},
|
||||||
|
"category_selfpromo": {
|
||||||
|
"message": "Itsepromootio ja fanituotteet"
|
||||||
|
},
|
||||||
|
"category_music_offtopic": {
|
||||||
|
"message": "Musiikki: muussa kuin Musiikki-osiossa"
|
||||||
|
},
|
||||||
|
"category_livestream_messages": {
|
||||||
|
"message": "Livestream: lahjoituksen/viestin lukeminen"
|
||||||
|
},
|
||||||
|
"disable": {
|
||||||
|
"message": "Poista käytöstä"
|
||||||
|
},
|
||||||
|
"manualSkip": {
|
||||||
|
"message": "Manuaalinen ohitus"
|
||||||
|
},
|
||||||
|
"enableTestingServer": {
|
||||||
|
"message": "Ota betatestauspalvelin käyttöön"
|
||||||
|
},
|
||||||
|
"bracketNow": {
|
||||||
|
"message": "(Nyt)"
|
||||||
|
},
|
||||||
|
"moreCategories": {
|
||||||
|
"message": "Lisää kategorioita"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Päättyy)"
|
||||||
|
},
|
||||||
|
"hiddenDueToDownvote": {
|
||||||
|
"message": "piilotettu: miinusääniä"
|
||||||
|
},
|
||||||
|
"hiddenDueToDuration": {
|
||||||
|
"message": "piilotettu: liian lyhyt"
|
||||||
|
},
|
||||||
|
"channelDataNotFound": {
|
||||||
|
"message": "Kanavatunnusta ei ole vielä ladattu."
|
||||||
|
},
|
||||||
|
"downvoteDescription": {
|
||||||
|
"message": "Virheellinen/väärä aika"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Väärä kategoria"
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Useita kohtia"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -35,8 +35,8 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "segments commerciaux"
|
"message": "segments commerciaux"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
"upvoteButtonInfo": {
|
||||||
"message": "Message commercial passé"
|
"message": "Voter pour cette entrée"
|
||||||
},
|
},
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Signaler"
|
"message": "Signaler"
|
||||||
@@ -71,6 +71,9 @@
|
|||||||
"paused": {
|
"paused": {
|
||||||
"message": "En pause"
|
"message": "En pause"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Timer arrêté"
|
||||||
|
},
|
||||||
"confirmMSG": {
|
"confirmMSG": {
|
||||||
"message": "Pour modifier ou supprimer des soumissions, cliquez sur le bouton d'info ou ouvrez la fenêtre de l'extension en cliquant sur son icône dans le coin en haut à droite."
|
"message": "Pour modifier ou supprimer des soumissions, cliquez sur le bouton d'info ou ouvrez la fenêtre de l'extension en cliquant sur son icône dans le coin en haut à droite."
|
||||||
},
|
},
|
||||||
@@ -84,7 +87,7 @@
|
|||||||
"message": "Les messages commerciaux pour cette vidéo sont déjà dans notre base de donnée !"
|
"message": "Les messages commerciaux pour cette vidéo sont déjà dans notre base de donnée !"
|
||||||
},
|
},
|
||||||
"sponsor404": {
|
"sponsor404": {
|
||||||
"message": "Pas de sponsors trouvés"
|
"message": "Pas de messages commerciaux trouvés"
|
||||||
},
|
},
|
||||||
"sponsorStart": {
|
"sponsorStart": {
|
||||||
"message": "Début du message commercial"
|
"message": "Début du message commercial"
|
||||||
@@ -144,7 +147,7 @@
|
|||||||
"message": "Vous avez soumis jusqu'à présent"
|
"message": "Vous avez soumis jusqu'à présent"
|
||||||
},
|
},
|
||||||
"savedPeopleFrom": {
|
"savedPeopleFrom": {
|
||||||
"message": "Vous avez fait gagner aux autres "
|
"message": "Vous avez permis aux autres de passer "
|
||||||
},
|
},
|
||||||
"viewLeaderboard": {
|
"viewLeaderboard": {
|
||||||
"message": "Consulter le classement"
|
"message": "Consulter le classement"
|
||||||
@@ -216,7 +219,7 @@
|
|||||||
"message": "Activer le suivi des vues de segments commerciaux"
|
"message": "Activer le suivi des vues de segments commerciaux"
|
||||||
},
|
},
|
||||||
"whatViewTracking": {
|
"whatViewTracking": {
|
||||||
"message": "Cette fonctionnalité suit quels segments commerciaux vous avez sautés afin de calculer le bénéfice des soumissions des \nautres utilisateurs. Elle est également utilisée comme métrique, avec les haut-votes, afin de s'assurer que les spams \nsont ignorés. L'extension envoie un message au serveur à chauqe fois qu'un segment commercial est sauté. Avec un peu de chance, peu de personnes désactiveront cette fonctionnalité afin d'obtenir des nombres de vues exacts. :)"
|
"message": "Cette fonctionnalité suit quels segments commerciaux vous avez sautés afin de calculer le bénéfice des soumissions des \nautres utilisateurs. Elle est également utilisée comme métrique, avec les haut-votes, afin de s'assurer que les spams \nsont ignorés. L'extension envoie un message au serveur à chauque fois qu'un segment commercial est sauté. Avec un peu de chance, peu de personnes désactiveront cette fonctionnalité afin d'obtenir des nombres de vues exacts. :)"
|
||||||
},
|
},
|
||||||
"showNotice": {
|
"showNotice": {
|
||||||
"message": "Afficher la notification"
|
"message": "Afficher la notification"
|
||||||
@@ -272,12 +275,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Code d'erreur : "
|
"message": "Code d'erreur : "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Passer le sponsor ?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Passer"
|
"message": "Passer"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Passé"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Désactiver le passage automatique"
|
"message": "Désactiver le passage automatique"
|
||||||
},
|
},
|
||||||
@@ -324,7 +327,7 @@
|
|||||||
"message": "Vérifiez status.sponsor.ajay.app pour le status du serveur."
|
"message": "Vérifiez status.sponsor.ajay.app pour le status du serveur."
|
||||||
},
|
},
|
||||||
"changeUserID": {
|
"changeUserID": {
|
||||||
"message": "Importer/Exporter votre ID d'utilisateur"
|
"message": "Importer/Exporter Votre ID d'Utilisateur"
|
||||||
},
|
},
|
||||||
"whatChangeUserID": {
|
"whatChangeUserID": {
|
||||||
"message": "Gardez ça privé. C'est comme un mot de passe et ne devrait pas être partagé avec quiconque. Si quelqu'un l'obtiens, il peut vous usurper."
|
"message": "Gardez ça privé. C'est comme un mot de passe et ne devrait pas être partagé avec quiconque. Si quelqu'un l'obtiens, il peut vous usurper."
|
||||||
@@ -350,6 +353,9 @@
|
|||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Soutenir Invidious"
|
"message": "Soutenir Invidious"
|
||||||
},
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) est un client tiers pour YouTube. Vous devez accepter des permissions supplémentaires pour activer son support. Cette fonctionnalité ne fonctionne pas en mode incognito sur Chrome et les autres variantes de Chromium."
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Activer Invidious, désactiver le passage automatique, masquer les boutons et plus encore."
|
"message": "Activer Invidious, désactiver le passage automatique, masquer les boutons et plus encore."
|
||||||
},
|
},
|
||||||
@@ -374,12 +380,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Instances actuelles:"
|
"message": "Instances actuelles:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Vote automatique"
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "Si cette option est activée, l'extension votera en faveur de tous les segments que vous visualiserez si vous ne les signalez pas. Si l'avis est désactivé, cela ne se produira pas."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Durée minimale (en secondes):"
|
"message": "Durée minimale (en secondes):"
|
||||||
},
|
},
|
||||||
@@ -392,11 +392,14 @@
|
|||||||
"showUploadButton": {
|
"showUploadButton": {
|
||||||
"message": "Afficher le bouton de téléchargement"
|
"message": "Afficher le bouton de téléchargement"
|
||||||
},
|
},
|
||||||
|
"whatUploadButton": {
|
||||||
|
"message": "Ce bouton apparaît sur le lecteur YouTube dès qu'un segment est prêt à être envoyé."
|
||||||
|
},
|
||||||
"customServerAddress": {
|
"customServerAddress": {
|
||||||
"message": "Adresse du serveur SponsorBlock"
|
"message": "Adresse du serveur SponsorBlock"
|
||||||
},
|
},
|
||||||
"customServerAddressDescription": {
|
"customServerAddressDescription": {
|
||||||
"message": "L'adresse que SponsorBlock utilise pour passer des appels vers le serveur.\nSauf si vous avez votre propre instance de serveur, cela ne devrait pas être changé."
|
"message": "L'adresse que SponsorBlock utilise pour faire des appels au serveur.\nSauf si vous avez votre propre instance de serveur, cela ne devrait pas être changé."
|
||||||
},
|
},
|
||||||
"save": {
|
"save": {
|
||||||
"message": "Sauvegarder"
|
"message": "Sauvegarder"
|
||||||
@@ -404,15 +407,42 @@
|
|||||||
"reset": {
|
"reset": {
|
||||||
"message": "Réinitialiser"
|
"message": "Réinitialiser"
|
||||||
},
|
},
|
||||||
|
"customAddressError": {
|
||||||
|
"message": "Le format de l'adresse est incorrect. Assurez-vous qu'elle commence bien par http:// ou https:// et ne termine pas par un slash."
|
||||||
|
},
|
||||||
|
"areYouSureReset": {
|
||||||
|
"message": "Voulez-vous vraiment remettre à zéro ?"
|
||||||
|
},
|
||||||
|
"confirmPrivacy": {
|
||||||
|
"message": "Cette vidéo est non-listée. Appuyez sur annuler si vous ne voulez pas vérifier la présence de message commerciaux."
|
||||||
|
},
|
||||||
"unlistedCheck": {
|
"unlistedCheck": {
|
||||||
"message": "Ignorer les vidéos non listées"
|
"message": "Ignorer les vidéos non listées"
|
||||||
},
|
},
|
||||||
|
"whatUnlistedCheck": {
|
||||||
|
"message": "Cette fonctionnalité ralentie légèrement SponsorBlock. La recherche des message commerciaux nécessite l'envoie de l'ID de la vidéo au serveur. Si vous êtes préoccupé par l'envoi de l'ID des vidéos non listées sur Internet, activez cette option."
|
||||||
|
},
|
||||||
"mobileUpdateInfo": {
|
"mobileUpdateInfo": {
|
||||||
"message": "m.youtube.com est maintenant pris en charge"
|
"message": "m.youtube.com est maintenant pris en charge"
|
||||||
},
|
},
|
||||||
"exportOptions": {
|
"exportOptions": {
|
||||||
"message": "Importer/Exporter toutes les options"
|
"message": "Importer/Exporter toutes les options"
|
||||||
},
|
},
|
||||||
|
"whatExportOptions": {
|
||||||
|
"message": "C'est votre configuration complète au format JSON. Elle inclut votre identifiant utilisateur, gardez-la pour vous."
|
||||||
|
},
|
||||||
|
"setOptions": {
|
||||||
|
"message": "Définir les options"
|
||||||
|
},
|
||||||
|
"exportOptionsWarning": {
|
||||||
|
"message": "Attention : La modification des options est permanente et peut casser votre installation. Êtes-vous sûr de vouloir faire ça ? Sauvegardez les anciennes au cas où."
|
||||||
|
},
|
||||||
|
"incorrectlyFormattedOptions": {
|
||||||
|
"message": "Ce JSON n'est pas formaté correctement. Vos options n'ont pas été modifiées."
|
||||||
|
},
|
||||||
|
"confirmNoticeTitle": {
|
||||||
|
"message": "Soumettre le segment"
|
||||||
|
},
|
||||||
"submit": {
|
"submit": {
|
||||||
"message": "Soumettre"
|
"message": "Soumettre"
|
||||||
},
|
},
|
||||||
@@ -422,14 +452,29 @@
|
|||||||
"delete": {
|
"delete": {
|
||||||
"message": "Supprimer"
|
"message": "Supprimer"
|
||||||
},
|
},
|
||||||
|
"preview": {
|
||||||
|
"message": "Aperçu"
|
||||||
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"message": "Éditer"
|
"message": "Éditer"
|
||||||
},
|
},
|
||||||
|
"copyDebugInformation": {
|
||||||
|
"message": "Copier les informations de débogage dans le presse-papiers"
|
||||||
|
},
|
||||||
|
"copyDebugInformationFailed": {
|
||||||
|
"message": "Impossible de copier dans le presse-papiers"
|
||||||
|
},
|
||||||
|
"copyDebugInformationOptions": {
|
||||||
|
"message": "Copie les informations dans le presse-papiers pour les fournir aux développeurs lors d'un rapport de bug ou lorsqu'un développeur le demande. Les informations sensibles telles que l'ID d'utilisateur, les chaînes sur liste blanche ou l'adresse du serveur personnalisé ont été supprimées. Cependant, ça contient des informations telles que votre user-agent, votre navigateur, votre système d'exploitation et le numéro de version d'extension. "
|
||||||
|
},
|
||||||
|
"copyDebugInformationComplete": {
|
||||||
|
"message": "Les informations de débogage ont été copiées dans le presse-papiers. N'hésitez pas à supprimer toute information que vous ne préférez pas partager. Enregistrez-les dans un fichier texte ou collez-les dans le rapport de bug."
|
||||||
|
},
|
||||||
"theKey": {
|
"theKey": {
|
||||||
"message": "La clé"
|
"message": "La clé"
|
||||||
},
|
},
|
||||||
"keyAlreadyUsedByYouTube": {
|
"keyAlreadyUsedByYouTube": {
|
||||||
"message": "est déjà utilisé par youtube. Veuillez sélectionner une autre clé."
|
"message": "est déjà utilisé par YouTube. Veuillez sélectionner une autre clé."
|
||||||
},
|
},
|
||||||
"keyAlreadyUsed": {
|
"keyAlreadyUsed": {
|
||||||
"message": "est lié à une autre action. Veuillez sélectionner une autre clé."
|
"message": "est lié à une autre action. Veuillez sélectionner une autre clé."
|
||||||
@@ -438,13 +483,88 @@
|
|||||||
"message": "à",
|
"message": "à",
|
||||||
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||||
},
|
},
|
||||||
|
"category_sponsor": {
|
||||||
|
"message": "Message commercial"
|
||||||
|
},
|
||||||
|
"category_intro": {
|
||||||
|
"message": "Générique d'introduction"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "Générique de fin"
|
||||||
|
},
|
||||||
|
"category_interaction": {
|
||||||
|
"message": "Rappel d'interaction (abonnement)"
|
||||||
|
},
|
||||||
|
"category_selfpromo": {
|
||||||
|
"message": "Auto-promotion et produits dérivés"
|
||||||
|
},
|
||||||
|
"category_music_offtopic": {
|
||||||
|
"message": "Musique : Segment non-musicale"
|
||||||
|
},
|
||||||
|
"category_livestream_messages": {
|
||||||
|
"message": "Stream : lecture de dons et messages"
|
||||||
|
},
|
||||||
|
"disable": {
|
||||||
|
"message": "Désactiver"
|
||||||
|
},
|
||||||
|
"manualSkip": {
|
||||||
|
"message": "Passer manuellement"
|
||||||
|
},
|
||||||
|
"showOverlay": {
|
||||||
|
"message": "Afficher dans la barre de progression"
|
||||||
|
},
|
||||||
"enableTestingServer": {
|
"enableTestingServer": {
|
||||||
"message": "Activer le serveur de test bêta"
|
"message": "Activer le serveur de test bêta"
|
||||||
},
|
},
|
||||||
|
"whatEnableTestingServer": {
|
||||||
|
"message": "Vos soumissions et votes NE COMPTERONT PAS sur le serveur principal. Utilisez ceci uniquement pour faire des tests."
|
||||||
|
},
|
||||||
|
"testingServerWarning": {
|
||||||
|
"message": "AUCUNE SOUMISSION OU VOTE DE COMPTERA sur le serveur principal tant que vous serez connecté au serveur de test. Désactivez ceci quand vous voudrez réellement soumettre ou voter."
|
||||||
|
},
|
||||||
"bracketNow": {
|
"bracketNow": {
|
||||||
"message": "(Maintenant)"
|
"message": "(Maintenant)"
|
||||||
},
|
},
|
||||||
"moreCategories": {
|
"moreCategories": {
|
||||||
"message": "Autres catégories"
|
"message": "Autres catégories"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Fin)"
|
||||||
|
},
|
||||||
|
"hiddenDueToDownvote": {
|
||||||
|
"message": "masqué : vote négatif"
|
||||||
|
},
|
||||||
|
"hiddenDueToDuration": {
|
||||||
|
"message": "masqué : trop court"
|
||||||
|
},
|
||||||
|
"channelDataNotFound": {
|
||||||
|
"message": "L'ID de la chaîne n'a pas encore été chargé."
|
||||||
|
},
|
||||||
|
"adblockerIssue": {
|
||||||
|
"message": "Il semble que quelque chose empêche SponsorBlock de récupérer les données de la vidéo. C'est probablement votre bloqueur de publicités. Veuillez consulter https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"itCouldBeAdblockerIssue": {
|
||||||
|
"message": "Si ça se reproduit, c'est peut-être causé par votre bloqueur de publicités. Veuillez consulter https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||||
|
},
|
||||||
|
"forceChannelCheck": {
|
||||||
|
"message": "Forcer la vérification de la chaîne avant de passer les message commerciaux"
|
||||||
|
},
|
||||||
|
"whatForceChannelCheck": {
|
||||||
|
"message": "Par défaut, les sponsors seront passés immédiatement, avant même que la chaîne soit connue. Des sponsors au début de la vidéo peuvent être passés sur des chaînes sur liste blanche. Activer cette option empêchera cela mais fera que les messages sponsorisés seront passés avec un petit délai, car la récupération du channelID peut prendre du temps. Ce délai peut être imperceptible si vous avez une connexion rapide."
|
||||||
|
},
|
||||||
|
"forceChannelCheckPopup": {
|
||||||
|
"message": "Envisagez d'activer la vérification forcée de la chaîne avant de passer les messages commerciaux"
|
||||||
|
},
|
||||||
|
"downvoteDescription": {
|
||||||
|
"message": "Segment de mauvaise qualité"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Mauvaise catégorie"
|
||||||
|
},
|
||||||
|
"nonMusicCategoryOnMusic": {
|
||||||
|
"message": "Cette vidéo est classée dans les musiques. Êtes-vous sûr de vouloir soumettre des segments non-musicaux ? Vous devriez soumettre ce segment uniquement si la vidéo est de la musique. Veuillez lire les recommandations en cas de confusion."
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Plusieurs segments"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1,22 @@
|
|||||||
{}
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "સ્પોન્સરબ્લોક",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"fullName": {
|
||||||
|
"message": "યુટ્યુબ માટે સ્પોન્સરબ્લોક - સ્પોન્સરશિપ છોડી દો",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"400": {
|
||||||
|
"message": "સર્વરે કહ્યું કે આ વિનંતી અમાન્ય છે"
|
||||||
|
},
|
||||||
|
"429": {
|
||||||
|
"message": "તમે આ એક વિડિઓ માટે ઘણી પ્રાયોજક વખત સબમિટ કરી છે, શું તમને ખાતરી છે કે આ ઘણા છે?"
|
||||||
|
},
|
||||||
|
"409": {
|
||||||
|
"message": "આ અગાઉ રજુ કરવામાં આવી છે"
|
||||||
|
},
|
||||||
|
"channelWhitelisted": {
|
||||||
|
"message": "ચેનલ વ્હાઇટલિસ્ટેડ!"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -31,15 +31,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "spezzoni sponsorizzati"
|
"message": "spezzoni sponsorizzati"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Sponsorizzazione Saltata"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Segnala"
|
"message": "Segnala"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Segnala questo spezzone come non corretto."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Chiudi"
|
"message": "Chiudi"
|
||||||
},
|
},
|
||||||
@@ -100,9 +94,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Hai già votato."
|
"message": "Hai già votato."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Sembra che il server non funzioni. Contatta subito lo sviluppatore."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Si è verificato un errore durante la connessione. Codice errore: "
|
"message": "Si è verificato un errore durante la connessione. Codice errore: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,40 @@
|
|||||||
{
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"fullName": {
|
||||||
|
"message": "SponsorBlock voor YouTube - Sla sponsorberichten over",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
|
"Description": {
|
||||||
|
"message": "Sla sponsoring over op YouTube video's. Rapporteer sponsors van video's die je bekijkt om tijd van anderen te besparen.",
|
||||||
|
"description": "Description of the extension."
|
||||||
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "sponsor"
|
||||||
|
},
|
||||||
|
"Sponsors": {
|
||||||
|
"message": "sponsoren"
|
||||||
|
},
|
||||||
|
"reportButtonTitle": {
|
||||||
|
"message": "Melden"
|
||||||
|
},
|
||||||
|
"Dismiss": {
|
||||||
|
"message": "Negeren"
|
||||||
|
},
|
||||||
|
"Loading": {
|
||||||
|
"message": "Bezig met laden..."
|
||||||
|
},
|
||||||
|
"Mins": {
|
||||||
|
"message": "Minuten"
|
||||||
|
},
|
||||||
|
"Secs": {
|
||||||
|
"message": "Seconden"
|
||||||
|
},
|
||||||
|
"Hide": {
|
||||||
|
"message": "Nooit weergeven"
|
||||||
|
},
|
||||||
"paused": {
|
"paused": {
|
||||||
"message": "Gepauzeerd"
|
"message": "Gepauzeerd"
|
||||||
},
|
},
|
||||||
@@ -26,9 +62,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "U hebt al eerder op deze manier gestemd."
|
"message": "U hebt al eerder op deze manier gestemd."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Het lijkt erop dat de server niet draait. Contacteer de ontwikkelaar onmiddellijk."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Er is een verbindingsfout opgetreden. Foutcode: "
|
"message": "Er is een verbindingsfout opgetreden. Foutcode: "
|
||||||
},
|
},
|
||||||
@@ -41,7 +74,120 @@
|
|||||||
"clearTimes": {
|
"clearTimes": {
|
||||||
"message": "Sponsortijden wissen"
|
"message": "Sponsortijden wissen"
|
||||||
},
|
},
|
||||||
|
"viewLeaderboard": {
|
||||||
|
"message": "Bekijk de ranglijst"
|
||||||
|
},
|
||||||
"here": {
|
"here": {
|
||||||
"message": "hier"
|
"message": "hier"
|
||||||
|
},
|
||||||
|
"clearTimesButton": {
|
||||||
|
"message": "Wis tijden"
|
||||||
|
},
|
||||||
|
"submitTimesButton": {
|
||||||
|
"message": "Dien tijden in"
|
||||||
|
},
|
||||||
|
"setUsername": {
|
||||||
|
"message": "Gebruikersnaam instellen"
|
||||||
|
},
|
||||||
|
"Options": {
|
||||||
|
"message": "Opties"
|
||||||
|
},
|
||||||
|
"showButtons": {
|
||||||
|
"message": "Toon knoppen op YouTube Player"
|
||||||
|
},
|
||||||
|
"hideButtons": {
|
||||||
|
"message": "Verberg knoppen op YouTube Player"
|
||||||
|
},
|
||||||
|
"showInfoButton": {
|
||||||
|
"message": "Toon info-knop op YouTube-speler"
|
||||||
|
},
|
||||||
|
"hideInfoButton": {
|
||||||
|
"message": "Verberg info-knop op YouTube Player"
|
||||||
|
},
|
||||||
|
"website": {
|
||||||
|
"message": "Website",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"sourceCode": {
|
||||||
|
"message": "Broncode",
|
||||||
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"disableSkipping": {
|
||||||
|
"message": "SponsorBlock uitschakelen"
|
||||||
|
},
|
||||||
|
"enableSkipping": {
|
||||||
|
"message": "SponsorBlock inschakelen"
|
||||||
|
},
|
||||||
|
"502": {
|
||||||
|
"message": "De server lijkt overbelast te zijn. Probeer het over een paar seconden opnieuw."
|
||||||
|
},
|
||||||
|
"errorCode": {
|
||||||
|
"message": "Foutcode: "
|
||||||
|
},
|
||||||
|
"skip": {
|
||||||
|
"message": "Overslaan"
|
||||||
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Overgeslagen"
|
||||||
|
},
|
||||||
|
"disableAutoSkip": {
|
||||||
|
"message": "Automatisch overslaan uitschakelen"
|
||||||
|
},
|
||||||
|
"enableAutoSkip": {
|
||||||
|
"message": "Automatisch overslaan inschakelen"
|
||||||
|
},
|
||||||
|
"autoSkipDescription": {
|
||||||
|
"message": "Automatisch Overslaan zal sponsors voor u overslaan. Indien uitgeschakeld, zal een bericht vragen of u wilt overslaan."
|
||||||
|
},
|
||||||
|
"audioNotification": {
|
||||||
|
"message": "Audiomelding bij Overslaan"
|
||||||
|
},
|
||||||
|
"audioNotificationDescription": {
|
||||||
|
"message": "Audiomelding bij overslaan zal een geluid afspelen wanneer een sponsor wordt overgeslagen. Indien uitgeschakeld (of automatisch overslaan is uitgeschakeld) wordt er geen geluid afgespeeld."
|
||||||
|
},
|
||||||
|
"minLower": {
|
||||||
|
"message": "minuut"
|
||||||
|
},
|
||||||
|
"minsLower": {
|
||||||
|
"message": "minuten"
|
||||||
|
},
|
||||||
|
"hourLower": {
|
||||||
|
"message": "uur"
|
||||||
|
},
|
||||||
|
"hoursLower": {
|
||||||
|
"message": "uren"
|
||||||
|
},
|
||||||
|
"guildlinesSummary": {
|
||||||
|
"message": "- Zorg ervoor dat uw segment alleen betaalde promoties bevat, niets anders.\n- Zorg ervoor dat het overslaan van dit segment geen waardevolle inhoud overslaat\n- Als de hele video een sponsorsegment is, rapporteer dit alstublieft niet. Binnenkort komt er een systeem om volledige video's te rapporteren.\n- Rapporteer alstublieft geen disclaimers die partijdig kunnen zijn (als een recensievideo gesponsord is, sla deze niet over wanneer ze dit vermelden)."
|
||||||
|
},
|
||||||
|
"whatChangeUserID": {
|
||||||
|
"message": "Dit moet privé blijven. Beschouw dit als wachtwoord en mag met niemand worden gedeeld. Als iemand dit heeft, kunnen ze je imiteren."
|
||||||
|
},
|
||||||
|
"autoSkip": {
|
||||||
|
"message": "Automatisch overslaan"
|
||||||
|
},
|
||||||
|
"showSkipNotice": {
|
||||||
|
"message": "Toon melding na een sponsor is overgeslagen"
|
||||||
|
},
|
||||||
|
"minDuration": {
|
||||||
|
"message": "Minimale duur (seconden):"
|
||||||
|
},
|
||||||
|
"showUploadButton": {
|
||||||
|
"message": "Toon Upload Knop"
|
||||||
|
},
|
||||||
|
"customServerAddress": {
|
||||||
|
"message": "SponsorBlock Serveradres"
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"message": "Bewaren"
|
||||||
|
},
|
||||||
|
"mobileUpdateInfo": {
|
||||||
|
"message": "m.youtube.com wordt nu ondersteund"
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"message": "Bevestigen"
|
||||||
|
},
|
||||||
|
"cancel": {
|
||||||
|
"message": "Annuleren"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,42 +1,43 @@
|
|||||||
{
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
"fullName": {
|
"fullName": {
|
||||||
"message": "SponsorBlock na YouTube - Omiń reklamy sponsorów",
|
"message": "SponsorBlock na YouTube - Omiń reklamy sponsorów",
|
||||||
"description": "Name of the extension."
|
"description": "Name of the extension."
|
||||||
},
|
},
|
||||||
"Description": {
|
"Description": {
|
||||||
"message": "Przewijaj reklamy sponsorów w filmach na YouTube. Zgłaszaj reklamy w nagraniach żeby nie marnować czasu innych.",
|
"message": "Przewijaj reklamy sponsorów w filmach na YouTube. Zgłaszaj sponsorzy w filmach żeby oszczędzać czas innych.",
|
||||||
"description": "Description of the extension."
|
"description": "Description of the extension."
|
||||||
},
|
},
|
||||||
"400": {
|
"400": {
|
||||||
"message": "Serwer odpowiedział, że to zapytanie jest niepoprawne"
|
"message": "Serwer odpowiedział, że to zapytanie jest niepoprawne"
|
||||||
},
|
},
|
||||||
"429": {
|
"429": {
|
||||||
"message": "Zgłosiłeś bardzo dużo segmentów reklamowych dla tego jednego nagrania, jesteś pewien, że jest ich tak dużo?"
|
"message": "Zgłosiłeś za dużo segmentów sponsora dla tego jednego filmu. Jesteś pewien, że jest ich tak dużo?"
|
||||||
},
|
},
|
||||||
"409": {
|
"409": {
|
||||||
"message": "Treść została już wcześniej zgłoszona"
|
"message": "To już zostało wcześniej zgłoszone"
|
||||||
},
|
},
|
||||||
"channelWhitelisted": {
|
"channelWhitelisted": {
|
||||||
"message": "Kanał dodany do wyjątków!"
|
"message": "Kanał dodany do wyjątków!"
|
||||||
},
|
},
|
||||||
|
"Sponsor": {
|
||||||
|
"message": "sponsor"
|
||||||
|
},
|
||||||
"Sponsors": {
|
"Sponsors": {
|
||||||
"message": "sponsorzy"
|
"message": "sponsorzy"
|
||||||
},
|
},
|
||||||
"Segment": {
|
"Segment": {
|
||||||
"message": "segmet sponsorowany"
|
"message": "segment sponsorowany"
|
||||||
},
|
},
|
||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "segmenty sponsorowane"
|
"message": "segmenty sponsorowane"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Segment przewinięty"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Zgłoś"
|
"message": "Zgłoś"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Zgłoś ten segment reklamowy jako nieprawidłowy."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Odrzuć"
|
"message": "Odrzuć"
|
||||||
},
|
},
|
||||||
@@ -74,16 +75,16 @@
|
|||||||
"message": "Wystąpił błąd podczas przesyłania twojego zgłoszenia, proszę spróbować ponownie później."
|
"message": "Wystąpił błąd podczas przesyłania twojego zgłoszenia, proszę spróbować ponownie później."
|
||||||
},
|
},
|
||||||
"sponsorFound": {
|
"sponsorFound": {
|
||||||
"message": "Segmenty reklamowe dla tego nagrania są już w bazie!"
|
"message": "Segmenty sponsora dla tego nagrania są już w bazie!"
|
||||||
},
|
},
|
||||||
"sponsor404": {
|
"sponsor404": {
|
||||||
"message": "Nie znaleziono segmentów reklamowych"
|
"message": "Nie znaleziono segmentów sponsora"
|
||||||
},
|
},
|
||||||
"sponsorStart": {
|
"sponsorStart": {
|
||||||
"message": "Reklama zaczyna się teraz"
|
"message": "Sponsor zaczyna się teraz"
|
||||||
},
|
},
|
||||||
"sponsorEnd": {
|
"sponsorEnd": {
|
||||||
"message": "Reklama kończy się teraz"
|
"message": "Sponsor kończy się teraz"
|
||||||
},
|
},
|
||||||
"noVideoID": {
|
"noVideoID": {
|
||||||
"message": "Nie znaleziono nagrania wideo w tej karcie. Jeśli wiesz, że to karta YouTube'a, zamknij to okienko i otwórz je ponownie. Jeśli to nie zadziała spróbuj przeładować stronę."
|
"message": "Nie znaleziono nagrania wideo w tej karcie. Jeśli wiesz, że to karta YouTube'a, zamknij to okienko i otwórz je ponownie. Jeśli to nie zadziała spróbuj przeładować stronę."
|
||||||
@@ -97,26 +98,23 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Już na to głosowałeś."
|
"message": "Już na to głosowałeś."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Wygląda na to, że serwer nie działa. Skontaktuj się z dewloperem."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Błąd z połączeniem. Kod błędu: "
|
"message": "Błąd z połączeniem. Kod błędu: "
|
||||||
},
|
},
|
||||||
"wantToSubmit": {
|
"wantToSubmit": {
|
||||||
"message": "Chcesz zgłosić segment sponsorowany dla nagrania z id"
|
"message": "Chcesz zgłosić segment sponsorowany dla filmu z id"
|
||||||
},
|
},
|
||||||
"leftTimes": {
|
"leftTimes": {
|
||||||
"message": "Wygląda na to, że masz nie wysłane segmenty reklamowe. Cofnij się do tej strony i zgłoś je (nie zostały usunięte)."
|
"message": "Wygląda na to, że masz nie wysłane segmenty sponsora. Cofnij się do tej strony żeby je zgłosić (nie zostały usunięte)."
|
||||||
},
|
},
|
||||||
"clearTimes": {
|
"clearTimes": {
|
||||||
"message": "Wyczyść segmenty reklamowe"
|
"message": "Usuń segmenty reklamowe"
|
||||||
},
|
},
|
||||||
"openPopup": {
|
"openPopup": {
|
||||||
"message": "Otwórz okienko SponsorBlock"
|
"message": "Otwórz okienko SponsorBlock"
|
||||||
},
|
},
|
||||||
"SubmitTimes": {
|
"SubmitTimes": {
|
||||||
"message": "Zgłoś segmenty reklamowe"
|
"message": "Zgłoś segmenty sponsora"
|
||||||
},
|
},
|
||||||
"submitCheck": {
|
"submitCheck": {
|
||||||
"message": "Jesteś pewien, że chcesz to zgłosić?"
|
"message": "Jesteś pewien, że chcesz to zgłosić?"
|
||||||
@@ -128,10 +126,10 @@
|
|||||||
"message": "Usuń kanał z listy wyjątków"
|
"message": "Usuń kanał z listy wyjątków"
|
||||||
},
|
},
|
||||||
"voteOnTime": {
|
"voteOnTime": {
|
||||||
"message": "Głosuj na segment reklamowy"
|
"message": "Głosuj na segment sponsora"
|
||||||
},
|
},
|
||||||
"recordTimes": {
|
"recordTimes": {
|
||||||
"message": "Nagraj czasy segmentów reklamowych"
|
"message": "Nagraj czasy segmentów sponsorowanych"
|
||||||
},
|
},
|
||||||
"soFarUHSubmited": {
|
"soFarUHSubmited": {
|
||||||
"message": "Jak na razie zgłosiłeś:"
|
"message": "Jak na razie zgłosiłeś:"
|
||||||
@@ -265,9 +263,6 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Kod błędu: "
|
"message": "Kod błędu: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Przewinąć reklamę?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Przewiń"
|
"message": "Przewiń"
|
||||||
},
|
},
|
||||||
@@ -337,6 +332,9 @@
|
|||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Wesprzyj Invidious"
|
"message": "Wesprzyj Invidious"
|
||||||
},
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) to nieoficjalny klient YouTube'a. Aby włączyć dla niego wsparcie musisz przyznać dodatkowe uprawnienia. W Chrome'ie i innych przeglądarkach bazujących na Chromium, ta opcja nie działa w trybie incognito."
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Wesprzyj Invidious, wyłącz auto przewijanie, ukryj guziki i więcej."
|
"message": "Wesprzyj Invidious, wyłącz auto przewijanie, ukryj guziki i więcej."
|
||||||
},
|
},
|
||||||
@@ -361,10 +359,16 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Obecne instancje:"
|
"message": "Obecne instancje:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
"minDuration": {
|
||||||
"message": "Auto potwierdzanie"
|
"message": "Minimalny czas trwania (sekundy):"
|
||||||
},
|
},
|
||||||
"whatAutoUpvote": {
|
"mobileUpdateInfo": {
|
||||||
"message": "To ustawienie sprawia, że wszystkie przewinięte przez ciebie a nie zgłoszone jako błąd segmenty reklamowe zostaną potwierdzone jako prawidłowe. Ta opcja nie działa jeśli okienko z informacją o przewinięciu jest ukryte."
|
"message": "m.youtube.com jest teraz wspierany"
|
||||||
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Importuj/Eksportuj wszystkie ustawienia"
|
||||||
|
},
|
||||||
|
"copyDebugInformationComplete": {
|
||||||
|
"message": "Informacje do debugowania zostały skopiowane do schowka. Możesz usunąć dane, których nie chcesz udostępniać. Zapisz je w pliku tekstowym albo wklej do raportu podczas zgłaszania błędu."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
"fullName": {
|
"fullName": {
|
||||||
"message": "SponsorBlock para YouTube - Pule patrocínios",
|
"message": "SponsorBlock para YouTube - Pule patrocínios",
|
||||||
"description": "Name of the extension."
|
"description": "Name of the extension."
|
||||||
@@ -31,15 +35,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "segmentos de patrocinadores"
|
"message": "segmentos de patrocinadores"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Patrocinador pulado"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Reportar"
|
"message": "Reportar"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Reportar essa subimissão como inválida."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Ignorar"
|
"message": "Ignorar"
|
||||||
},
|
},
|
||||||
@@ -100,9 +98,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Você já votou antes."
|
"message": "Você já votou antes."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Parece que o servidor caiu. Contate o desenvolvedor o quanto antes."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Um erro de conexão aconteceu: Código: "
|
"message": "Um erro de conexão aconteceu: Código: "
|
||||||
},
|
},
|
||||||
@@ -149,22 +144,22 @@
|
|||||||
"message": "aqui"
|
"message": "aqui"
|
||||||
},
|
},
|
||||||
"recordTimesDescription": {
|
"recordTimesDescription": {
|
||||||
"message": "Carregue neste botão abaixo quando o patrocínio começar e quando\n acabar para registar e submetê-lo à base de dados"
|
"message": "Clique no botão abaixo quando o patrocínio começar e quando terminar para registrar e submetê-lo à base de dados."
|
||||||
},
|
},
|
||||||
"popupHint": {
|
"popupHint": {
|
||||||
"message": "Dica: Carregue na tecla ; enquanto num vídeo para registar o começo/fim de um patrocínio e \" para submeter"
|
"message": "Dica: Aperte a tecla ; enquanto reproduzir o vídeo para registar o começo/fim de um patrocínio e \" para enviar. (Essa configuração pode ser mudada em opções.)"
|
||||||
},
|
},
|
||||||
"lastTimes": {
|
"lastTimes": {
|
||||||
"message": "Intervalos de Patrocínios Escolhidos mais Recentemente"
|
"message": "Últimos Intervalos de Patrocínios Seleciados"
|
||||||
},
|
},
|
||||||
"clearTimesButton": {
|
"clearTimesButton": {
|
||||||
"message": "Limpar Intervalos"
|
"message": "Limpar Intervalos"
|
||||||
},
|
},
|
||||||
"submitTimesButton": {
|
"submitTimesButton": {
|
||||||
"message": "Submeter Intervalos"
|
"message": "Enviar Intervalos"
|
||||||
},
|
},
|
||||||
"publicStats": {
|
"publicStats": {
|
||||||
"message": "Isto é usado na página pública de estatísticas que mostra o quanto já contríbuíu. Veje-a"
|
"message": "Isso é usado na página pública de estatísticas que mostra o quanto você já contríbuíu. Veja-a"
|
||||||
},
|
},
|
||||||
"setUsername": {
|
"setUsername": {
|
||||||
"message": "Criar nomde de utilizador"
|
"message": "Criar nomde de utilizador"
|
||||||
@@ -228,5 +223,327 @@
|
|||||||
"sourceCode": {
|
"sourceCode": {
|
||||||
"message": "Código fonte",
|
"message": "Código fonte",
|
||||||
"description": "Used on Firefox Store Page"
|
"description": "Used on Firefox Store Page"
|
||||||
|
},
|
||||||
|
"noticeUpdate": {
|
||||||
|
"message": "A notificação foi atualizada!",
|
||||||
|
"description": "The first line of the message displayed after the notice was upgraded."
|
||||||
|
},
|
||||||
|
"noticeUpdate2": {
|
||||||
|
"message": "Se você ainda não gostar dessa, aperte o botão não mostrar novamente.",
|
||||||
|
"description": "The second line of the message displayed after the notice was upgraded."
|
||||||
|
},
|
||||||
|
"setStartSponsorShortcut": {
|
||||||
|
"message": "Defina a tecla para que marca o início do patrocínio"
|
||||||
|
},
|
||||||
|
"setSubmitKeybind": {
|
||||||
|
"message": "Defina a tecla para enviar o segmento de patrocínio"
|
||||||
|
},
|
||||||
|
"keybindDescription": {
|
||||||
|
"message": "Selecione uma tecla apertando-a"
|
||||||
|
},
|
||||||
|
"keybindDescriptionComplete": {
|
||||||
|
"message": "A tecla foi definida para: "
|
||||||
|
},
|
||||||
|
"0": {
|
||||||
|
"message": "Tempo limite de conexão excedida. Cheque a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está sobrecarregado ou fora do ar."
|
||||||
|
},
|
||||||
|
"disableSkipping": {
|
||||||
|
"message": "Desativar SponsorBlock"
|
||||||
|
},
|
||||||
|
"enableSkipping": {
|
||||||
|
"message": "Ativar SponsorBlock"
|
||||||
|
},
|
||||||
|
"yourWork": {
|
||||||
|
"message": "Suas submissões",
|
||||||
|
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||||
|
},
|
||||||
|
"502": {
|
||||||
|
"message": "O servidor parece estar sobrecarregado. Tente novamente em alguns segundos."
|
||||||
|
},
|
||||||
|
"errorCode": {
|
||||||
|
"message": "Código de erro: "
|
||||||
|
},
|
||||||
|
"skip": {
|
||||||
|
"message": "Pular"
|
||||||
|
},
|
||||||
|
"disableAutoSkip": {
|
||||||
|
"message": "Desativar Salto Automático"
|
||||||
|
},
|
||||||
|
"enableAutoSkip": {
|
||||||
|
"message": "Ativar Salto Automático"
|
||||||
|
},
|
||||||
|
"autoSkipDescription": {
|
||||||
|
"message": "Pular automaticamente irá pular patrocínios por você. Se desabilitado, um aviso irá aparecer perguntando se deseja pular o anúncio."
|
||||||
|
},
|
||||||
|
"audioNotification": {
|
||||||
|
"message": "Notificação de áudio ao pular"
|
||||||
|
},
|
||||||
|
"audioNotificationDescription": {
|
||||||
|
"message": "A notificação de áudio ao pular irá tocar um som sempre que um patrocínio for ignorado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."
|
||||||
|
},
|
||||||
|
"youHaveSkipped": {
|
||||||
|
"message": "Você pulou "
|
||||||
|
},
|
||||||
|
"youHaveSaved": {
|
||||||
|
"message": "Você poupou "
|
||||||
|
},
|
||||||
|
"minLower": {
|
||||||
|
"message": "minuto"
|
||||||
|
},
|
||||||
|
"minsLower": {
|
||||||
|
"message": "minutos"
|
||||||
|
},
|
||||||
|
"hourLower": {
|
||||||
|
"message": "hora"
|
||||||
|
},
|
||||||
|
"hoursLower": {
|
||||||
|
"message": "horas"
|
||||||
|
},
|
||||||
|
"youHaveSavedTime": {
|
||||||
|
"message": "Você poupou outros"
|
||||||
|
},
|
||||||
|
"youHaveSavedTimeEnd": {
|
||||||
|
"message": " de suas vidas."
|
||||||
|
},
|
||||||
|
"guildlinesSummary": {
|
||||||
|
"message": "- Certifique-se de que seu segmento contém apenas patrocínio, nada mais.\n- Certifique-se de que pular esse segmento não vai pular conteúdo importante.\n- Se todo o vídeo for patrocinado, por favor não o denuncie. Um sistema completo de relatório de vídeo virá em breve.\n- Por favor, não denuncie avisos de parcialidade do vídeo (se um vídeo de avaliação for patrocinado, não pule quando eles mencionarem que é patrocinado)."
|
||||||
|
},
|
||||||
|
"statusReminder": {
|
||||||
|
"message": "Verifique status.sponsor.ajay.app para o status do servidor."
|
||||||
|
},
|
||||||
|
"changeUserID": {
|
||||||
|
"message": "Importar/Exportar seu ID de usuário"
|
||||||
|
},
|
||||||
|
"whatChangeUserID": {
|
||||||
|
"message": "Isso deve ser mantido em segredo. É como se fosse uma senha e não deve ser compartilhado com ninguém. Se alguém tiver isso, poderá se passar por você."
|
||||||
|
},
|
||||||
|
"setUserID": {
|
||||||
|
"message": "Definir ID de usuário"
|
||||||
|
},
|
||||||
|
"userIDChangeWarning": {
|
||||||
|
"message": "Atenção: A alteração do ID de usuário é permanente. Você tem certeza que deseja fazer isso? Certifique-se de fazer backup de seu ID antigo por precaução."
|
||||||
|
},
|
||||||
|
"createdBy": {
|
||||||
|
"message": "Criado por"
|
||||||
|
},
|
||||||
|
"autoSkip": {
|
||||||
|
"message": "Pular automaticamente"
|
||||||
|
},
|
||||||
|
"showSkipNotice": {
|
||||||
|
"message": "Mostrar aviso após um patrocínio ser ignorado"
|
||||||
|
},
|
||||||
|
"keybindCurrentlySet": {
|
||||||
|
"message": ". Atualmente, está definido para:"
|
||||||
|
},
|
||||||
|
"supportInvidious": {
|
||||||
|
"message": "Apoiar Invidious"
|
||||||
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) é um cliente para YouTube de terceiros. Para ativar o apoio, você precisa aceitar as permissões adicionais. Isso não funciona em modo anônimo no Chrome ou em outras variantes do Chromium."
|
||||||
|
},
|
||||||
|
"optionsInfo": {
|
||||||
|
"message": "Ativar apoio ao Invidious, desabilitar pular automaticamente, ocultar botões e mais."
|
||||||
|
},
|
||||||
|
"addInvidiousInstance": {
|
||||||
|
"message": "Adicionar instância do Invidious"
|
||||||
|
},
|
||||||
|
"addInvidiousInstanceDescription": {
|
||||||
|
"message": "Adicionar uma instância personalizada do Invidious. Deve ser formatado com APENAS o domínio. Exemplo: invidious.ajay.app"
|
||||||
|
},
|
||||||
|
"add": {
|
||||||
|
"message": "Adicionar"
|
||||||
|
},
|
||||||
|
"addInvidiousInstanceError": {
|
||||||
|
"message": "Este é um domínio inválido. Ele deve incluir APENAS a parte do domínio. Exemplo: invidious.ajay.app"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstance": {
|
||||||
|
"message": "Redefinir Lista de Instâncias do Invidious"
|
||||||
|
},
|
||||||
|
"resetInvidiousInstanceAlert": {
|
||||||
|
"message": "Você está prestes a redefinir a lista de instâncias do Invidious"
|
||||||
|
},
|
||||||
|
"currentInstances": {
|
||||||
|
"message": "Instâncias Atuais:"
|
||||||
|
},
|
||||||
|
"minDuration": {
|
||||||
|
"message": "Duração mínima (segundos):"
|
||||||
|
},
|
||||||
|
"minDurationDescription": {
|
||||||
|
"message": "Segmentos de patrocinadores menores do que o valor definido não serão pulados ou mostrados no reprodutor."
|
||||||
|
},
|
||||||
|
"shortCheck": {
|
||||||
|
"message": "A seguinte submissão é mais curta do que sua opção de duração mínima. Isto significa que já foi enviada e que está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?"
|
||||||
|
},
|
||||||
|
"showUploadButton": {
|
||||||
|
"message": "Mostrar botão de envio"
|
||||||
|
},
|
||||||
|
"whatUploadButton": {
|
||||||
|
"message": "Este botão aparece no reprodutor do YouTube depois de ter selecionado um carimbo de data/hora e está pronto para ser enviado."
|
||||||
|
},
|
||||||
|
"customServerAddress": {
|
||||||
|
"message": "Endereço do servidor do SponsorBlock"
|
||||||
|
},
|
||||||
|
"customServerAddressDescription": {
|
||||||
|
"message": "Endereço que o SponsorBlock usa para fazer chamadas ao servidor.\nA menos que você tenha sua própria instância de servidor, isso não deve ser alterado."
|
||||||
|
},
|
||||||
|
"save": {
|
||||||
|
"message": "Salvar"
|
||||||
|
},
|
||||||
|
"reset": {
|
||||||
|
"message": "Redefinir"
|
||||||
|
},
|
||||||
|
"customAddressError": {
|
||||||
|
"message": "Este endereço não está na forma correta. Certifique-se de que possui http:// ou https:// no início e sem barras no final."
|
||||||
|
},
|
||||||
|
"areYouSureReset": {
|
||||||
|
"message": "Tem certeza que deseja redefinir?"
|
||||||
|
},
|
||||||
|
"confirmPrivacy": {
|
||||||
|
"message": "O este vídeo está marcado como não listado. Clique em cancelar se você não deseja verificar se há patrocínios."
|
||||||
|
},
|
||||||
|
"unlistedCheck": {
|
||||||
|
"message": "Ignorar vídeos não listados/privados"
|
||||||
|
},
|
||||||
|
"whatUnlistedCheck": {
|
||||||
|
"message": "Esta configuração irá diminuir um pouco o desempenho do SponsorBlock. As pesquisas do patrocinador exigem que se envie o ID do vídeo para o servidor. Se você estiver preocupado com o envio de IDs de vídeo não listados pela internet, habilite essa opção."
|
||||||
|
},
|
||||||
|
"mobileUpdateInfo": {
|
||||||
|
"message": "m.youtube.com agora é suportado"
|
||||||
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Importar/Exportar Todas as Opções"
|
||||||
|
},
|
||||||
|
"whatExportOptions": {
|
||||||
|
"message": "Essa suas preferências em JSON. Isso inclui seu ID de usuário, então lembre-se de compartilhar com cuidado."
|
||||||
|
},
|
||||||
|
"setOptions": {
|
||||||
|
"message": "Definir Opções"
|
||||||
|
},
|
||||||
|
"exportOptionsWarning": {
|
||||||
|
"message": "Aviso: Alterar as opções é permanente e pode fazer a extensão parar de funcionar. Tem certeza que deseja fazer isso? Certifique-se de fazer um backup de seu antigo por precaução."
|
||||||
|
},
|
||||||
|
"incorrectlyFormattedOptions": {
|
||||||
|
"message": "Este JSON não está formatado corretamente. Suas opções não foram alteradas."
|
||||||
|
},
|
||||||
|
"confirmNoticeTitle": {
|
||||||
|
"message": "Enviar Segmento"
|
||||||
|
},
|
||||||
|
"submit": {
|
||||||
|
"message": "Enviar"
|
||||||
|
},
|
||||||
|
"cancel": {
|
||||||
|
"message": "Cancelar"
|
||||||
|
},
|
||||||
|
"delete": {
|
||||||
|
"message": "Deletar"
|
||||||
|
},
|
||||||
|
"preview": {
|
||||||
|
"message": "Pré-visualizar"
|
||||||
|
},
|
||||||
|
"edit": {
|
||||||
|
"message": "Editar"
|
||||||
|
},
|
||||||
|
"copyDebugInformation": {
|
||||||
|
"message": "Copiar Informações de Depuração Para Área de Transferência"
|
||||||
|
},
|
||||||
|
"copyDebugInformationFailed": {
|
||||||
|
"message": "Erro ao copiar para a área de transferência"
|
||||||
|
},
|
||||||
|
"copyDebugInformationOptions": {
|
||||||
|
"message": "Copia informações para a área de transferência para serem fornecidas a um desenvolvedor quando houver um bug / quando um solicitado pelo desenvolvedor. Informações sensíveis como seu ID de usuário, canais na lista de permissões e endereço personalizado do servidor foram removidos. No entanto, ele contém informações como seu useragent, navegador, sistema operacional e número de versão de extensão. "
|
||||||
|
},
|
||||||
|
"copyDebugInformationComplete": {
|
||||||
|
"message": "A informação de depuração foi copiada para a área de transferência. Sinta-se à vontade para remover qualquer informação que prefira não compartilhar. Salve em um arquivo de texto ou cole-a no relatório de bug."
|
||||||
|
},
|
||||||
|
"theKey": {
|
||||||
|
"message": "A tecla"
|
||||||
|
},
|
||||||
|
"keyAlreadyUsedByYouTube": {
|
||||||
|
"message": "já está sendo usado pelo youtube. Por favor, selecione outra tecla."
|
||||||
|
},
|
||||||
|
"keyAlreadyUsed": {
|
||||||
|
"message": "está vinculado a outra ação. Por favor, selecione outra tecla."
|
||||||
|
},
|
||||||
|
"to": {
|
||||||
|
"message": "até",
|
||||||
|
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||||
|
},
|
||||||
|
"category_sponsor": {
|
||||||
|
"message": "Patrocinador"
|
||||||
|
},
|
||||||
|
"category_intro": {
|
||||||
|
"message": "Animação de Introdução"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "Finalização/Créditos"
|
||||||
|
},
|
||||||
|
"category_interaction": {
|
||||||
|
"message": "Lembrete de interação (inscrever-se)"
|
||||||
|
},
|
||||||
|
"category_selfpromo": {
|
||||||
|
"message": "Auto-Promoção e Mercadorias"
|
||||||
|
},
|
||||||
|
"category_music_offtopic": {
|
||||||
|
"message": "Música: Seção sem música"
|
||||||
|
},
|
||||||
|
"category_livestream_messages": {
|
||||||
|
"message": "Livestream: Leituras de Doação/Mensagem"
|
||||||
|
},
|
||||||
|
"disable": {
|
||||||
|
"message": "Desativar"
|
||||||
|
},
|
||||||
|
"manualSkip": {
|
||||||
|
"message": "Pular manualmente"
|
||||||
|
},
|
||||||
|
"showOverlay": {
|
||||||
|
"message": "Mostrar barra de progresso"
|
||||||
|
},
|
||||||
|
"enableTestingServer": {
|
||||||
|
"message": "Habilitar Servidor em teste Beta"
|
||||||
|
},
|
||||||
|
"whatEnableTestingServer": {
|
||||||
|
"message": "Seus envios e votos NÃO SERÃO ENVIADOS para o servidor principal. Use isso apenas para testes."
|
||||||
|
},
|
||||||
|
"testingServerWarning": {
|
||||||
|
"message": "Todas os envios e votos NÃO SERÃO ENVIADOS para o servidor principal enquanto se conecta ao servidor de teste. Certifique-se de desativar isso quando você quiser fazer envios reais."
|
||||||
|
},
|
||||||
|
"bracketNow": {
|
||||||
|
"message": "(agora)"
|
||||||
|
},
|
||||||
|
"moreCategories": {
|
||||||
|
"message": "Mais categorias"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Fim)"
|
||||||
|
},
|
||||||
|
"hiddenDueToDownvote": {
|
||||||
|
"message": "oculto: Downvote"
|
||||||
|
},
|
||||||
|
"hiddenDueToDuration": {
|
||||||
|
"message": "oculto: muito curto"
|
||||||
|
},
|
||||||
|
"channelDataNotFound": {
|
||||||
|
"message": "ID do canal ainda não carregado."
|
||||||
|
},
|
||||||
|
"adblockerIssue": {
|
||||||
|
"message": "Parece que algo está bloqueando o SponsorBlock de obter dados de vídeo. Isso é provavelmente o seu bloqueador de anúncios. Por favor, verifique https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock-Requests"
|
||||||
|
},
|
||||||
|
"itCouldBeAdblockerIssue": {
|
||||||
|
"message": "Se isso continuar acontecendo, pode ser causado pelo seu bloqueador de anúncios. Por favor, verifique https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock-Requests"
|
||||||
|
},
|
||||||
|
"forceChannelCheck": {
|
||||||
|
"message": "Forçar verificação do canal antes de pular os patrocínios"
|
||||||
|
},
|
||||||
|
"whatForceChannelCheck": {
|
||||||
|
"message": "Por padrão, isso pulará os patrocínios imediatamente mesmo antes de saber qual é o canal. Por padrão, alguns patrocinadores de zero segundo podem ser ignorados nos canais da lista branca. Habilitar esta opção evitará isso, mas irá fazer com que todos os saltos tenham um ligeiro atraso, já que obter o channelID pode levar algum tempo. Este atraso pode não ser perceptível se você tiver internet rápida."
|
||||||
|
},
|
||||||
|
"forceChannelCheckPopup": {
|
||||||
|
"message": "Considere habilitar a verificação de canal forçada antes de pular os patrocinadores"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Categoria errada"
|
||||||
|
},
|
||||||
|
"nonMusicCategoryOnMusic": {
|
||||||
|
"message": "Este vídeo é classificado como música. Você tem certeza que deseja enviar segmentos com categorias que não são músicas? A menos que esse vídeo não seja de fato música, você não deve enviar esse segmento. Por favor leia as orientações se estiver em dúvidas."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,15 +31,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "segmentos de patrocínio"
|
"message": "segmentos de patrocínio"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Patrocínio saltado"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Reportar"
|
"message": "Reportar"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Reportar subimissão como inválida."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Ignorar"
|
"message": "Ignorar"
|
||||||
},
|
},
|
||||||
@@ -100,9 +94,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Já votou antes."
|
"message": "Já votou antes."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Parece que o servidor caiu. Contacte o desenvolvedor o quanto antes."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Deu-se um erro de conecção: Código: "
|
"message": "Deu-se um erro de conecção: Código: "
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,4 +1,8 @@
|
|||||||
{
|
{
|
||||||
|
"Name": {
|
||||||
|
"message": "SponsorBlock",
|
||||||
|
"description": "Name of the extension."
|
||||||
|
},
|
||||||
"fullName": {
|
"fullName": {
|
||||||
"message": "SponsorBlock для YouTube - Пропускайте спонсорские вставки",
|
"message": "SponsorBlock для YouTube - Пропускайте спонсорские вставки",
|
||||||
"description": "Name of the extension."
|
"description": "Name of the extension."
|
||||||
@@ -31,15 +35,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "спонсорские вставки"
|
"message": "спонсорские вставки"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Спонсор пропущен"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Ошибка"
|
"message": "Ошибка"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Сообщить, что информация об этом спонсорском сегменте ошибочна."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Закрыть"
|
"message": "Закрыть"
|
||||||
},
|
},
|
||||||
@@ -100,9 +98,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Вы уже проголосовали таким образом раньше."
|
"message": "Вы уже проголосовали таким образом раньше."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Кажется, сервер не работает. Свяжитесь с разработчиком."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Ошибка соединения. Код ошибки: "
|
"message": "Ошибка соединения. Код ошибки: "
|
||||||
},
|
},
|
||||||
@@ -112,6 +107,12 @@
|
|||||||
"leftTimes": {
|
"leftTimes": {
|
||||||
"message": "Вы ещё не отправили отчёты о некоторых спонсорских вставках. Хотите вернуться на эту страницу, чтобы отправить их (они не удаляются)."
|
"message": "Вы ещё не отправили отчёты о некоторых спонсорских вставках. Хотите вернуться на эту страницу, чтобы отправить их (они не удаляются)."
|
||||||
},
|
},
|
||||||
|
"clearTimes": {
|
||||||
|
"message": "Удалить отмеченные сегменты"
|
||||||
|
},
|
||||||
|
"SubmitTimes": {
|
||||||
|
"message": "Отправить отмеченные сегменты"
|
||||||
|
},
|
||||||
"submitCheck": {
|
"submitCheck": {
|
||||||
"message": "Вы уверены, что хотите отправить эту информацию?"
|
"message": "Вы уверены, что хотите отправить эту информацию?"
|
||||||
},
|
},
|
||||||
@@ -259,12 +260,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Код ошибки: "
|
"message": "Код ошибки: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Пропустить спонсорскую вставку?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Пропустить"
|
"message": "Пропустить"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Пропущено"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Отключить автоматический пропуск"
|
"message": "Отключить автоматический пропуск"
|
||||||
},
|
},
|
||||||
@@ -274,6 +275,12 @@
|
|||||||
"autoSkipDescription": {
|
"autoSkipDescription": {
|
||||||
"message": "Автоматический пропуск будет пропускать спонсорские вставки за Вас. Если выключено, будет показываться уведомление с предложением пропустить."
|
"message": "Автоматический пропуск будет пропускать спонсорские вставки за Вас. Если выключено, будет показываться уведомление с предложением пропустить."
|
||||||
},
|
},
|
||||||
|
"audioNotification": {
|
||||||
|
"message": "Аудио уведомление при пропуске"
|
||||||
|
},
|
||||||
|
"audioNotificationDescription": {
|
||||||
|
"message": "Аудио уведомление о пропуске будет воспроизводиться каждый раз, когда спонсор пропущен. Если отключено (или автоматическое пропуск отключен), звук не будет воспроизводиться."
|
||||||
|
},
|
||||||
"youHaveSkipped": {
|
"youHaveSkipped": {
|
||||||
"message": "Вы пропустили "
|
"message": "Вы пропустили "
|
||||||
},
|
},
|
||||||
@@ -331,6 +338,9 @@
|
|||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Поддержка Invidious"
|
"message": "Поддержка Invidious"
|
||||||
},
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) — это неофициальный клиент для YouTube. Чтобы включить поддержку, Вам понадобится принять дополнительные разрешения. Эта функция НЕ работает в режиме \"инкогнито\" в Chrome и браузерах, основанных на Chromium."
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Включить поддержку Invidious, выключить автоматический пропуск, скрыть кнопки и не только."
|
"message": "Включить поддержку Invidious, выключить автоматический пропуск, скрыть кнопки и не только."
|
||||||
},
|
},
|
||||||
@@ -355,12 +365,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Текущие инстансы:"
|
"message": "Текущие инстансы:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Автоматически голосовать \"за\""
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "Если это включено, расширение будет голосовать \"за\" все предложения других пользователей, если Вы на них не пожалуетесь. Если уведомление отключено, это не будет происходить."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Минимальная длительность (секунд):"
|
"message": "Минимальная длительность (секунд):"
|
||||||
},
|
},
|
||||||
@@ -405,5 +409,23 @@
|
|||||||
},
|
},
|
||||||
"mobileUpdateInfo": {
|
"mobileUpdateInfo": {
|
||||||
"message": "m.youtube.com теперь поддерживается"
|
"message": "m.youtube.com теперь поддерживается"
|
||||||
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Импорт/Экспорт всех настроек"
|
||||||
|
},
|
||||||
|
"whatExportOptions": {
|
||||||
|
"message": "Это вся конфигурация в формате JSON. Этот файл содержит Ваш идентификатор пользователя, поэтому не забудьте общаться с этим разумно."
|
||||||
|
},
|
||||||
|
"bracketNow": {
|
||||||
|
"message": "(Сейчас)"
|
||||||
|
},
|
||||||
|
"moreCategories": {
|
||||||
|
"message": "Прочие категории"
|
||||||
|
},
|
||||||
|
"bracketEnd": {
|
||||||
|
"message": "(Конец)"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Неверная категория"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,6 @@
|
|||||||
"Sponsors": {
|
"Sponsors": {
|
||||||
"message": "sponzori"
|
"message": "sponzori"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Sponzor bol Preskočený"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Nahlásiť"
|
"message": "Nahlásiť"
|
||||||
},
|
},
|
||||||
@@ -54,9 +51,6 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Kód chyby: "
|
"message": "Kód chyby: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Preskočiť Sponzor?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Preskočiť"
|
"message": "Preskočiť"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -28,15 +28,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "sponsorsegment"
|
"message": "sponsorsegment"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Sponsormeddelande undvikt"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Rapportera"
|
"message": "Rapportera"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Rapportera det här sponsorsegmentet som inkorrekt."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Avfärda"
|
"message": "Avfärda"
|
||||||
},
|
},
|
||||||
@@ -97,9 +91,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Du har redan röstat."
|
"message": "Du har redan röstat."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Det ser ut som att servern är nere. Kontakta utvecklaren med en gång."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Anslutningsfel. Felkod: "
|
"message": "Anslutningsfel. Felkod: "
|
||||||
},
|
},
|
||||||
@@ -262,9 +253,6 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Felkod: "
|
"message": "Felkod: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Hoppa över sponsormeddelande?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Hoppa över"
|
"message": "Hoppa över"
|
||||||
},
|
},
|
||||||
@@ -364,12 +352,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Nuvarande Instanser:"
|
"message": "Nuvarande Instanser:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Rösta Upp Automatiskt"
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "Med detta aktiverat kommer tillägget att rösta upp alla rapporterade sponsormeddelanden om du inte rapporterar dem som felaktiga. Om notisen är avaktiverad så kommer det inte att ske."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Minsta varaktighet (sekunder):"
|
"message": "Minsta varaktighet (sekunder):"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -35,14 +35,14 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "sponsor bölümleri"
|
"message": "sponsor bölümleri"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
"upvoteButtonInfo": {
|
||||||
"message": "Sponsor Geçildi"
|
"message": "Bu öneriye oy ver"
|
||||||
},
|
},
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Raporla"
|
"message": "Raporla"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
"reportButtonInfo": {
|
||||||
"message": "Bu sponsor bölümünü hatalı olarak rapor et."
|
"message": "Bu öneriyi hatalı olarak bildir."
|
||||||
},
|
},
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Yoksay"
|
"message": "Yoksay"
|
||||||
@@ -71,6 +71,9 @@
|
|||||||
"paused": {
|
"paused": {
|
||||||
"message": "Duraklatıldı"
|
"message": "Duraklatıldı"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "Zamanlayıcı Durduruldu"
|
||||||
|
},
|
||||||
"confirmMSG": {
|
"confirmMSG": {
|
||||||
"message": "Değerleri tek başına düzenlemek ve silmek için, bilgi butonuna basın veya sağ yukarıdaki eklenti simgesine tıklayarak eklenti menüsünü açın."
|
"message": "Değerleri tek başına düzenlemek ve silmek için, bilgi butonuna basın veya sağ yukarıdaki eklenti simgesine tıklayarak eklenti menüsünü açın."
|
||||||
},
|
},
|
||||||
@@ -272,12 +275,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Hata Kodu: "
|
"message": "Hata Kodu: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Sponsoru Atla?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Atla"
|
"message": "Atla"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Atlandı"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Otomatik Atlamayı Devredışı Bırak"
|
"message": "Otomatik Atlamayı Devredışı Bırak"
|
||||||
},
|
},
|
||||||
@@ -377,12 +380,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Mevcut Oluşumlar:"
|
"message": "Mevcut Oluşumlar:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Otomatik Oy Ver"
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "Eğer bu ayar açıksa, eklenti eğer rapor etmediyseniz gördüğünüz tüm önerileri oylayacaktır. Eğer bildirim kapalıysa, bu gerçekleşmeyecektir."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Minimum süre (saniye):"
|
"message": "Minimum süre (saniye):"
|
||||||
},
|
},
|
||||||
@@ -559,12 +556,15 @@
|
|||||||
"message": "Sponsorları Atlamadan Önce Kanal Kontrolünü Zorlamayı Gözden Geçir"
|
"message": "Sponsorları Atlamadan Önce Kanal Kontrolünü Zorlamayı Gözden Geçir"
|
||||||
},
|
},
|
||||||
"downvoteDescription": {
|
"downvoteDescription": {
|
||||||
"message": "Hatalı"
|
"message": "Hatalı/Yanlış Zaman"
|
||||||
},
|
},
|
||||||
"incorrectCategory": {
|
"incorrectCategory": {
|
||||||
"message": "Yanlış Kategori"
|
"message": "Yanlış Kategori"
|
||||||
},
|
},
|
||||||
"nonMusicCategoryOnMusic": {
|
"nonMusicCategoryOnMusic": {
|
||||||
"message": "Bu videonun kategorisi müzik olarak belirlenmiş. Müzik içermeyen bölümleri göndermek istediğinize emin misiniz? Eğer bu bir müzik videosu değilse, bu bölümleri göndermemelisiniz. Eğer ayırt edemiyorsanız, lütfen rehberi okuyunuz."
|
"message": "Bu videonun kategorisi müzik olarak belirlenmiş. Müzik içermeyen bölümleri göndermek istediğinize emin misiniz? Eğer bu bir müzik videosu değilse, bu bölümleri göndermemelisiniz. Eğer ayırt edemiyorsanız, lütfen rehberi okuyunuz."
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "Birden Çok Bölüm"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,15 +35,9 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "спонсорські вставки"
|
"message": "спонсорські вставки"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
|
||||||
"message": "Спонсор пропущений"
|
|
||||||
},
|
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "Помилка"
|
"message": "Помилка"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
|
||||||
"message": "Повідомити, що інформація про це спонсорський сегменті є хибною."
|
|
||||||
},
|
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "Закрити"
|
"message": "Закрити"
|
||||||
},
|
},
|
||||||
@@ -104,9 +98,6 @@
|
|||||||
"voteFail": {
|
"voteFail": {
|
||||||
"message": "Ви вже проголосували таким чином раніше."
|
"message": "Ви вже проголосували таким чином раніше."
|
||||||
},
|
},
|
||||||
"serverDown": {
|
|
||||||
"message": "Здається, сервер не працює. Зв'яжіться з розробником."
|
|
||||||
},
|
|
||||||
"connectionError": {
|
"connectionError": {
|
||||||
"message": "Помилка з'єднання. Код помилки: "
|
"message": "Помилка з'єднання. Код помилки: "
|
||||||
},
|
},
|
||||||
@@ -116,6 +107,15 @@
|
|||||||
"leftTimes": {
|
"leftTimes": {
|
||||||
"message": "Ви ще не надіслали звіти про деякі спонсорські вставки. Хочете повернутися на цю сторінку, щоб надіслати їх (вони не видаляються)."
|
"message": "Ви ще не надіслали звіти про деякі спонсорські вставки. Хочете повернутися на цю сторінку, щоб надіслати їх (вони не видаляються)."
|
||||||
},
|
},
|
||||||
|
"clearTimes": {
|
||||||
|
"message": "Видалити відмічені сегменти"
|
||||||
|
},
|
||||||
|
"openPopup": {
|
||||||
|
"message": "Відкрийте спливаюче вікно SponsorBlock"
|
||||||
|
},
|
||||||
|
"SubmitTimes": {
|
||||||
|
"message": "Надіслати відмічені сегменти"
|
||||||
|
},
|
||||||
"submitCheck": {
|
"submitCheck": {
|
||||||
"message": "Ви впевнені, що хочете надіслати цю інформацію?"
|
"message": "Ви впевнені, що хочете надіслати цю інформацію?"
|
||||||
},
|
},
|
||||||
@@ -263,12 +263,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "Код помилки: "
|
"message": "Код помилки: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "Пропустити спонсорську вставку?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "Пропустити"
|
"message": "Пропустити"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "Пропущено"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "Вимкнути автоматичний пропуск"
|
"message": "Вимкнути автоматичний пропуск"
|
||||||
},
|
},
|
||||||
@@ -278,6 +278,12 @@
|
|||||||
"autoSkipDescription": {
|
"autoSkipDescription": {
|
||||||
"message": "Автоматичний пропуск буде пропускати спонсорські вставки за Вас. Якщо вимкнено, буде показуватися повідомлення з пропозицією пропустити."
|
"message": "Автоматичний пропуск буде пропускати спонсорські вставки за Вас. Якщо вимкнено, буде показуватися повідомлення з пропозицією пропустити."
|
||||||
},
|
},
|
||||||
|
"audioNotification": {
|
||||||
|
"message": "Аудіо сповіщення при пропуску"
|
||||||
|
},
|
||||||
|
"audioNotificationDescription": {
|
||||||
|
"message": "Аудіо сповіщення про пропуск буде відтворюватися кожен раз, коли спонсор пропущений. Якщо відключено (або автоматичне пропуск відключений), звук не буде відтворюватися."
|
||||||
|
},
|
||||||
"youHaveSkipped": {
|
"youHaveSkipped": {
|
||||||
"message": "Ви пропустили "
|
"message": "Ви пропустили "
|
||||||
},
|
},
|
||||||
@@ -335,6 +341,9 @@
|
|||||||
"supportInvidious": {
|
"supportInvidious": {
|
||||||
"message": "Підтримка Invidious"
|
"message": "Підтримка Invidious"
|
||||||
},
|
},
|
||||||
|
"supportInvidiousDescription": {
|
||||||
|
"message": "Invidious (invidio.us) - це неофіційний клієнт для YouTube. Щоб увімкнути підтримку, Вам знадобиться прийняти додаткові дозволи. Ця функція НЕ працює в режимі \"інкогніто\" в Chrome і браузерах, заснованих на Chromium."
|
||||||
|
},
|
||||||
"optionsInfo": {
|
"optionsInfo": {
|
||||||
"message": "Увімкнути підтримку Invidious, вимкнути автоматичний пропуск, приховати кнопки і не тільки."
|
"message": "Увімкнути підтримку Invidious, вимкнути автоматичний пропуск, приховати кнопки і не тільки."
|
||||||
},
|
},
|
||||||
@@ -359,12 +368,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "Поточні інстанси:"
|
"message": "Поточні інстанси:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "Автоматично голосувати \"за\""
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "Якщо це увімкнено, розширення буде голосувати \"за\" всі пропозиції інших користувачів, якщо Ви на них не поскаржитеся. Якщо повідомлення вимкнуто, це не буде відбуватися."
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "Мінімальна тривалість (секунд):"
|
"message": "Мінімальна тривалість (секунд):"
|
||||||
},
|
},
|
||||||
@@ -410,6 +413,15 @@
|
|||||||
"mobileUpdateInfo": {
|
"mobileUpdateInfo": {
|
||||||
"message": "m.youtube.com тепер підтримується"
|
"message": "m.youtube.com тепер підтримується"
|
||||||
},
|
},
|
||||||
|
"exportOptions": {
|
||||||
|
"message": "Імпорт/Експорт всіх налаштувань"
|
||||||
|
},
|
||||||
|
"whatExportOptions": {
|
||||||
|
"message": "Це вся конфігурація в форматі JSON. Цей файл містить Ваш ідентифікатор користувача, тому не забудьте ділитися з цим розумно."
|
||||||
|
},
|
||||||
|
"setOptions": {
|
||||||
|
"message": "Встановити параметри"
|
||||||
|
},
|
||||||
"confirmNoticeTitle": {
|
"confirmNoticeTitle": {
|
||||||
"message": "Надіслати сегмент"
|
"message": "Надіслати сегмент"
|
||||||
},
|
},
|
||||||
@@ -428,6 +440,9 @@
|
|||||||
"edit": {
|
"edit": {
|
||||||
"message": "Редагувати"
|
"message": "Редагувати"
|
||||||
},
|
},
|
||||||
|
"theKey": {
|
||||||
|
"message": "Ключ"
|
||||||
|
},
|
||||||
"category_sponsor": {
|
"category_sponsor": {
|
||||||
"message": "Спонсор"
|
"message": "Спонсор"
|
||||||
},
|
},
|
||||||
@@ -445,5 +460,8 @@
|
|||||||
},
|
},
|
||||||
"bracketEnd": {
|
"bracketEnd": {
|
||||||
"message": "(Кінець)"
|
"message": "(Кінець)"
|
||||||
|
},
|
||||||
|
"incorrectCategory": {
|
||||||
|
"message": "Невірна категорія"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,14 +35,14 @@
|
|||||||
"Segments": {
|
"Segments": {
|
||||||
"message": "赞助商广告片段"
|
"message": "赞助商广告片段"
|
||||||
},
|
},
|
||||||
"noticeTitle": {
|
"upvoteButtonInfo": {
|
||||||
"message": "已跳过赞助商广告"
|
"message": "为这个提交点赞"
|
||||||
},
|
},
|
||||||
"reportButtonTitle": {
|
"reportButtonTitle": {
|
||||||
"message": "报告"
|
"message": "报告"
|
||||||
},
|
},
|
||||||
"reportButtonInfo": {
|
"reportButtonInfo": {
|
||||||
"message": "报告这个被提交的赞助商广告不正确。"
|
"message": "报告此提交不正确。"
|
||||||
},
|
},
|
||||||
"Dismiss": {
|
"Dismiss": {
|
||||||
"message": "忽略"
|
"message": "忽略"
|
||||||
@@ -71,6 +71,9 @@
|
|||||||
"paused": {
|
"paused": {
|
||||||
"message": "已暂停"
|
"message": "已暂停"
|
||||||
},
|
},
|
||||||
|
"manualPaused": {
|
||||||
|
"message": "计时器已停止"
|
||||||
|
},
|
||||||
"confirmMSG": {
|
"confirmMSG": {
|
||||||
"message": "要编辑或删除个别值,请点击信息按钮或通过点击右上角的扩展图标打开扩展弹窗。"
|
"message": "要编辑或删除个别值,请点击信息按钮或通过点击右上角的扩展图标打开扩展弹窗。"
|
||||||
},
|
},
|
||||||
@@ -272,12 +275,12 @@
|
|||||||
"errorCode": {
|
"errorCode": {
|
||||||
"message": "错误代码: "
|
"message": "错误代码: "
|
||||||
},
|
},
|
||||||
"noticeTitleNotSkipped": {
|
|
||||||
"message": "跳过赞助商广告?"
|
|
||||||
},
|
|
||||||
"skip": {
|
"skip": {
|
||||||
"message": "跳过"
|
"message": "跳过"
|
||||||
},
|
},
|
||||||
|
"skipped": {
|
||||||
|
"message": "跳过"
|
||||||
|
},
|
||||||
"disableAutoSkip": {
|
"disableAutoSkip": {
|
||||||
"message": "禁用自动跳过"
|
"message": "禁用自动跳过"
|
||||||
},
|
},
|
||||||
@@ -377,12 +380,6 @@
|
|||||||
"currentInstances": {
|
"currentInstances": {
|
||||||
"message": "当前实例:"
|
"message": "当前实例:"
|
||||||
},
|
},
|
||||||
"enableAutoUpvote": {
|
|
||||||
"message": "自动点赞"
|
|
||||||
},
|
|
||||||
"whatAutoUpvote": {
|
|
||||||
"message": "启用此选项后,扩展将会为所有您观看过的提交点赞,如果您没有报告它们的话。如果通知被禁用,那就不会出现。"
|
|
||||||
},
|
|
||||||
"minDuration": {
|
"minDuration": {
|
||||||
"message": "最小持续时间(秒):"
|
"message": "最小持续时间(秒):"
|
||||||
},
|
},
|
||||||
@@ -490,7 +487,10 @@
|
|||||||
"message": "赞助商广告"
|
"message": "赞助商广告"
|
||||||
},
|
},
|
||||||
"category_intro": {
|
"category_intro": {
|
||||||
"message": "介绍动画"
|
"message": "开头动画"
|
||||||
|
},
|
||||||
|
"category_outro": {
|
||||||
|
"message": "结束画面/结尾职员表"
|
||||||
},
|
},
|
||||||
"category_interaction": {
|
"category_interaction": {
|
||||||
"message": "互动提醒(订阅)"
|
"message": "互动提醒(订阅)"
|
||||||
@@ -556,12 +556,15 @@
|
|||||||
"message": "请考虑启用跳过赞助商广告前强制进行频道检查"
|
"message": "请考虑启用跳过赞助商广告前强制进行频道检查"
|
||||||
},
|
},
|
||||||
"downvoteDescription": {
|
"downvoteDescription": {
|
||||||
"message": "不正确"
|
"message": "不正确/错误的时间"
|
||||||
},
|
},
|
||||||
"incorrectCategory": {
|
"incorrectCategory": {
|
||||||
"message": "错误的类别"
|
"message": "错误的类别"
|
||||||
},
|
},
|
||||||
"nonMusicCategoryOnMusic": {
|
"nonMusicCategoryOnMusic": {
|
||||||
"message": "此视频被归类为音乐。您确定要提交带有非音乐类别的片段吗?除非此视频实际上不是音乐,否则您不应提交此片段。如果您感到困惑,请阅读指南。"
|
"message": "此视频被归类为音乐。您确定要提交带有非音乐类别的片段吗?除非此视频实际上不是音乐,否则您不应提交此片段。如果您感到困惑,请阅读指南。"
|
||||||
|
},
|
||||||
|
"multipleSegments": {
|
||||||
|
"message": "多个片段"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
58
public/icons/thumbs_down.svg
Normal file
58
public/icons/thumbs_down.svg
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
width="24"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="thumbs_down.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||||
|
<metadata
|
||||||
|
id="metadata12">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="730"
|
||||||
|
inkscape:window-height="480"
|
||||||
|
id="namedview8"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="9.8333333"
|
||||||
|
inkscape:cx="12"
|
||||||
|
inkscape:cy="12"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<path
|
||||||
|
d="M0 0h24v24H0z"
|
||||||
|
fill="none"
|
||||||
|
id="path2" />
|
||||||
|
<path
|
||||||
|
d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"
|
||||||
|
id="path4"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
59
public/icons/thumbs_up.svg
Normal file
59
public/icons/thumbs_up.svg
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="black"
|
||||||
|
width="18px"
|
||||||
|
height="18px"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6"
|
||||||
|
sodipodi:docname="thumbs_up.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||||
|
<metadata
|
||||||
|
id="metadata12">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs10" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="730"
|
||||||
|
inkscape:window-height="480"
|
||||||
|
id="namedview8"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="13.111111"
|
||||||
|
inkscape:cx="9"
|
||||||
|
inkscape:cy="9"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="svg6" />
|
||||||
|
<path
|
||||||
|
d="M0 0h24v24H0V0z"
|
||||||
|
fill="none"
|
||||||
|
id="path2" />
|
||||||
|
<path
|
||||||
|
d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z"
|
||||||
|
id="path4"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -237,23 +237,6 @@
|
|||||||
<br/>
|
<br/>
|
||||||
<br/>
|
<br/>
|
||||||
|
|
||||||
<div option-type="toggle" sync-option="autoUpvote">
|
|
||||||
<label class="switch-container" label-name="__MSG_enableAutoUpvote__">
|
|
||||||
<label class="switch">
|
|
||||||
<input type="checkbox" checked>
|
|
||||||
<span class="slider round"></span>
|
|
||||||
</label>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<div class="small-description">__MSG_whatAutoUpvote__</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<br/>
|
|
||||||
<br/>
|
|
||||||
|
|
||||||
<div option-type="toggle" sync-option="trackViewCount">
|
<div option-type="toggle" sync-option="trackViewCount">
|
||||||
<label class="switch-container" label-name="__MSG_enableViewTracking__">
|
<label class="switch-container" label-name="__MSG_enableViewTracking__">
|
||||||
<label class="switch">
|
<label class="switch">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import * as Types from "./types";
|
import * as CompileConfig from "../config.json";
|
||||||
|
|
||||||
import Config from "./config";
|
import Config from "./config";
|
||||||
// Make the config public for debugging purposes
|
// Make the config public for debugging purposes
|
||||||
@@ -30,7 +30,17 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
|||||||
switch(request.message) {
|
switch(request.message) {
|
||||||
case "openConfig":
|
case "openConfig":
|
||||||
chrome.runtime.openOptionsPage();
|
chrome.runtime.openOptionsPage();
|
||||||
return
|
return;
|
||||||
|
case "sendRequest":
|
||||||
|
sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => {
|
||||||
|
callback({
|
||||||
|
responseText: await response.text(),
|
||||||
|
status: response.status,
|
||||||
|
ok: response.ok
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
case "addSponsorTime":
|
case "addSponsorTime":
|
||||||
addSponsorTime(request.time, request.videoID, callback);
|
addSponsorTime(request.time, request.videoID, callback);
|
||||||
|
|
||||||
@@ -47,7 +57,7 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
|||||||
//this allows the callback to be called later
|
//this allows the callback to be called later
|
||||||
return true;
|
return true;
|
||||||
case "submitVote":
|
case "submitVote":
|
||||||
submitVote(request.type, request.UUID, request.category, callback);
|
submitVote(request.type, request.UUID, request.category).then(callback);
|
||||||
|
|
||||||
//this allows the callback to be called later
|
//this allows the callback to be called later
|
||||||
return true;
|
return true;
|
||||||
@@ -147,7 +157,7 @@ function addSponsorTime(time, videoID, callback) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function submitVote(type, UUID, category, callback) {
|
async function submitVote(type: number, UUID: string, category: string) {
|
||||||
let userID = Config.config.userID;
|
let userID = Config.config.userID;
|
||||||
|
|
||||||
if (userID == undefined || userID === "undefined") {
|
if (userID == undefined || userID === "undefined") {
|
||||||
@@ -159,24 +169,60 @@ function submitVote(type, UUID, category, callback) {
|
|||||||
let typeSection = (type !== undefined) ? "&type=" + type : "&category=" + category;
|
let typeSection = (type !== undefined) ? "&type=" + type : "&category=" + category;
|
||||||
|
|
||||||
//publish this vote
|
//publish this vote
|
||||||
utils.sendRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + typeSection, function(xmlhttp, error) {
|
let response = await asyncRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + typeSection);
|
||||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
|
||||||
callback({
|
if (response.ok) {
|
||||||
successType: 1
|
return {
|
||||||
});
|
successType: 1
|
||||||
} else if (xmlhttp.readyState == 4 && xmlhttp.status == 405) {
|
};
|
||||||
//duplicate vote
|
} else if (response.status == 405) {
|
||||||
callback({
|
//duplicate vote
|
||||||
successType: 0,
|
return {
|
||||||
statusCode: xmlhttp.status
|
successType: 0,
|
||||||
});
|
statusCode: response.status
|
||||||
} else if (error) {
|
};
|
||||||
//error while connect
|
} else {
|
||||||
callback({
|
//error while connect
|
||||||
successType: -1,
|
return {
|
||||||
statusCode: xmlhttp.status
|
successType: -1,
|
||||||
});
|
statusCode: response.status
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function asyncRequestToServer(type: string, address: string, data = {}) {
|
||||||
|
let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
|
||||||
|
|
||||||
|
return await (sendRequestToCustomServer(type, serverAddress + address, data));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sends a request to the specified url
|
||||||
|
*
|
||||||
|
* @param type The request type "GET", "POST", etc.
|
||||||
|
* @param address The address to add to the SponsorBlock server address
|
||||||
|
* @param callback
|
||||||
|
*/
|
||||||
|
async function sendRequestToCustomServer(type: string, url: string, data = {}) {
|
||||||
|
// If GET, convert JSON to parameters
|
||||||
|
if (type.toLowerCase() === "get") {
|
||||||
|
for (const key in data) {
|
||||||
|
let seperator = url.includes("?") ? "&" : "?";
|
||||||
|
let value = (typeof(data[key]) === "string") ? data[key]: JSON.stringify(data[key]);
|
||||||
|
url += seperator + key + "=" + value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
data = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: type,
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
},
|
||||||
|
redirect: 'follow',
|
||||||
|
body: data ? JSON.stringify(data) : null
|
||||||
});
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
}
|
}
|
||||||
@@ -23,6 +23,7 @@ export interface NoticeState {
|
|||||||
|
|
||||||
countdownTime: number,
|
countdownTime: number,
|
||||||
countdownText: string,
|
countdownText: string,
|
||||||
|
countdownManuallyPaused: boolean,
|
||||||
}
|
}
|
||||||
|
|
||||||
class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||||
@@ -55,6 +56,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
|||||||
//the countdown until this notice closes
|
//the countdown until this notice closes
|
||||||
countdownTime: maxCountdownTime(),
|
countdownTime: maxCountdownTime(),
|
||||||
countdownText: null,
|
countdownText: null,
|
||||||
|
countdownManuallyPaused: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,8 +73,8 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
|||||||
<table id={"sponsorSkipNotice" + this.idSuffix}
|
<table id={"sponsorSkipNotice" + this.idSuffix}
|
||||||
className={"sponsorSkipObject sponsorSkipNotice" + (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")}
|
className={"sponsorSkipObject sponsorSkipNotice" + (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")}
|
||||||
style={noticeStyle}
|
style={noticeStyle}
|
||||||
onMouseEnter={this.pauseCountdown.bind(this)}
|
onMouseEnter={() => this.timerMouseEnter()}
|
||||||
onMouseLeave={this.startCountdown.bind(this)}>
|
onMouseLeave={() => this.timerMouseLeave()}>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
||||||
{/* First row */}
|
{/* First row */}
|
||||||
@@ -99,6 +101,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
|||||||
{/* Time left */}
|
{/* Time left */}
|
||||||
{this.props.timed ? (
|
{this.props.timed ? (
|
||||||
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
|
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
|
||||||
|
onClick={() => this.toggleManualPause()}
|
||||||
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
|
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
|
||||||
|
|
||||||
{this.state.countdownText || (this.state.countdownTime + "s")}
|
{this.state.countdownText || (this.state.countdownTime + "s")}
|
||||||
@@ -121,6 +124,30 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timerMouseEnter() {
|
||||||
|
if (this.state.countdownManuallyPaused) return;
|
||||||
|
|
||||||
|
this.pauseCountdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
timerMouseLeave() {
|
||||||
|
if (this.state.countdownManuallyPaused) return;
|
||||||
|
|
||||||
|
this.startCountdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
toggleManualPause() {
|
||||||
|
this.setState({
|
||||||
|
countdownManuallyPaused: !this.state.countdownManuallyPaused
|
||||||
|
}, () => {
|
||||||
|
if (this.state.countdownManuallyPaused) {
|
||||||
|
this.pauseCountdown();
|
||||||
|
} else {
|
||||||
|
this.startCountdown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
//called every second to lower the countdown before hiding the notice
|
//called every second to lower the countdown before hiding the notice
|
||||||
countdown() {
|
countdown() {
|
||||||
if (!this.props.timed) return;
|
if (!this.props.timed) return;
|
||||||
@@ -159,7 +186,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
|||||||
//reset countdown and inform the user
|
//reset countdown and inform the user
|
||||||
this.setState({
|
this.setState({
|
||||||
countdownTime: this.state.maxCountdownTime(),
|
countdownTime: this.state.maxCountdownTime(),
|
||||||
countdownText: chrome.i18n.getMessage("paused")
|
countdownText: this.state.countdownManuallyPaused ? chrome.i18n.getMessage("manualPaused") : chrome.i18n.getMessage("paused")
|
||||||
});
|
});
|
||||||
|
|
||||||
//remove the fade out class if it exists
|
//remove the fade out class if it exists
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import * as CompileConfig from "../../config.json";
|
import * as CompileConfig from "../../config.json";
|
||||||
import Config from "../config"
|
import Config from "../config"
|
||||||
import { ContentContainer, SponsorHideType } from "../types";
|
import { ContentContainer, SponsorHideType, SponsorTime } from "../types";
|
||||||
|
|
||||||
import Utils from "../utils";
|
import Utils from "../utils";
|
||||||
var utils = new Utils();
|
var utils = new Utils();
|
||||||
@@ -9,9 +9,17 @@ var utils = new Utils();
|
|||||||
import NoticeComponent from "./NoticeComponent";
|
import NoticeComponent from "./NoticeComponent";
|
||||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||||
|
|
||||||
|
enum SkipNoticeAction {
|
||||||
|
None,
|
||||||
|
Upvote,
|
||||||
|
Downvote,
|
||||||
|
CategoryVote,
|
||||||
|
Unskip
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SkipNoticeProps {
|
||||||
|
segments: SponsorTime[];
|
||||||
|
|
||||||
export interface SkipNoticeProps {
|
|
||||||
UUID: string;
|
|
||||||
autoSkip: boolean;
|
autoSkip: boolean;
|
||||||
// Contains functions and variables from the content script needed by the skip notice
|
// Contains functions and variables from the content script needed by the skip notice
|
||||||
contentContainer: ContentContainer;
|
contentContainer: ContentContainer;
|
||||||
@@ -29,14 +37,17 @@ export interface SkipNoticeState {
|
|||||||
countdownText: string;
|
countdownText: string;
|
||||||
|
|
||||||
unskipText: string;
|
unskipText: string;
|
||||||
unskipCallback: () => void;
|
unskipCallback: (index: number) => void;
|
||||||
|
|
||||||
downvoting: boolean;
|
downvoting: boolean;
|
||||||
choosingCategory: boolean;
|
choosingCategory: boolean;
|
||||||
|
thanksForVotingText: boolean; //null until the voting buttons should be hidden
|
||||||
|
|
||||||
|
actionState: SkipNoticeAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
||||||
UUID: string;
|
segments: SponsorTime[];
|
||||||
autoSkip: boolean;
|
autoSkip: boolean;
|
||||||
// Contains functions and variables from the content script needed by the skip notice
|
// Contains functions and variables from the content script needed by the skip notice
|
||||||
contentContainer: ContentContainer;
|
contentContainer: ContentContainer;
|
||||||
@@ -57,22 +68,30 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
this.noticeRef = React.createRef();
|
this.noticeRef = React.createRef();
|
||||||
this.categoryOptionRef = React.createRef();
|
this.categoryOptionRef = React.createRef();
|
||||||
|
|
||||||
this.UUID = props.UUID;
|
this.segments = props.segments;
|
||||||
this.autoSkip = props.autoSkip;
|
this.autoSkip = props.autoSkip;
|
||||||
this.contentContainer = props.contentContainer;
|
this.contentContainer = props.contentContainer;
|
||||||
this.audio = null;
|
this.audio = null;
|
||||||
|
|
||||||
let noticeTitle = chrome.i18n.getMessage("noticeTitle");
|
let categoryName = chrome.i18n.getMessage(this.segments.length > 1 ? "multipleSegments" : "category_" + this.segments[0].category);
|
||||||
|
let noticeTitle = categoryName + " " + chrome.i18n.getMessage("skipped");
|
||||||
if (!this.autoSkip) {
|
if (!this.autoSkip) {
|
||||||
noticeTitle = chrome.i18n.getMessage("noticeTitleNotSkipped");
|
noticeTitle = chrome.i18n.getMessage("skip") + " " + categoryName + "?";
|
||||||
}
|
}
|
||||||
|
|
||||||
//add notice
|
//add notice
|
||||||
this.amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
this.amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
||||||
|
|
||||||
|
// Sort segments
|
||||||
|
if (this.segments.length > 1) {
|
||||||
|
this.segments.sort((a, b) => a.segment[0] - b.segment[0]);
|
||||||
|
}
|
||||||
|
|
||||||
//this is the suffix added at the end of every id
|
//this is the suffix added at the end of every id
|
||||||
this.idSuffix = this.UUID + this.amountOfPreviousNotices;
|
for (const segment of this.segments) {
|
||||||
|
this.idSuffix += segment.UUID;
|
||||||
|
}
|
||||||
|
this.idSuffix += this.amountOfPreviousNotices;
|
||||||
|
|
||||||
if (this.amountOfPreviousNotices > 0) {
|
if (this.amountOfPreviousNotices > 0) {
|
||||||
//another notice exists
|
//another notice exists
|
||||||
@@ -92,14 +111,18 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
countdownText: null,
|
countdownText: null,
|
||||||
|
|
||||||
unskipText: chrome.i18n.getMessage("unskip"),
|
unskipText: chrome.i18n.getMessage("unskip"),
|
||||||
unskipCallback: this.unskip.bind(this),
|
unskipCallback: (index) => this.unskip(index),
|
||||||
|
|
||||||
downvoting: false,
|
downvoting: false,
|
||||||
choosingCategory: false
|
choosingCategory: false,
|
||||||
|
thanksForVotingText: null,
|
||||||
|
|
||||||
|
actionState: SkipNoticeAction.None
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.autoSkip) {
|
if (!this.autoSkip) {
|
||||||
Object.assign(this.state, this.getUnskippedModeInfo(chrome.i18n.getMessage("skip")));
|
// Assume manual skip is only skipping 1 submission
|
||||||
|
Object.assign(this.state, this.getUnskippedModeInfo(0, chrome.i18n.getMessage("skip")));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -140,35 +163,46 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
|
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
|
||||||
|
|
||||||
{/* Vote Button Container */}
|
{/* Vote Button Container */}
|
||||||
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
{!this.state.thanksForVotingText ?
|
||||||
className="sponsorTimesVoteButtonsContainer">
|
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
||||||
|
className="sponsorTimesVoteButtonsContainer">
|
||||||
|
|
||||||
{/* Report Text */}
|
{/* Upvote Button */}
|
||||||
<span id={"sponsorTimesReportText" + this.idSuffix}
|
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
||||||
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
|
className="sponsorSkipObject voteButton"
|
||||||
title={chrome.i18n.getMessage("reportButtonInfo")}
|
style={{marginRight: "10px"}}
|
||||||
style={{marginRight: "5px"}}>
|
src={chrome.extension.getURL("icons/thumbs_up.svg")}
|
||||||
|
title={chrome.i18n.getMessage("upvoteButtonInfo")}
|
||||||
|
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
|
||||||
|
|
||||||
|
</img>
|
||||||
|
|
||||||
{chrome.i18n.getMessage("reportButtonTitle")}
|
{/* Report Button */}
|
||||||
</span>
|
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
||||||
|
className="sponsorSkipObject voteButton"
|
||||||
|
src={chrome.extension.getURL("icons/thumbs_down.svg")}
|
||||||
|
title={chrome.i18n.getMessage("reportButtonInfo")}
|
||||||
|
onClick={() => this.adjustDownvotingState(true)}>
|
||||||
|
|
||||||
|
</img>
|
||||||
|
|
||||||
{/* Report Button */}
|
</td>
|
||||||
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
|
||||||
className="sponsorSkipObject voteButton"
|
|
||||||
src={chrome.extension.getURL("icons/report.png")}
|
|
||||||
title={chrome.i18n.getMessage("reportButtonInfo")}
|
|
||||||
onClick={() => this.adjustDownvotingState(true)}>
|
|
||||||
|
|
||||||
</img>
|
|
||||||
|
|
||||||
</td>
|
:
|
||||||
|
|
||||||
|
<td id={"sponsorTimesVoteButtonInfoMessage" + this.idSuffix}
|
||||||
|
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
|
||||||
|
style={{marginRight: "10px"}}>
|
||||||
|
{this.state.thanksForVotingText}
|
||||||
|
</td>
|
||||||
|
}
|
||||||
|
|
||||||
{/* Unskip Button */}
|
{/* Unskip Button */}
|
||||||
<td className="sponsorSkipNoticeUnskipSection">
|
<td className="sponsorSkipNoticeUnskipSection">
|
||||||
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
||||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||||
style={{marginLeft: "4px"}}
|
style={{marginLeft: "4px"}}
|
||||||
onClick={this.state.unskipCallback}>
|
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||||
|
|
||||||
{this.state.unskipText}
|
{this.state.unskipText}
|
||||||
</button>
|
</button>
|
||||||
@@ -193,18 +227,16 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
|
|
||||||
{/* Normal downvote */}
|
{/* Normal downvote */}
|
||||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||||
onClick={() => this.contentContainer().vote(0, this.UUID, undefined, this)}>
|
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
|
||||||
{chrome.i18n.getMessage("downvoteDescription")}
|
{chrome.i18n.getMessage("downvoteDescription")}
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
{/* Category vote */}
|
{/* Category vote */}
|
||||||
{Config.config.testingServer &&
|
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
onClick={() => this.openCategoryChooser()}>
|
||||||
onClick={() => this.openCategoryChooser()}>
|
|
||||||
|
|
||||||
{chrome.i18n.getMessage("incorrectCategory")}
|
{chrome.i18n.getMessage("incorrectCategory")}
|
||||||
</button>
|
</button>
|
||||||
}
|
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
@@ -217,7 +249,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
{/* Category Selector */}
|
{/* Category Selector */}
|
||||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||||
className="sponsorTimeCategories"
|
className="sponsorTimeCategories"
|
||||||
defaultValue={utils.getSponsorTimeFromUUID(this.props.contentContainer().sponsorTimes, this.props.UUID).category}
|
defaultValue={this.segments[0].category} //Just default to the first segment, as we don't know which they'll choose
|
||||||
ref={this.categoryOptionRef}
|
ref={this.categoryOptionRef}
|
||||||
onChange={this.categorySelectionChange.bind(this)}>
|
onChange={this.categorySelectionChange.bind(this)}>
|
||||||
|
|
||||||
@@ -225,11 +257,23 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
</select>
|
</select>
|
||||||
|
|
||||||
{/* Submit Button */}
|
{/* Submit Button */}
|
||||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
{this.segments.length === 1 &&
|
||||||
onClick={() => this.contentContainer().vote(undefined, this.UUID, this.categoryOptionRef.current.value, this)}>
|
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||||
|
onClick={() => this.prepAction(SkipNoticeAction.CategoryVote)}>
|
||||||
|
|
||||||
{chrome.i18n.getMessage("submit")}
|
{chrome.i18n.getMessage("submit")}
|
||||||
</button>
|
</button>
|
||||||
|
}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
}
|
||||||
|
|
||||||
|
{/* Segment Chooser Row */}
|
||||||
|
{this.state.actionState !== SkipNoticeAction.None &&
|
||||||
|
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}>
|
||||||
|
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
|
||||||
|
{this.getSubmissionChooser()}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -238,6 +282,32 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getSubmissionChooser(): JSX.Element[] {
|
||||||
|
let elements: JSX.Element[] = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < this.segments.length; i++) {
|
||||||
|
elements.push(
|
||||||
|
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||||
|
onClick={() => this.performAction(i)}
|
||||||
|
key={"submission" + i + this.segments[i].category + this.idSuffix}>
|
||||||
|
{(i + 1) + ". " + chrome.i18n.getMessage("category_" + this.segments[i].category)}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
prepAction(action: SkipNoticeAction) {
|
||||||
|
if (this.segments.length === 1) {
|
||||||
|
this.performAction(0, action);
|
||||||
|
} else {
|
||||||
|
this.setState({
|
||||||
|
actionState: action
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
getMessageBoxes(): JSX.Element[] | JSX.Element {
|
getMessageBoxes(): JSX.Element[] | JSX.Element {
|
||||||
if (this.state.messages.length === 0) {
|
if (this.state.messages.length === 0) {
|
||||||
// Add a spacer if there is no text
|
// Add a spacer if there is no text
|
||||||
@@ -262,6 +332,34 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
return elements;
|
return elements;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the action from the current state
|
||||||
|
*
|
||||||
|
* @param index
|
||||||
|
*/
|
||||||
|
performAction(index: number, action?: SkipNoticeAction) {
|
||||||
|
switch (action ?? this.state.actionState) {
|
||||||
|
case SkipNoticeAction.None:
|
||||||
|
break;
|
||||||
|
case SkipNoticeAction.Upvote:
|
||||||
|
this.contentContainer().vote(1, this.segments[index].UUID, undefined, this);
|
||||||
|
break;
|
||||||
|
case SkipNoticeAction.Downvote:
|
||||||
|
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
|
||||||
|
break;
|
||||||
|
case SkipNoticeAction.CategoryVote:
|
||||||
|
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value, this)
|
||||||
|
break;
|
||||||
|
case SkipNoticeAction.Unskip:
|
||||||
|
this.state.unskipCallback(index);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setState({
|
||||||
|
actionState: SkipNoticeAction.None
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
adjustDownvotingState(value: boolean) {
|
adjustDownvotingState(value: boolean) {
|
||||||
if (!value) this.clearConfigListener();
|
if (!value) this.clearConfigListener();
|
||||||
|
|
||||||
@@ -286,6 +384,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
this.setState({
|
this.setState({
|
||||||
choosingCategory: true,
|
choosingCategory: true,
|
||||||
downvoting: false
|
downvoting: false
|
||||||
|
}, () => {
|
||||||
|
if (this.segments.length > 1) {
|
||||||
|
// Use the action selectors as a submit button
|
||||||
|
this.prepAction(SkipNoticeAction.CategoryVote);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,37 +424,38 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
chrome.runtime.sendMessage({"message": "openConfig"});
|
chrome.runtime.sendMessage({"message": "openConfig"});
|
||||||
|
|
||||||
// Reset option to original
|
// Reset option to original
|
||||||
event.target.value = utils.getSponsorTimeFromUUID(this.props.contentContainer().sponsorTimes, this.props.UUID).category;
|
event.target.value = this.segments[0].category;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unskip() {
|
unskip(index: number) {
|
||||||
this.contentContainer().unskipSponsorTime(this.UUID);
|
this.contentContainer().unskipSponsorTime(this.segments[index]);
|
||||||
|
|
||||||
this.unskippedMode(chrome.i18n.getMessage("reskip"));
|
this.unskippedMode(index, chrome.i18n.getMessage("reskip"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets up notice to be not skipped yet */
|
/** Sets up notice to be not skipped yet */
|
||||||
unskippedMode(buttonText: string) {
|
unskippedMode(index: number, buttonText: string) {
|
||||||
//setup new callback and reset countdown
|
//setup new callback and reset countdown
|
||||||
this.setState(this.getUnskippedModeInfo(buttonText), () => {
|
this.setState(this.getUnskippedModeInfo(index, buttonText), () => {
|
||||||
this.noticeRef.current.resetCountdown();
|
this.noticeRef.current.resetCountdown();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
getUnskippedModeInfo(buttonText: string) {
|
getUnskippedModeInfo(index: number, buttonText: string) {
|
||||||
|
let self = this;
|
||||||
let maxCountdownTime = function() {
|
let maxCountdownTime = function() {
|
||||||
let sponsorTime = utils.getSponsorTimeFromUUID(this.contentContainer().sponsorTimes, this.UUID);
|
let sponsorTime = self.segments[index];
|
||||||
let duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
|
let duration = Math.round((sponsorTime.segment[1] - self.contentContainer().v.currentTime) * (1 / self.contentContainer().v.playbackRate));
|
||||||
|
|
||||||
return Math.max(duration, 4);
|
return Math.max(duration, 4);
|
||||||
}.bind(this);
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
unskipText: buttonText,
|
unskipText: buttonText,
|
||||||
|
|
||||||
unskipCallback: this.reskip.bind(this),
|
unskipCallback: (index) => this.reskip(index),
|
||||||
|
|
||||||
//change max duration to however much of the sponsor is left
|
//change max duration to however much of the sponsor is left
|
||||||
maxCountdownTime: maxCountdownTime,
|
maxCountdownTime: maxCountdownTime,
|
||||||
@@ -360,8 +464,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
reskip() {
|
reskip(index: number) {
|
||||||
this.contentContainer().reskipSponsorTime(this.UUID);
|
this.contentContainer().reskipSponsorTime(this.segments[index]);
|
||||||
|
|
||||||
//reset countdown
|
//reset countdown
|
||||||
this.setState({
|
this.setState({
|
||||||
@@ -377,24 +481,23 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
this.setState({
|
this.setState({
|
||||||
noticeTitle: chrome.i18n.getMessage("noticeTitle")
|
noticeTitle: chrome.i18n.getMessage("noticeTitle")
|
||||||
});
|
});
|
||||||
|
|
||||||
if(Config.config.autoUpvote) this.contentContainer().vote(1, this.UUID);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
afterDownvote(type: number, category: string) {
|
afterVote(segment: SponsorTime, type: number, category: string) {
|
||||||
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
||||||
this.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
|
||||||
|
|
||||||
this.adjustDownvotingState(false);
|
if (type === 0) {
|
||||||
|
this.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
||||||
|
this.adjustDownvotingState(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Change the sponsor locally
|
// Change the sponsor locally
|
||||||
let sponsorTime = utils.getSponsorTimeFromUUID(this.contentContainer().sponsorTimes, this.UUID);
|
if (segment) {
|
||||||
if (sponsorTime) {
|
|
||||||
if (type === 0) {
|
if (type === 0) {
|
||||||
sponsorTime.hidden = SponsorHideType.Downvoted;
|
segment.hidden = SponsorHideType.Downvoted;
|
||||||
} else if (category) {
|
} else if (category) {
|
||||||
sponsorTime.category = category;
|
segment.category = category;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.contentContainer().updatePreviewBar();
|
this.contentContainer().updatePreviewBar();
|
||||||
@@ -404,41 +507,19 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
|||||||
setNoticeInfoMessage(...messages: string[]) {
|
setNoticeInfoMessage(...messages: string[]) {
|
||||||
this.setState({
|
this.setState({
|
||||||
messages
|
messages
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
addVoteButtonInfo(message) {
|
addVoteButtonInfo(message) {
|
||||||
this.resetVoteButtonInfo();
|
this.setState({
|
||||||
|
thanksForVotingText: message
|
||||||
//hide report button and text for it
|
});
|
||||||
let downvoteButton = document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix);
|
|
||||||
if (downvoteButton != null) {
|
|
||||||
downvoteButton.style.display = "none";
|
|
||||||
}
|
|
||||||
let downvoteButtonText = document.getElementById("sponsorTimesReportText" + this.idSuffix);
|
|
||||||
if (downvoteButtonText != null) {
|
|
||||||
downvoteButtonText.style.display = "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
//add info
|
|
||||||
let thanksForVotingText = document.createElement("td");
|
|
||||||
thanksForVotingText.id = "sponsorTimesVoteButtonInfoMessage" + this.idSuffix;
|
|
||||||
thanksForVotingText.className = "sponsorTimesInfoMessage sponsorTimesVoteButtonMessage";
|
|
||||||
thanksForVotingText.innerText = message;
|
|
||||||
|
|
||||||
//add element to div
|
|
||||||
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).prepend(thanksForVotingText);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resetVoteButtonInfo() {
|
resetVoteButtonInfo() {
|
||||||
let previousInfoMessage = document.getElementById("sponsorTimesVoteButtonInfoMessage" + this.idSuffix);
|
this.setState({
|
||||||
if (previousInfoMessage != null) {
|
thanksForVotingText: null
|
||||||
//remove it
|
});
|
||||||
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).removeChild(previousInfoMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
//show button again
|
|
||||||
document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix).style.removeProperty("display");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
closeListener() {
|
closeListener() {
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ interface SBConfig {
|
|||||||
hideDiscordLaunches: number,
|
hideDiscordLaunches: number,
|
||||||
hideDiscordLink: boolean,
|
hideDiscordLink: boolean,
|
||||||
invidiousInstances: string[],
|
invidiousInstances: string[],
|
||||||
autoUpvote: boolean,
|
|
||||||
supportInvidious: boolean,
|
supportInvidious: boolean,
|
||||||
serverAddress: string,
|
serverAddress: string,
|
||||||
minDuration: number,
|
minDuration: number,
|
||||||
@@ -124,7 +123,6 @@ var Config: SBObject = {
|
|||||||
hideDiscordLaunches: 0,
|
hideDiscordLaunches: 0,
|
||||||
hideDiscordLink: false,
|
hideDiscordLink: false,
|
||||||
invidiousInstances: ["invidio.us", "invidious.snopyta.org"],
|
invidiousInstances: ["invidio.us", "invidious.snopyta.org"],
|
||||||
autoUpvote: true,
|
|
||||||
supportInvidious: false,
|
supportInvidious: false,
|
||||||
serverAddress: CompileConfig.serverAddress,
|
serverAddress: CompileConfig.serverAddress,
|
||||||
minDuration: 0,
|
minDuration: 0,
|
||||||
@@ -252,6 +250,11 @@ async function migrateOldFormats() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Auto vote removal
|
||||||
|
if (Config.config["autoUpvote"]) {
|
||||||
|
chrome.storage.sync.remove("autoUpvote");
|
||||||
|
}
|
||||||
|
|
||||||
// Channel URLS
|
// Channel URLS
|
||||||
if (Config.config.whitelistedChannels.length > 0 &&
|
if (Config.config.whitelistedChannels.length > 0 &&
|
||||||
(Config.config.whitelistedChannels[0] == null || Config.config.whitelistedChannels[0].includes("/"))) {
|
(Config.config.whitelistedChannels[0] == null || Config.config.whitelistedChannels[0].includes("/"))) {
|
||||||
@@ -265,7 +268,7 @@ async function migrateOldFormats() {
|
|||||||
let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
|
let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
|
||||||
|
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
newChannelList.push((await response.json()).authorId);
|
newChannelList.push((JSON.parse(response.responseText)).authorId);
|
||||||
} else {
|
} else {
|
||||||
// Add it at the beginning so it gets converted later
|
// Add it at the beginning so it gets converted later
|
||||||
newChannelList.unshift(item);
|
newChannelList.unshift(item);
|
||||||
|
|||||||
180
src/content.ts
180
src/content.ts
@@ -1,6 +1,6 @@
|
|||||||
import Config from "./config";
|
import Config from "./config";
|
||||||
|
|
||||||
import { SponsorTime, CategorySkipOption, CategorySelection, VideoID, SponsorHideType } from "./types";
|
import { SponsorTime, CategorySkipOption, CategorySelection, VideoID, SponsorHideType, FetchResponse } from "./types";
|
||||||
|
|
||||||
import { ContentContainer } from "./types";
|
import { ContentContainer } from "./types";
|
||||||
import Utils from "./utils";
|
import Utils from "./utils";
|
||||||
@@ -41,9 +41,6 @@ var sponsorSkipped: boolean[] = [];
|
|||||||
//the video
|
//the video
|
||||||
var video: HTMLVideoElement;
|
var video: HTMLVideoElement;
|
||||||
|
|
||||||
/** The last time this video was seeking to */
|
|
||||||
var lastVideoTime: number = null;
|
|
||||||
|
|
||||||
var onInvidious;
|
var onInvidious;
|
||||||
var onMobileYouTube;
|
var onMobileYouTube;
|
||||||
|
|
||||||
@@ -67,10 +64,6 @@ var channelWhitelisted = false;
|
|||||||
// create preview bar
|
// create preview bar
|
||||||
var previewBar: PreviewBar = null;
|
var previewBar: PreviewBar = null;
|
||||||
|
|
||||||
// When not null, a sponsor is currently being previewed and auto skip should be enabled.
|
|
||||||
// This is set to a timeout function when that happens that will reset it after 3 seconds.
|
|
||||||
var previewResetter: NodeJS.Timeout = null;
|
|
||||||
|
|
||||||
//the player controls on the YouTube player
|
//the player controls on the YouTube player
|
||||||
var controls = null;
|
var controls = null;
|
||||||
|
|
||||||
@@ -81,12 +74,6 @@ utils.wait(() => Config.config !== null, 1000, 1).then(() => videoIDChange(getYo
|
|||||||
//this only happens if there is an error
|
//this only happens if there is an error
|
||||||
var sponsorLookupRetries = 0;
|
var sponsorLookupRetries = 0;
|
||||||
|
|
||||||
//the last time in the video a sponsor was skipped
|
|
||||||
//used for the go back button
|
|
||||||
var lastSponsorTimeSkipped: number = null;
|
|
||||||
//used for ratings
|
|
||||||
var lastSponsorTimeSkippedUUID: string = null;
|
|
||||||
|
|
||||||
//if showing the start sponsor button or the end sponsor button on the player
|
//if showing the start sponsor button or the end sponsor button on the player
|
||||||
var showingStartSponsor = true;
|
var showingStartSponsor = true;
|
||||||
|
|
||||||
@@ -99,6 +86,9 @@ var popupInitialised = false;
|
|||||||
|
|
||||||
var submissionNotice: SubmissionNotice = null;
|
var submissionNotice: SubmissionNotice = null;
|
||||||
|
|
||||||
|
// If there is an advert playing (or about to be played), this is true
|
||||||
|
var isAdPlaying = false;
|
||||||
|
|
||||||
// Contains all of the functions and variables needed by the skip notice
|
// Contains all of the functions and variables needed by the skip notice
|
||||||
var skipNoticeContentContainer: ContentContainer = () => ({
|
var skipNoticeContentContainer: ContentContainer = () => ({
|
||||||
vote,
|
vote,
|
||||||
@@ -170,14 +160,7 @@ function messageListener(request: any, sender: any, sendResponse: (response: any
|
|||||||
video.play();
|
video.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start preview resetter
|
return;
|
||||||
if (previewResetter !== null){
|
|
||||||
clearTimeout(previewResetter);
|
|
||||||
}
|
|
||||||
|
|
||||||
previewResetter = setTimeout(() => previewResetter = null, 4000);
|
|
||||||
|
|
||||||
return
|
|
||||||
case "getCurrentTime":
|
case "getCurrentTime":
|
||||||
sendResponse({
|
sendResponse({
|
||||||
currentTime: getRealCurrentTime()
|
currentTime: getRealCurrentTime()
|
||||||
@@ -281,6 +264,9 @@ function resetValues() {
|
|||||||
} else {
|
} else {
|
||||||
switchingVideos = true;
|
switchingVideos = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset advert playing flag
|
||||||
|
isAdPlaying = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function videoIDChange(id) {
|
async function videoIDChange(id) {
|
||||||
@@ -446,6 +432,7 @@ function createPreviewBar(): void {
|
|||||||
* This happens when the resolution changes or at random time to clear memory.
|
* This happens when the resolution changes or at random time to clear memory.
|
||||||
*/
|
*/
|
||||||
function durationChangeListener() {
|
function durationChangeListener() {
|
||||||
|
updateAdFlag();
|
||||||
updatePreviewBar();
|
updatePreviewBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,13 +451,22 @@ function cancelSponsorSchedule(): void {
|
|||||||
function startSponsorSchedule(includeIntersectingSegments: boolean = false, currentTime?: number): void {
|
function startSponsorSchedule(includeIntersectingSegments: boolean = false, currentTime?: number): void {
|
||||||
cancelSponsorSchedule();
|
cancelSponsorSchedule();
|
||||||
|
|
||||||
|
// Don't skip if advert playing and reset last checked time
|
||||||
|
if (isAdPlaying) {
|
||||||
|
// Reset lastCheckVideoTime
|
||||||
|
lastCheckVideoTime = -1;
|
||||||
|
lastCheckTime = 0;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (video.paused) return;
|
if (video.paused) return;
|
||||||
|
|
||||||
if (Config.config.disableSkipping || channelWhitelisted || (channelID === null && Config.config.forceChannelCheck)){
|
if (Config.config.disableSkipping || channelWhitelisted || (channelID === null && Config.config.forceChannelCheck)){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (incorrectVideoIDCheck()) return;
|
if (incorrectVideoCheck()) return;
|
||||||
|
|
||||||
if (currentTime === undefined || currentTime === null) currentTime = video.currentTime;
|
if (currentTime === undefined || currentTime === null) currentTime = video.currentTime;
|
||||||
|
|
||||||
@@ -483,6 +479,19 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
|||||||
let timeUntilSponsor = skipTime[0] - currentTime;
|
let timeUntilSponsor = skipTime[0] - currentTime;
|
||||||
let videoID = sponsorVideoID;
|
let videoID = sponsorVideoID;
|
||||||
|
|
||||||
|
// Find all indexes in between the start and end
|
||||||
|
let skippingSegments = [skipInfo.array[skipInfo.index]];
|
||||||
|
if (skipInfo.index !== skipInfo.endIndex) {
|
||||||
|
skippingSegments = [];
|
||||||
|
|
||||||
|
for (const segment of skipInfo.array) {
|
||||||
|
if (utils.getCategorySelection(segment.category).option === CategorySkipOption.AutoSkip &&
|
||||||
|
segment.segment[0] >= skipTime[0] && segment.segment[1] <= skipTime[1]) {
|
||||||
|
skippingSegments.push(segment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Don't skip if this category should not be skipped
|
// Don't skip if this category should not be skipped
|
||||||
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ShowOverlay) return;
|
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ShowOverlay) return;
|
||||||
|
|
||||||
@@ -490,10 +499,10 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
|||||||
let forcedSkipTime: number = null;
|
let forcedSkipTime: number = null;
|
||||||
let forcedIncludeIntersectingSegments = false;
|
let forcedIncludeIntersectingSegments = false;
|
||||||
|
|
||||||
if (incorrectVideoIDCheck(videoID)) return;
|
if (incorrectVideoCheck(videoID, currentSkip)) return;
|
||||||
|
|
||||||
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
|
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
|
||||||
skipToTime(video, skipInfo.endIndex, skipInfo.array, skipInfo.openNotice);
|
skipToTime(video, skipTime, skippingSegments, skipInfo.openNotice);
|
||||||
|
|
||||||
// TODO: Know the autoSkip settings for ALL items being skipped
|
// TODO: Know the autoSkip settings for ALL items being skipped
|
||||||
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ManualSkip) {
|
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ManualSkip) {
|
||||||
@@ -515,13 +524,11 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This makes sure the videoID is still correct
|
* This makes sure the videoID is still correct and if the sponsorTime is included
|
||||||
*
|
|
||||||
* TODO: Remove this bug catching if statement when the bug is found
|
|
||||||
*/
|
*/
|
||||||
function incorrectVideoIDCheck(videoID?: string): boolean {
|
function incorrectVideoCheck(videoID?: string, sponsorTime?: SponsorTime): boolean {
|
||||||
let currentVideoID = getYouTubeVideoID(document.URL);
|
let currentVideoID = getYouTubeVideoID(document.URL);
|
||||||
if (currentVideoID !== (videoID || sponsorVideoID)) {
|
if (currentVideoID !== (videoID || sponsorVideoID) || (sponsorTime && (!sponsorTimes || !sponsorTimes.includes(sponsorTime)) && !sponsorTimesSubmitting.includes(sponsorTime))) {
|
||||||
// Something has really gone wrong
|
// Something has really gone wrong
|
||||||
console.error("[SponsorBlock] The videoID recorded when trying to skip is different than what it should be.");
|
console.error("[SponsorBlock] The videoID recorded when trying to skip is different than what it should be.");
|
||||||
console.error("[SponsorBlock] VideoID recorded: " + sponsorVideoID + ". Actual VideoID: " + currentVideoID);
|
console.error("[SponsorBlock] VideoID recorded: " + sponsorVideoID + ". Actual VideoID: " + currentVideoID);
|
||||||
@@ -556,6 +563,9 @@ function sponsorsLookup(id: string) {
|
|||||||
video.addEventListener('play', () => {
|
video.addEventListener('play', () => {
|
||||||
switchingVideos = false;
|
switchingVideos = false;
|
||||||
|
|
||||||
|
// Check if an ad is playing
|
||||||
|
updateAdFlag();
|
||||||
|
|
||||||
// Make sure it doesn't get double called with the playing event
|
// Make sure it doesn't get double called with the playing event
|
||||||
if (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000) {
|
if (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000) {
|
||||||
lastCheckTime = Date.now();
|
lastCheckTime = Date.now();
|
||||||
@@ -563,6 +573,7 @@ function sponsorsLookup(id: string) {
|
|||||||
|
|
||||||
startSponsorSchedule();
|
startSponsorSchedule();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
video.addEventListener('playing', () => {
|
video.addEventListener('playing', () => {
|
||||||
// Make sure it doesn't get double called with the play event
|
// Make sure it doesn't get double called with the play event
|
||||||
@@ -578,8 +589,6 @@ function sponsorsLookup(id: string) {
|
|||||||
lastCheckVideoTime = -1
|
lastCheckVideoTime = -1
|
||||||
lastCheckTime = 0;
|
lastCheckTime = 0;
|
||||||
|
|
||||||
lastVideoTime = video.currentTime;
|
|
||||||
|
|
||||||
if (!video.paused){
|
if (!video.paused){
|
||||||
startSponsorSchedule();
|
startSponsorSchedule();
|
||||||
}
|
}
|
||||||
@@ -590,8 +599,6 @@ function sponsorsLookup(id: string) {
|
|||||||
lastCheckVideoTime = -1;
|
lastCheckVideoTime = -1;
|
||||||
lastCheckTime = 0;
|
lastCheckTime = 0;
|
||||||
|
|
||||||
lastVideoTime = video.currentTime;
|
|
||||||
|
|
||||||
cancelSponsorSchedule();
|
cancelSponsorSchedule();
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -610,9 +617,9 @@ function sponsorsLookup(id: string) {
|
|||||||
utils.asyncRequestToServer('GET', "/api/skipSegments", {
|
utils.asyncRequestToServer('GET', "/api/skipSegments", {
|
||||||
videoID: id,
|
videoID: id,
|
||||||
categories
|
categories
|
||||||
}).then(async (response: Response) => {
|
}).then(async (response: FetchResponse) => {
|
||||||
if (response.status === 200) {
|
if (response.ok) {
|
||||||
let recievedSegments: SponsorTime[] = await response.json();
|
let recievedSegments: SponsorTime[] = JSON.parse(response.responseText);
|
||||||
if (!recievedSegments.length) {
|
if (!recievedSegments.length) {
|
||||||
console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments));
|
console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments));
|
||||||
return;
|
return;
|
||||||
@@ -783,6 +790,11 @@ function updatePreviewBarPositionMobile(parent: Element) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function updatePreviewBar() {
|
function updatePreviewBar() {
|
||||||
|
if(isAdPlaying) {
|
||||||
|
previewBar.set([], [], 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (previewBar === null || video === null) return;
|
if (previewBar === null || video === null) return;
|
||||||
|
|
||||||
let localSponsorTimes = sponsorTimes;
|
let localSponsorTimes = sponsorTimes;
|
||||||
@@ -843,7 +855,7 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
|
|||||||
let endTimeIndex = getLatestEndTimeIndex(sponsorTimes, minSponsorTimeIndex);
|
let endTimeIndex = getLatestEndTimeIndex(sponsorTimes, minSponsorTimeIndex);
|
||||||
|
|
||||||
let previewSponsorStartTimes = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments);
|
let previewSponsorStartTimes = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments);
|
||||||
let previewSponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, currentTime, true, false);
|
let previewSponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, currentTime, false, false);
|
||||||
|
|
||||||
let minPreviewSponsorTimeIndex = previewSponsorStartTimes.indexOf(Math.min(...previewSponsorStartTimesAfterCurrentTime));
|
let minPreviewSponsorTimeIndex = previewSponsorStartTimes.indexOf(Math.min(...previewSponsorStartTimesAfterCurrentTime));
|
||||||
let previewEndTimeIndex = getLatestEndTimeIndex(sponsorTimesSubmitting, minPreviewSponsorTimeIndex);
|
let previewEndTimeIndex = getLatestEndTimeIndex(sponsorTimesSubmitting, minPreviewSponsorTimeIndex);
|
||||||
@@ -947,68 +959,61 @@ function previewTime(time: number) {
|
|||||||
if (video.paused){
|
if (video.paused){
|
||||||
video.play();
|
video.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start preview resetter
|
|
||||||
if (previewResetter !== null){
|
|
||||||
clearTimeout(previewResetter);
|
|
||||||
}
|
|
||||||
|
|
||||||
previewResetter = setTimeout(() => previewResetter = null, 4000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//skip from the start time to the end time for a certain index sponsor time
|
//skip from the start time to the end time for a certain index sponsor time
|
||||||
function skipToTime(v: HTMLVideoElement, index: number, sponsorTimes: SponsorTime[], openNotice: boolean) {
|
function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) {
|
||||||
let autoSkip: boolean = utils.getCategorySelection(sponsorTimes[index].category).option === CategorySkipOption.AutoSkip;
|
// There will only be one submission if it is manual skip
|
||||||
|
let autoSkip: boolean = utils.getCategorySelection(skippingSegments[0].category).option === CategorySkipOption.AutoSkip;
|
||||||
|
|
||||||
if (autoSkip || previewResetter !== null) {
|
if (autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) {
|
||||||
v.currentTime = sponsorTimes[index].segment[1];
|
v.currentTime = skipTime[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
lastSponsorTimeSkipped = sponsorTimes[index].segment[0];
|
|
||||||
|
|
||||||
let currentUUID: string = sponsorTimes[index].UUID;
|
|
||||||
lastSponsorTimeSkippedUUID = currentUUID;
|
|
||||||
|
|
||||||
if (openNotice) {
|
if (openNotice) {
|
||||||
//send out the message saying that a sponsor message was skipped
|
//send out the message saying that a sponsor message was skipped
|
||||||
if (!Config.config.dontShowNotice || !autoSkip) {
|
if (!Config.config.dontShowNotice || !autoSkip) {
|
||||||
let skipNotice = new SkipNotice(currentUUID, autoSkip, skipNoticeContentContainer);
|
let skipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer);
|
||||||
|
|
||||||
//auto-upvote this sponsor
|
|
||||||
if (Config.config.trackViewCount && autoSkip && Config.config.autoUpvote) {
|
|
||||||
vote(1, currentUUID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//send telemetry that a this sponsor was skipped
|
//send telemetry that a this sponsor was skipped
|
||||||
if (Config.config.trackViewCount && !sponsorSkipped[index] && autoSkip) {
|
if (Config.config.trackViewCount && autoSkip) {
|
||||||
utils.sendRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + currentUUID);
|
let alreadySkipped = false;
|
||||||
|
let isPreviewSegment = false;
|
||||||
|
|
||||||
// Count this as a skip
|
for (const segment of skippingSegments) {
|
||||||
Config.config.minutesSaved = Config.config.minutesSaved + (sponsorTimes[index].segment[1] - sponsorTimes[index].segment[0]) / 60;
|
let index = sponsorTimes.indexOf(segment);
|
||||||
|
if (index !== -1 && !sponsorSkipped[index]) {
|
||||||
|
utils.asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID);
|
||||||
|
|
||||||
|
sponsorSkipped[index] = true;
|
||||||
|
} else if (sponsorSkipped[index]) {
|
||||||
|
alreadySkipped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index === -1) isPreviewSegment = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count this as a skip
|
||||||
|
if (!alreadySkipped && !isPreviewSegment) {
|
||||||
|
Config.config.minutesSaved = Config.config.minutesSaved + (skipTime[1] - skipTime[0]) / 60;
|
||||||
Config.config.skipCount = Config.config.skipCount + 1;
|
Config.config.skipCount = Config.config.skipCount + 1;
|
||||||
|
|
||||||
sponsorSkipped[index] = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function unskipSponsorTime(UUID) {
|
function unskipSponsorTime(segment: SponsorTime) {
|
||||||
if (sponsorTimes != null) {
|
if (sponsorTimes != null) {
|
||||||
//add a tiny bit of time to make sure it is not skipped again
|
//add a tiny bit of time to make sure it is not skipped again
|
||||||
video.currentTime = utils.getSponsorTimeFromUUID(sponsorTimes, UUID).segment[0] + 0.001;
|
video.currentTime = segment.segment[0] + 0.001;
|
||||||
|
|
||||||
checkIfInsideSegment();
|
checkIfInsideSegment();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function reskipSponsorTime(UUID) {
|
function reskipSponsorTime(segment: SponsorTime) {
|
||||||
if (sponsorTimes != null) {
|
video.currentTime = segment.segment[1];
|
||||||
video.currentTime = utils.getSponsorTimeFromUUID(sponsorTimes, UUID).segment[1];
|
|
||||||
|
|
||||||
// See if any skips need to be done if this is inside of another segment
|
|
||||||
startSponsorSchedule(true, utils.getSponsorTimeFromUUID(sponsorTimes, UUID).segment[1]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1371,13 +1376,7 @@ function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNo
|
|||||||
if (skipNotice != null) {
|
if (skipNotice != null) {
|
||||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||||
//success (treat rate limits as a success)
|
//success (treat rate limits as a success)
|
||||||
if (type === 0 || category) {
|
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
|
||||||
skipNotice.afterDownvote.bind(skipNotice)(type, category);
|
|
||||||
}
|
|
||||||
} else if (response.successType == 0) {
|
|
||||||
//failure: duplicate vote
|
|
||||||
skipNotice.setNoticeInfoMessage.bind(skipNotice)(chrome.i18n.getMessage("voteFail"))
|
|
||||||
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
|
|
||||||
} else if (response.successType == -1) {
|
} else if (response.successType == -1) {
|
||||||
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode))
|
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode))
|
||||||
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
|
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
|
||||||
@@ -1504,7 +1503,7 @@ async function sendSubmitMessage(){
|
|||||||
document.getElementById("submitButton").style.animation = "unset";
|
document.getElementById("submitButton").style.animation = "unset";
|
||||||
(<HTMLImageElement> document.getElementById("submitImage")).src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
|
(<HTMLImageElement> document.getElementById("submitImage")).src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
|
||||||
|
|
||||||
alert(utils.getErrorMessage(response.status) + "\n\n" + (await response.text()));
|
alert(utils.getErrorMessage(response.status) + "\n\n" + (response.responseText));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1577,3 +1576,16 @@ function sendRequestToCustomServer(type, fullAddress, callback) {
|
|||||||
//submit this request
|
//submit this request
|
||||||
xmlhttp.send();
|
xmlhttp.send();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the isAdPlaying flag and hide preview bar/controls if ad is playing
|
||||||
|
*/
|
||||||
|
function updateAdFlag() {
|
||||||
|
let wasAdPlaying = isAdPlaying;
|
||||||
|
isAdPlaying = document.getElementsByClassName('ad-showing').length > 0;
|
||||||
|
|
||||||
|
if(wasAdPlaying != isAdPlaying) {
|
||||||
|
updatePreviewBar();
|
||||||
|
updateVisibilityOfPlayerControlsButton();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
33
src/popup.ts
33
src/popup.ts
@@ -168,9 +168,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
if (userID != undefined) {
|
if (userID != undefined) {
|
||||||
//there are probably some views on these submissions then
|
//there are probably some views on these submissions then
|
||||||
//get the amount of views from the sponsors submitted
|
//get the amount of views from the sponsors submitted
|
||||||
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) {
|
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(response) {
|
||||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
if (response.status == 200) {
|
||||||
let viewCount = JSON.parse(xmlhttp.responseText).viewCount;
|
let viewCount = JSON.parse(response.responseText).viewCount;
|
||||||
if (viewCount != 0) {
|
if (viewCount != 0) {
|
||||||
if (viewCount > 1) {
|
if (viewCount > 1) {
|
||||||
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
|
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
|
||||||
@@ -185,9 +185,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
//get this time in minutes
|
//get this time in minutes
|
||||||
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(xmlhttp) {
|
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(response) {
|
||||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
if (response.status == 200) {
|
||||||
let minutesSaved = JSON.parse(xmlhttp.responseText).timeSaved;
|
let minutesSaved = JSON.parse(response.responseText).timeSaved;
|
||||||
if (minutesSaved != 0) {
|
if (minutesSaved != 0) {
|
||||||
if (minutesSaved != 1) {
|
if (minutesSaved != 1) {
|
||||||
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
|
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
|
||||||
@@ -797,9 +797,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
//make the options username setting option visible
|
//make the options username setting option visible
|
||||||
function setUsernameButton() {
|
function setUsernameButton() {
|
||||||
//get username from the server
|
//get username from the server
|
||||||
utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, function (xmlhttp, error) {
|
utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, function (response) {
|
||||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
if (response.status == 200) {
|
||||||
PageElements.usernameInput.value = JSON.parse(xmlhttp.responseText).userName;
|
PageElements.usernameInput.value = JSON.parse(response.responseText).userName;
|
||||||
|
|
||||||
PageElements.submitUsername.style.display = "unset";
|
PageElements.submitUsername.style.display = "unset";
|
||||||
PageElements.usernameInput.style.display = "unset";
|
PageElements.usernameInput.style.display = "unset";
|
||||||
@@ -808,13 +808,13 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
PageElements.setUsername.style.display = "unset";
|
PageElements.setUsername.style.display = "unset";
|
||||||
PageElements
|
PageElements
|
||||||
PageElements.setUsernameStatusContainer.style.display = "none";
|
PageElements.setUsernameStatusContainer.style.display = "none";
|
||||||
} else if (xmlhttp.readyState == 4) {
|
} else {
|
||||||
PageElements.setUsername.style.display = "unset";
|
PageElements.setUsername.style.display = "unset";
|
||||||
PageElements.submitUsername.style.display = "none";
|
PageElements.submitUsername.style.display = "none";
|
||||||
PageElements.usernameInput.style.display = "none";
|
PageElements.usernameInput.style.display = "none";
|
||||||
|
|
||||||
PageElements.setUsernameStatusContainer.style.display = "unset";
|
PageElements.setUsernameStatusContainer.style.display = "unset";
|
||||||
PageElements.setUsernameStatus.innerText = utils.getErrorMessage(xmlhttp.status);
|
PageElements.setUsernameStatus.innerText = utils.getErrorMessage(response.status);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -826,15 +826,15 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
PageElements.setUsernameStatus.innerText = "Loading...";
|
PageElements.setUsernameStatus.innerText = "Loading...";
|
||||||
|
|
||||||
//get the userID
|
//get the userID
|
||||||
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (xmlhttp, error) {
|
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (response) {
|
||||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
if (response.status == 200) {
|
||||||
//submitted
|
//submitted
|
||||||
PageElements.submitUsername.style.display = "none";
|
PageElements.submitUsername.style.display = "none";
|
||||||
PageElements.usernameInput.style.display = "none";
|
PageElements.usernameInput.style.display = "none";
|
||||||
|
|
||||||
PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("success");
|
PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("success");
|
||||||
} else if (xmlhttp.readyState == 4) {
|
} else {
|
||||||
PageElements.setUsernameStatus.innerText = utils.getErrorMessage(xmlhttp.status);
|
PageElements.setUsernameStatus.innerText = utils.getErrorMessage(response.status);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -883,9 +883,6 @@ async function runThePopup(messageListener?: MessageListener) {
|
|||||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||||
//success (treat rate limits as a success)
|
//success (treat rate limits as a success)
|
||||||
addVoteMessage(chrome.i18n.getMessage("voted"), UUID)
|
addVoteMessage(chrome.i18n.getMessage("voted"), UUID)
|
||||||
} else if (response.successType == 0) {
|
|
||||||
//failure: duplicate vote
|
|
||||||
addVoteMessage(chrome.i18n.getMessage("voteFail"), UUID)
|
|
||||||
} else if (response.successType == -1) {
|
} else if (response.successType == -1) {
|
||||||
addVoteMessage(utils.getErrorMessage(response.statusCode), UUID)
|
addVoteMessage(utils.getErrorMessage(response.statusCode), UUID)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,17 +2,18 @@ import * as React from "react";
|
|||||||
import * as ReactDOM from "react-dom";
|
import * as ReactDOM from "react-dom";
|
||||||
|
|
||||||
import SkipNoticeComponent from "../components/SkipNoticeComponent";
|
import SkipNoticeComponent from "../components/SkipNoticeComponent";
|
||||||
|
import { SponsorTime } from "../types";
|
||||||
|
|
||||||
class SkipNotice {
|
class SkipNotice {
|
||||||
UUID: string;
|
segments: SponsorTime[];
|
||||||
autoSkip: boolean;
|
autoSkip: boolean;
|
||||||
// Contains functions and variables from the content script needed by the skip notice
|
// Contains functions and variables from the content script needed by the skip notice
|
||||||
contentContainer: () => any;
|
contentContainer: () => any;
|
||||||
|
|
||||||
noticeElement: HTMLDivElement;
|
noticeElement: HTMLDivElement;
|
||||||
|
|
||||||
constructor(UUID: string, autoSkip: boolean = false, contentContainer) {
|
constructor(segments: SponsorTime[], autoSkip: boolean = false, contentContainer) {
|
||||||
this.UUID = UUID;
|
this.segments = segments;
|
||||||
this.autoSkip = autoSkip;
|
this.autoSkip = autoSkip;
|
||||||
this.contentContainer = contentContainer;
|
this.contentContainer = contentContainer;
|
||||||
|
|
||||||
@@ -35,7 +36,11 @@ class SkipNotice {
|
|||||||
|
|
||||||
let amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
let amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
||||||
//this is the suffix added at the end of every id
|
//this is the suffix added at the end of every id
|
||||||
let idSuffix = this.UUID + amountOfPreviousNotices;
|
let idSuffix = "";
|
||||||
|
for (const segment of this.segments) {
|
||||||
|
idSuffix += segment.UUID;
|
||||||
|
}
|
||||||
|
idSuffix += amountOfPreviousNotices;
|
||||||
|
|
||||||
this.noticeElement = document.createElement("div");
|
this.noticeElement = document.createElement("div");
|
||||||
this.noticeElement.id = "sponsorSkipNoticeContainer" + idSuffix;
|
this.noticeElement.id = "sponsorSkipNoticeContainer" + idSuffix;
|
||||||
@@ -43,7 +48,7 @@ class SkipNotice {
|
|||||||
referenceNode.prepend(this.noticeElement);
|
referenceNode.prepend(this.noticeElement);
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<SkipNoticeComponent UUID={UUID}
|
<SkipNoticeComponent segments={segments}
|
||||||
autoSkip={autoSkip}
|
autoSkip={autoSkip}
|
||||||
contentContainer={contentContainer}
|
contentContainer={contentContainer}
|
||||||
closeListener={() => this.close()} />,
|
closeListener={() => this.close()} />,
|
||||||
|
|||||||
11
src/types.ts
11
src/types.ts
@@ -5,12 +5,12 @@ interface ContentContainer {
|
|||||||
(): {
|
(): {
|
||||||
vote: (type: any, UUID: any, category?: string, skipNotice?: SkipNoticeComponent) => void,
|
vote: (type: any, UUID: any, category?: string, skipNotice?: SkipNoticeComponent) => void,
|
||||||
dontShowNoticeAgain: () => void,
|
dontShowNoticeAgain: () => void,
|
||||||
unskipSponsorTime: (UUID: any) => void,
|
unskipSponsorTime: (segment: SponsorTime) => void,
|
||||||
sponsorTimes: SponsorTime[],
|
sponsorTimes: SponsorTime[],
|
||||||
sponsorTimesSubmitting: SponsorTime[],
|
sponsorTimesSubmitting: SponsorTime[],
|
||||||
v: HTMLVideoElement,
|
v: HTMLVideoElement,
|
||||||
sponsorVideoID,
|
sponsorVideoID,
|
||||||
reskipSponsorTime: (UUID: any) => void,
|
reskipSponsorTime: (segment: SponsorTime) => void,
|
||||||
updatePreviewBar: () => void,
|
updatePreviewBar: () => void,
|
||||||
onMobileYouTube: boolean,
|
onMobileYouTube: boolean,
|
||||||
sponsorSubmissionNotice: SubmissionNotice,
|
sponsorSubmissionNotice: SubmissionNotice,
|
||||||
@@ -22,6 +22,12 @@ interface ContentContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface FetchResponse {
|
||||||
|
responseText: string,
|
||||||
|
status: number,
|
||||||
|
ok: boolean
|
||||||
|
}
|
||||||
|
|
||||||
interface VideoDurationResponse {
|
interface VideoDurationResponse {
|
||||||
duration: number;
|
duration: number;
|
||||||
}
|
}
|
||||||
@@ -55,6 +61,7 @@ interface SponsorTime {
|
|||||||
type VideoID = string;
|
type VideoID = string;
|
||||||
|
|
||||||
export {
|
export {
|
||||||
|
FetchResponse,
|
||||||
VideoDurationResponse,
|
VideoDurationResponse,
|
||||||
ContentContainer,
|
ContentContainer,
|
||||||
CategorySelection,
|
CategorySelection,
|
||||||
|
|||||||
67
src/utils.ts
67
src/utils.ts
@@ -1,5 +1,5 @@
|
|||||||
import Config from "./config";
|
import Config from "./config";
|
||||||
import { CategorySelection, SponsorTime } from "./types";
|
import { CategorySelection, SponsorTime, FetchResponse } from "./types";
|
||||||
|
|
||||||
import * as CompileConfig from "../config.json";
|
import * as CompileConfig from "../config.json";
|
||||||
|
|
||||||
@@ -276,29 +276,18 @@ class Utils {
|
|||||||
* @param address The address to add to the SponsorBlock server address
|
* @param address The address to add to the SponsorBlock server address
|
||||||
* @param callback
|
* @param callback
|
||||||
*/
|
*/
|
||||||
async asyncRequestToCustomServer(type: string, url: string, data = {}) {
|
async asyncRequestToCustomServer(type: string, url: string, data = {}): Promise<FetchResponse> {
|
||||||
|
return new Promise((resolve) => {
|
||||||
// If GET, convert JSON to parameters
|
// Ask the background script to do the work
|
||||||
if (type.toLowerCase() === "get") {
|
chrome.runtime.sendMessage({
|
||||||
for (const key in data) {
|
message: "sendRequest",
|
||||||
let seperator = url.includes("?") ? "&" : "?";
|
type,
|
||||||
let value = (typeof(data[key]) === "string") ? data[key]: JSON.stringify(data[key]);
|
url,
|
||||||
url += seperator + key + "=" + value;
|
data
|
||||||
}
|
}, (response) => {
|
||||||
|
resolve(response);
|
||||||
data = null;
|
});
|
||||||
}
|
})
|
||||||
|
|
||||||
const response = await fetch(url, {
|
|
||||||
method: type,
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
},
|
|
||||||
redirect: 'follow',
|
|
||||||
body: data ? JSON.stringify(data) : null
|
|
||||||
});
|
|
||||||
|
|
||||||
return response;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -308,7 +297,7 @@ class Utils {
|
|||||||
* @param address The address to add to the SponsorBlock server address
|
* @param address The address to add to the SponsorBlock server address
|
||||||
* @param callback
|
* @param callback
|
||||||
*/
|
*/
|
||||||
async asyncRequestToServer(type: string, address: string, data = {}) {
|
async asyncRequestToServer(type: string, address: string, data = {}): Promise<FetchResponse> {
|
||||||
let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
|
let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
|
||||||
|
|
||||||
return await (this.asyncRequestToCustomServer(type, serverAddress + address, data));
|
return await (this.asyncRequestToCustomServer(type, serverAddress + address, data));
|
||||||
@@ -321,25 +310,17 @@ class Utils {
|
|||||||
* @param address The address to add to the SponsorBlock server address
|
* @param address The address to add to the SponsorBlock server address
|
||||||
* @param callback
|
* @param callback
|
||||||
*/
|
*/
|
||||||
sendRequestToServer(type: string, address: string, callback?: (xmlhttp: XMLHttpRequest, err: boolean) => any) {
|
sendRequestToServer(type: string, address: string, callback?: (response: FetchResponse) => void) {
|
||||||
let xmlhttp = new XMLHttpRequest();
|
|
||||||
|
|
||||||
let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
|
let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
|
||||||
|
|
||||||
xmlhttp.open(type, serverAddress + address, true);
|
// Ask the background script to do the work
|
||||||
|
chrome.runtime.sendMessage({
|
||||||
if (callback != undefined) {
|
message: "sendRequest",
|
||||||
xmlhttp.onreadystatechange = function () {
|
type,
|
||||||
callback(xmlhttp, false);
|
url: serverAddress + address
|
||||||
};
|
}, (response) => {
|
||||||
|
callback(response);
|
||||||
xmlhttp.onerror = function(ev) {
|
});
|
||||||
callback(xmlhttp, true);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
//submit this request
|
|
||||||
xmlhttp.send();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getFormattedMinutes(seconds: number) {
|
getFormattedMinutes(seconds: number) {
|
||||||
|
|||||||
Reference in New Issue
Block a user