mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-06 19:47:04 +03:00
Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
42a813d325 | ||
|
|
e6dfb5041e | ||
|
|
c857308038 | ||
|
|
f73abdbabc | ||
|
|
43184e466f | ||
|
|
627c7769b0 | ||
|
|
759dba9cd3 | ||
|
|
7cac2c4045 | ||
|
|
27bb44189f | ||
|
|
4c44f3da25 | ||
|
|
e917a3e94a | ||
|
|
1570bfdd0a | ||
|
|
e511de9f88 | ||
|
|
e694393edc | ||
|
|
e1cb86e6b4 | ||
|
|
22221ba9bd | ||
|
|
9ad67c1a03 | ||
|
|
53071a9291 | ||
|
|
56e40b791f | ||
|
|
93316bf463 | ||
|
|
3f98e2fc73 | ||
|
|
9f4fec2a43 | ||
|
|
89cc6ed184 | ||
|
|
730d966019 | ||
|
|
c509b8807c | ||
|
|
7de907fa23 | ||
|
|
b4e03ae055 | ||
|
|
c9460bd6c6 | ||
|
|
d9800b3c14 | ||
|
|
fa7f577177 | ||
|
|
ca2727655e | ||
|
|
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 | ||
|
|
50c9c9fe8a | ||
|
|
7f8badb34d | ||
|
|
f9d8daeca0 | ||
|
|
55070d5852 | ||
|
|
789bd5939b | ||
|
|
b591fbfc4b | ||
|
|
57eb122fce | ||
|
|
aec287f0cf | ||
|
|
c68aabaa40 |
76
.github/workflows/release.yml
vendored
76
.github/workflows/release.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
- run: npm install
|
||||
- name: Copy configuration
|
||||
run: cp config.json.example config.json
|
||||
|
||||
|
||||
# Create Chrome artifacts
|
||||
- name: Create Chrome artifacts
|
||||
run: npm run build:chrome
|
||||
@@ -26,9 +26,8 @@ jobs:
|
||||
name: ChromeExtension
|
||||
path: dist
|
||||
- run: mkdir ./builds
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/ChromeExtension.zip ./dist/*
|
||||
- name: Zip Artifacts
|
||||
run: cd ./dist ; zip -r ../builds/ChromeExtension.zip *
|
||||
|
||||
# Create Firefox artifacts
|
||||
- name: Create Firefox artifacts
|
||||
@@ -37,9 +36,8 @@ jobs:
|
||||
with:
|
||||
name: FirefoxExtension
|
||||
path: dist
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/FirefoxExtension.zip ./dist/*
|
||||
- name: Zip Artifacts
|
||||
run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip *
|
||||
|
||||
# Create Beta artifacts (Builds with the name changed to beta)
|
||||
- name: Create Chrome Beta artifacts
|
||||
@@ -48,19 +46,41 @@ jobs:
|
||||
with:
|
||||
name: ChromeExtensionBeta
|
||||
path: dist
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist/*
|
||||
- name: Zip Artifacts
|
||||
run: cd ./dist ; zip -r ../builds/ChromeExtensionBeta.zip *
|
||||
|
||||
# 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
|
||||
run: npm run build:firefox -- --env.stream=beta
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: FirefoxExtensionBeta
|
||||
path: dist
|
||||
- uses: montudor/action-zip@v0.1.0
|
||||
with:
|
||||
args: zip -qq -r ./builds/FirefoxExtensionBeta.zip ./dist/*
|
||||
- name: Zip Artifacts
|
||||
run: cd ./dist ; zip -r ../builds/FirefoxExtensionBeta.zip *
|
||||
|
||||
# Create Firefox Signed Beta version
|
||||
- name: Create Firefox Signed Beta artifacts
|
||||
@@ -70,38 +90,14 @@ jobs:
|
||||
WEB_EXT_API_SECRET: ${{ secrets.WEB_EXT_API_SECRET }}
|
||||
- name: Install rename
|
||||
run: sudo apt-get install rename
|
||||
- name: Install signed file
|
||||
run: cd ./web-ext-artifacts
|
||||
- run: rename 's/.*/FirefoxSignedInstaller.xpi/' *
|
||||
- run: cd ..
|
||||
- name: Rename signed file
|
||||
run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' *
|
||||
- uses: actions/upload-artifact@v1
|
||||
with:
|
||||
name: FirefoxExtensionSigned.xpi
|
||||
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||
|
||||
# Upload each release asset
|
||||
- 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
|
||||
- name: Upload FirefoxSignedInstaller.xpi to release
|
||||
uses: Shopify/upload-to-release@master
|
||||
with:
|
||||
args: web-ext-artifacts/FirefoxSignedInstaller.xpi
|
||||
|
||||
@@ -46,7 +46,7 @@ The backend server code is available here: https://github.com/ajayyy/SponsorBloc
|
||||
|
||||
It is a simple SQLite database that will hold all the timing data.
|
||||
|
||||
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database.db. If you are planning on using the database in another project, please read the [API Docs](https://github.com/ajayyy/SponsorBlock/wiki/API-Docs) page for more information.
|
||||
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database.db ([License](https://github.com/ajayyy/SponsorBlock/wiki/Database-and-API-License)). If you are planning on using the database in another project, please read the [API Docs](https://github.com/ajayyy/SponsorBlock/wiki/API-Docs) page for more information.
|
||||
|
||||
The dataset and API are now being used in some [ports](https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports) as well as a [neural network](https://github.com/andrewzlee/NeuralBlock).
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"serverAddress": "https://sponsor.ajay.app",
|
||||
"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"]
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "__MSG_Name__",
|
||||
"version": "1.2.28.1",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "2.0.2.2",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"content_scripts": [{
|
||||
@@ -30,6 +30,9 @@
|
||||
"icons/PlayerUploadFailedIconSponsorBlocker256px.png",
|
||||
"icons/upvote.png",
|
||||
"icons/downvote.png",
|
||||
"icons/thumbs_down.svg",
|
||||
"icons/thumbs_up.svg",
|
||||
"icons/help.svg",
|
||||
"icons/report.png",
|
||||
"icons/close.png",
|
||||
"icons/beep.ogg",
|
||||
@@ -47,7 +50,7 @@
|
||||
"*://*/*"
|
||||
],
|
||||
"browser_action": {
|
||||
"default_title": "__MSG_Name__",
|
||||
"default_title": "SponsorBlock",
|
||||
"default_popup": "popup.html"
|
||||
},
|
||||
"background": {
|
||||
|
||||
3171
package-lock.json
generated
3171
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -15,7 +15,7 @@
|
||||
"react-dom": "^16.12.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"web-ext": "^4.0.0",
|
||||
"web-ext": "^4.2.0",
|
||||
"@types/chrome": "0.0.91",
|
||||
"@types/firefox-webext-browser": "70.0.1",
|
||||
"@types/jest": "^24.0.23",
|
||||
@@ -32,7 +32,7 @@
|
||||
},
|
||||
"scripts": {
|
||||
"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:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium",
|
||||
"build": "npm run build:chrome",
|
||||
|
||||
@@ -1 +1,152 @@
|
||||
{}
|
||||
{
|
||||
"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": "Гласувано!"
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Възникна грешка с връзката. Код на грешката: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Искате ли да подадете спонсорствата за това видео ID"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Изглежда, че не сте подали някои спонсорства. Върнете се в страницата и ги подайте (те не са изтрити)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Премахни Спонсорствата"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Отворете изскачащия прозорец на SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Подайте спонсорите"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Сигурни ли сте, че искате да подадете това?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Добавяне на канала към Whitelist"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Премахване на канала от Whitelist"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Гласуване за спонсорства"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Вие сте помогнали на хора да пропуснат "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Вижте leaderboard-а"
|
||||
},
|
||||
"here": {
|
||||
"message": "тук"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Елате в официалния Discord сървър за да давате предложения!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Скрий това"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Настройки"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Показване на бутоните в YouTube Player-а"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Скриване на бутоните в YouTube Player-а"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,16 +33,16 @@
|
||||
"message": "gesponsorter Inhalt"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "gesponsorte Inhalte"
|
||||
"message": "gesponserten Inhalten"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsor übersprungen"
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Diesen Beitrag aufwerten"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Melden"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Melde dieses Segment als unzulässig."
|
||||
"message": "Beitrag als unzulässig melden."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Abbrechen"
|
||||
@@ -71,6 +71,9 @@
|
||||
"paused": {
|
||||
"message": "Pausiert"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Timer angehalten"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -101,9 +104,6 @@
|
||||
"voted": {
|
||||
"message": "Abgestimmt!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Du hast bereits so abgestimmt."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Der Server ist scheinbar offline. Bitte unverzüglich dem Entwickler melden."
|
||||
},
|
||||
@@ -272,12 +272,12 @@
|
||||
"errorCode": {
|
||||
"message": "Fehlermeldung: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Sponsor überspringen?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Überspringen"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Übersprungen"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Auto-Überspringen deaktivieren"
|
||||
},
|
||||
@@ -350,6 +350,9 @@
|
||||
"supportInvidious": {
|
||||
"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": {
|
||||
"message": "Invidious Support aktivieren, Autoskip deaktivieren, Tasten ausblenden und vieles mehr."
|
||||
},
|
||||
@@ -374,12 +377,6 @@
|
||||
"currentInstances": {
|
||||
"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": {
|
||||
"message": "Minimale Dauer (Sekunden):"
|
||||
},
|
||||
@@ -486,20 +483,82 @@
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Bezahlte Promotion, bezahlte Empfehlungen und direkte Werbung. Nicht für Selbstpromotion oder kostenlose Shoutouts an Ursachen/Webseiten/Produkte, die sie mögen."
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Intro Animation"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Intro Animationen, die in der Serie wiederholt werden oder keinen direkten Wert haben. Dies sollte nicht für Musikvideos verwendet werden."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Intro"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Endkarten/Credits"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für gesprochene Fazits. Dies sollte keine nützlichen Inhalte beinhalten. Dies sollte nicht für Musikvideos verwendet werden."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaktions-Erinnerung (Abonnieren)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Wenn es eine kurze Erinnerung gibt, zu abonnieren oder zu folgen in der Mitte des Videos. Wenn es lange ist oder etwas Konkretes ist, sollte es stattdessen unter Selbstpromotion stehen."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Interaktions-Erinnerung"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Eigenwerbung und Merchandise"
|
||||
"message": "Unbezahlt/Eigenwerbung"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Ähnlich wie bei \"Sponsor\" mit Ausnahme von unbezahlten oder Selbstpromotion. Dies beinhaltet Abschnitte über Waren, Spenden oder Informationen darüber, mit wem sie zusammengearbeitet haben."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musik: Nicht-Musik-Abschnitt"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Nur für den Einsatz in Musikvideos. Dies beinhaltet Einführungen oder Outros in Musikvideos."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Nicht-Musik"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Spenden/Nachrichten vorlesen"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Nachrichten lesen"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktivieren"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manueller Überspringen"
|
||||
"message": "Manuelles Überspringen"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Vor-/Rücklaufleiste anzeigen"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Ihre Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einem Zahlenzeichen am Anfang sein."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Vorschau Farbe",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Suchleisten-Farbe"
|
||||
},
|
||||
"category": {
|
||||
"message": "Kategorie"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "Option zum Überspringen",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Beta Testing Server aktivieren"
|
||||
"message": "Beta-Testing Server aktivieren"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "Deine Einreichungen und Stimmen werden NICHT für den Hauptserver geltend. Benutze dies nur für Tests."
|
||||
@@ -512,5 +571,63 @@
|
||||
},
|
||||
"moreCategories": {
|
||||
"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": "Irgendetwas hält SponsorBlock davon ab, die Videodaten abzurufen. Möglicherweise ist es 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."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Mehrere Segmente"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Richtlinien"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Lesen Sie die Richtlinien!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Kategorien sind hier!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Öffnen Sie die Optionen um Intros, Outros, Merch usw. zu überspringen."
|
||||
},
|
||||
"unsubmittedWarning": {
|
||||
"message": "Nicht eingereichte Segment-Benachrichtigung"
|
||||
},
|
||||
"unsubmittedWarningDescription": {
|
||||
"message": "Senden Sie eine Benachrichtigung, wenn Sie ein Video mit nicht hochgeladenen Segmenten verlassen"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,4 @@
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock for YouTube - Skip Sponsorships",
|
||||
"description": "Name of the extension."
|
||||
@@ -35,14 +31,14 @@
|
||||
"Segments": {
|
||||
"message": "sponsor segments"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsor Skipped"
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Upvote this submission"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Report"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Report this sponsor submission as incorrect."
|
||||
"message": "Report this submission as incorrect."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Dismiss"
|
||||
@@ -71,6 +67,9 @@
|
||||
"paused": {
|
||||
"message": "Paused"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Timer Stopped"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -101,11 +100,8 @@
|
||||
"voted": {
|
||||
"message": "Voted!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "You have already voted this way before."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "It seems the sever is down. Contact the dev immediately."
|
||||
"message": "It seems the server is down. Contact the dev immediately."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "A connection error has occured. Error code: "
|
||||
@@ -272,12 +268,12 @@
|
||||
"errorCode": {
|
||||
"message": "Error Code: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Skip Sponsor?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Skip"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Skipped"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Disable Auto Skip"
|
||||
},
|
||||
@@ -377,12 +373,6 @@
|
||||
"currentInstances": {
|
||||
"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": {
|
||||
"message": "Minimum duration (seconds):"
|
||||
},
|
||||
@@ -489,24 +479,54 @@
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like."
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Intro Animation"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Intro animations that are recurring in the series or provide no direct value. This should not be used on music videos."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Intro"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Endcards/Credits"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credits or when the YouTube endcards appear. Not for spoken conclusions. This should not include useful content. This should not be used on music videos."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaction Reminder (Subscribe)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "When there is a short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should be under self promotion instead."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Interaction Reminder"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Self-Promotion and Merchandise"
|
||||
"message": "Unpaid/Self Promotion"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar to \"sponsor\" except for unpaid or self promotion. This includes sections about merchandise, donations, or information about who they collaborated with."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Music: Non-Music Section"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Only for use in music videos. This includes introductions or outros in music videos."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Music"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Donation/Message Readings"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Message Reading"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Disable"
|
||||
},
|
||||
@@ -516,6 +536,23 @@
|
||||
"showOverlay": {
|
||||
"message": "Show In Seek Bar"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Your color is formatted incorrectly. It should be a 3 or 6 digit hex code with a number sign at the beginning."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Preview Color",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Seek Bar Color"
|
||||
},
|
||||
"category": {
|
||||
"message": "Category"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "Skip Option",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Enable Beta Testing Server"
|
||||
},
|
||||
@@ -559,12 +596,34 @@
|
||||
"message": "Consider Enabling Force Channel Check Before Skipping Sponsors"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Incorrect"
|
||||
"message": "Incorrect/Wrong Timing"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Wrong Category"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Multiple Segments"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Guidelines"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Read The Guidelines!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Categories are here!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Open the options to skip intros, outros, merch, etc."
|
||||
},
|
||||
"unsubmittedWarning": {
|
||||
"message": "Unsubmitted Segments Notification"
|
||||
},
|
||||
"unsubmittedWarningDescription": {
|
||||
"message": "Send a notification when you leave a video with segments that are not uploaded"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,497 @@
|
||||
{}
|
||||
{
|
||||
"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_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,381 @@
|
||||
{}
|
||||
{
|
||||
"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!"
|
||||
},
|
||||
"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_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": {
|
||||
"message": "segments commerciaux"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Message commercial passé"
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Voter pour cette entrée"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Signaler"
|
||||
@@ -71,6 +71,9 @@
|
||||
"paused": {
|
||||
"message": "En pause"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Timer arrêté"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -78,13 +81,13 @@
|
||||
"message": "Êtes-vous certain(e) de vouloir supprimer vos soumissions ?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Une erreur s'est produite lors de la soumission, veuillez ré-essayer plus tard."
|
||||
"message": "Une erreur s'est produite lors de la soumission, veuillez réessayer plus tard."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"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ées !"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Pas de sponsors trouvés"
|
||||
"message": "Pas de messages commerciaux trouvés"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Début du message commercial"
|
||||
@@ -101,9 +104,6 @@
|
||||
"voted": {
|
||||
"message": "A voté !"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Vous avez déjà voté pour ce choix."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
|
||||
},
|
||||
@@ -144,7 +144,7 @@
|
||||
"message": "Vous avez soumis jusqu'à présent"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Vous avez fait gagner aux autres "
|
||||
"message": "Vous avez permis aux autres de passer "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Consulter le classement"
|
||||
@@ -168,10 +168,10 @@
|
||||
"message": "Soumettre les temps"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Affiché sur le classement public pour montrer vos contributions. Voir sur"
|
||||
"message": "Votre pseudo est inscrit dans le classement public pour afficher vos contributions. Le consulter"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Choisir pseudo"
|
||||
"message": "Choisir un pseudonyme"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!"
|
||||
@@ -216,7 +216,7 @@
|
||||
"message": "Activer le suivi des vues de segments commerciaux"
|
||||
},
|
||||
"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": {
|
||||
"message": "Afficher la notification"
|
||||
@@ -272,12 +272,12 @@
|
||||
"errorCode": {
|
||||
"message": "Code d'erreur : "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Passer le sponsor ?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Passer"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Passé"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Désactiver le passage automatique"
|
||||
},
|
||||
@@ -297,7 +297,7 @@
|
||||
"message": "Vous avez passé "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Vous avez économisé "
|
||||
"message": "Vous vous êtes économisé "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minute"
|
||||
@@ -324,7 +324,7 @@
|
||||
"message": "Vérifiez status.sponsor.ajay.app pour le status du serveur."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Importer/Exporter votre ID d'utilisateur"
|
||||
"message": "Importer/Exporter Votre ID d'Utilisateur"
|
||||
},
|
||||
"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."
|
||||
@@ -342,13 +342,16 @@
|
||||
"message": "Passage automatique"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Afficher l'avis après le passage d'un sponsor"
|
||||
"message": "Notifier après qu'un sponsor ait été sauté"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Il est actuellement réglé sur :"
|
||||
},
|
||||
"supportInvidious": {
|
||||
"message": "Soutenir Invidious"
|
||||
"message": "Supporter 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": {
|
||||
"message": "Activer Invidious, désactiver le passage automatique, masquer les boutons et plus encore."
|
||||
@@ -374,12 +377,6 @@
|
||||
"currentInstances": {
|
||||
"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": {
|
||||
"message": "Durée minimale (en secondes):"
|
||||
},
|
||||
@@ -392,11 +389,14 @@
|
||||
"showUploadButton": {
|
||||
"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": {
|
||||
"message": "Adresse du serveur SponsorBlock"
|
||||
},
|
||||
"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": {
|
||||
"message": "Sauvegarder"
|
||||
@@ -404,15 +404,42 @@
|
||||
"reset": {
|
||||
"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": {
|
||||
"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": {
|
||||
"message": "m.youtube.com est maintenant pris en charge"
|
||||
},
|
||||
"exportOptions": {
|
||||
"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": {
|
||||
"message": "Soumettre"
|
||||
},
|
||||
@@ -422,14 +449,29 @@
|
||||
"delete": {
|
||||
"message": "Supprimer"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Aperçu"
|
||||
},
|
||||
"edit": {
|
||||
"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": {
|
||||
"message": "La clé"
|
||||
},
|
||||
"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": {
|
||||
"message": "est lié à une autre action. Veuillez sélectionner une autre clé."
|
||||
@@ -438,13 +480,151 @@
|
||||
"message": "à",
|
||||
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Message commercial"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promotion rémunérée, parrainage rémunéré et publicité directe. Pas pour l'autopromotion ou les présentations gratuites de causes, de créateurs, de sites web ou de produits qu'ils aiment."
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Générique d'introduction"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Introductions animées qui sont récurrentes ou qui n'ont pas de valeur ajoutée directe dans la série. Ne doit pas être utilisé pour les vidéos musicales."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Introduction"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Générique de fin"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Générique de fin ou quand les fiches de fin de vidéo apparaissent. Ne pas utiliser pour les conclusions orales. Ne doit pas inclure de contenu utile. Ne pas utiliser sur les vidéos de musique."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Rappel d'interaction (abonnement)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Lorsqu'il y a un bref rappel pour liker, s'abonner ou les follow parmi le contenu. Si le message est long ou porte sur quelque chose de spécifique, cela devrait plutôt être classé comme une autopromotion."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Rappel d'interaction"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Non rémunéré/autopromotion"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Semblable au \"sponsor\", excepté pour la promotion non rémunérée ou l'auto-promotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musique : Segment non-musicale"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "A utiliser uniquement dans les vidéos musicales. Cela inclut les introductions ou les fins dans les vidéos."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Hors musique"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Votre couleur est mal formatée. Il devrait s'agir d'un code hexadécimal à 3 ou 6 chiffres avec un signe numérique au début."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Couleur en mode aperçu",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Couleur dans la barre de progression"
|
||||
},
|
||||
"category": {
|
||||
"message": "Catégorie"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "Option de saut",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"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": {
|
||||
"message": "(Maintenant)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"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"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Instructions"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Lisez les instructions !!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Les catégories sont là !"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Ouvrir les options pour sauter les intros, outros, marchandises, etc."
|
||||
},
|
||||
"unsubmittedWarning": {
|
||||
"message": "Notification de segments non soumis"
|
||||
},
|
||||
"unsubmittedWarningDescription": {
|
||||
"message": "Envoyer une notification lorsque vous quittez une vidéo avec des segments qui ne sont pas téléversés"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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": "ચેનલ વ્હાઇટલિસ્ટેડ!"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Betöltés..."
|
||||
},
|
||||
|
||||
@@ -31,15 +31,9 @@
|
||||
"Segments": {
|
||||
"message": "spezzoni sponsorizzati"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsorizzazione Saltata"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Segnala"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Segnala questo spezzone come non corretto."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Chiudi"
|
||||
},
|
||||
@@ -97,12 +91,6 @@
|
||||
"voted": {
|
||||
"message": "Votato!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Hai già votato."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Sembra che il server non funzioni. Contatta subito lo sviluppatore."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Si è verificato un errore durante la connessione. Codice errore: "
|
||||
},
|
||||
|
||||
@@ -1,7 +1,79 @@
|
||||
{
|
||||
"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."
|
||||
},
|
||||
"400": {
|
||||
"message": "Server zegt dat het verzoek ongeldig is"
|
||||
},
|
||||
"429": {
|
||||
"message": "Je hebt te veel sponsortijden voor deze video doorgegeven, weet je zeker dat het er zo veel zijn?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Dit is al een keer ingediend"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanaal gewhitelist!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponsor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponsoren"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "Sponsor segment"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "Sponsor segmenten"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Stem op deze indiening"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Melden"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Rapporteer deze indiening als onjuist."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Negeren"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Bezig met laden..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "Minuten"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "Seconden"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Nooit weergeven"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Druk op unskip om naar waar je vandaan komt te gaan."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Unskip"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Reskip"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Gepauzeerd"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Timer gestopt"
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Weet je zeker dat je dit formulier wilt wissen?\n\n"
|
||||
},
|
||||
@@ -23,12 +95,6 @@
|
||||
"voted": {
|
||||
"message": "Gestemd!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "U hebt al eerder op deze manier gestemd."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Het lijkt erop dat de server niet draait. Contacteer de ontwikkelaar onmiddellijk."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Er is een verbindingsfout opgetreden. Foutcode: "
|
||||
},
|
||||
@@ -41,7 +107,120 @@
|
||||
"clearTimes": {
|
||||
"message": "Sponsortijden wissen"
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Bekijk de ranglijst"
|
||||
},
|
||||
"here": {
|
||||
"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": {
|
||||
"message": "SponsorBlock na YouTube - Omiń reklamy sponsorów",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"400": {
|
||||
"message": "Serwer odpowiedział, że to zapytanie jest niepoprawne"
|
||||
},
|
||||
"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": {
|
||||
"message": "Treść została już wcześniej zgłoszona"
|
||||
"message": "To już zostało wcześniej zgłoszone"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanał dodany do wyjątków!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponsor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponsorzy"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmet sponsorowany"
|
||||
"message": "segment sponsorowany"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segmenty sponsorowane"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Segment przewinięty"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Zgłoś"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Zgłoś ten segment reklamowy jako nieprawidłowy."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Odrzuć"
|
||||
},
|
||||
@@ -74,16 +75,16 @@
|
||||
"message": "Wystąpił błąd podczas przesyłania twojego zgłoszenia, proszę spróbować ponownie później."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Segmenty reklamowe dla tego nagrania są już w bazie!"
|
||||
"message": "Segmenty sponsora dla tego nagrania są już w bazie!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Nie znaleziono segmentów reklamowych"
|
||||
"message": "Nie znaleziono segmentów sponsora"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Reklama zaczyna się teraz"
|
||||
"message": "Sponsor zaczyna się teraz"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Reklama kończy się teraz"
|
||||
"message": "Sponsor kończy się teraz"
|
||||
},
|
||||
"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ę."
|
||||
@@ -94,29 +95,23 @@
|
||||
"voted": {
|
||||
"message": "Zagłosowano!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Już na to głosowałeś."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Wygląda na to, że serwer nie działa. Skontaktuj się z dewloperem."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Błąd z połączeniem. Kod błędu: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Chcesz zgłosić segment sponsorowany dla nagrania z id"
|
||||
"message": "Chcesz zgłosić segment sponsorowany dla filmu z id"
|
||||
},
|
||||
"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": {
|
||||
"message": "Wyczyść segmenty reklamowe"
|
||||
"message": "Usuń segmenty reklamowe"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Otwórz okienko SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Zgłoś segmenty reklamowe"
|
||||
"message": "Zgłoś segmenty sponsora"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Jesteś pewien, że chcesz to zgłosić?"
|
||||
@@ -128,10 +123,10 @@
|
||||
"message": "Usuń kanał z listy wyjątków"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Głosuj na segment reklamowy"
|
||||
"message": "Głosuj na segment sponsora"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Nagraj czasy segmentów reklamowych"
|
||||
"message": "Nagraj czasy segmentów sponsorowanych"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Jak na razie zgłosiłeś:"
|
||||
@@ -265,9 +260,6 @@
|
||||
"errorCode": {
|
||||
"message": "Kod błędu: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Przewinąć reklamę?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Przewiń"
|
||||
},
|
||||
@@ -337,6 +329,9 @@
|
||||
"supportInvidious": {
|
||||
"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": {
|
||||
"message": "Wesprzyj Invidious, wyłącz auto przewijanie, ukryj guziki i więcej."
|
||||
},
|
||||
@@ -361,10 +356,16 @@
|
||||
"currentInstances": {
|
||||
"message": "Obecne instancje:"
|
||||
},
|
||||
"enableAutoUpvote": {
|
||||
"message": "Auto potwierdzanie"
|
||||
"minDuration": {
|
||||
"message": "Minimalny czas trwania (sekundy):"
|
||||
},
|
||||
"whatAutoUpvote": {
|
||||
"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."
|
||||
"mobileUpdateInfo": {
|
||||
"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": {
|
||||
"message": "SponsorBlock para YouTube - Pule patrocínios",
|
||||
"description": "Name of the extension."
|
||||
@@ -31,15 +35,9 @@
|
||||
"Segments": {
|
||||
"message": "segmentos de patrocinadores"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Patrocinador pulado"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Reportar"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Reportar essa subimissão como inválida."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Ignorar"
|
||||
},
|
||||
@@ -74,7 +72,7 @@
|
||||
"message": "Tem certeza que quer limpar isso?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Teve um erro ao enviar seus segmentos, tente novamente depois."
|
||||
"message": "Houve um erro ao enviar seus segmentos, tente novamente mais tarde."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Os patrocinadores desse vídeo estão no banco de dados!"
|
||||
@@ -89,7 +87,7 @@
|
||||
"message": "Patrocínio termina agora"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Isso provavelmente não é uma tab do YouTube, ou você clicou muito cedo. \n Se sabe que é uma tab do YouTube,\n feche esse popup e abra de novo."
|
||||
"message": "Nenhum vídeo do YouTube foi encontrado nesta aba. Se você sabe que esta é uma aba do YouTube, feche este pop-up e abra-o novamente. Se isso não funcionar, tente recarregar a aba."
|
||||
},
|
||||
"success": {
|
||||
"message": "Sucesso!"
|
||||
@@ -97,20 +95,14 @@
|
||||
"voted": {
|
||||
"message": "Votado!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Você já votou antes."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Parece que o servidor caiu. Contate o desenvolvedor o quanto antes."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Um erro de conexão aconteceu: Código: "
|
||||
"message": "Ocorreu um erro de conexão. Código de erro: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Quer enviar os segmentos para o vídeo de ID"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Parece que você se esqueceu de enviar alguns segmentos. Volta pra página para os enviar (não foram deletados)."
|
||||
"message": "Parece que você se esqueceu de enviar alguns segmentos. Volte para aquela página para enviá-los (eles não foram deletados)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Apagar intervalos dos patrocínios"
|
||||
@@ -119,25 +111,25 @@
|
||||
"message": "Abrir o Popup SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Submeter intervalos dos patrocínios"
|
||||
"message": "Enviar intervalos de patrocínios"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Tem a certeza que pretende submeter?"
|
||||
"message": "Você tem certeza que deseja enviar isto?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Meter canal na Whitelist"
|
||||
"message": "Colocar canal na lista branca"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Remover canal da Whitelist"
|
||||
"message": "Remover canal da lista branca"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Vote num intervalo de patrocínio"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Registe um intervalo de patrocínio"
|
||||
"message": "Grave os intervalos de um patrocínio"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Até agora submeteu"
|
||||
"message": "Até agora, você já enviou"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Poupaste a outros de "
|
||||
@@ -149,28 +141,28 @@
|
||||
"message": "aqui"
|
||||
},
|
||||
"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ça e termina para gravá-lo na base de dados."
|
||||
},
|
||||
"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 ponto e vírgula (;) com a janela focada em um vídeo para reportar o começo/fim de um patrocínio e aspas (\") para enviar. (Esta configuração pode ser mudada nas opções.)"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Intervalos de Patrocínios Escolhidos mais Recentemente"
|
||||
"message": "Últimos Intervalos de Patrocínios Seleciados"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Limpar Intervalos"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Submeter Intervalos"
|
||||
"message": "Enviar Intervalos"
|
||||
},
|
||||
"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": {
|
||||
"message": "Criar nomde de utilizador"
|
||||
"message": "Definir nome de usuário"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
|
||||
"message": "Junte-se ao servidor do discord oficial para dar dicas e sugestões!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Esconder isto"
|
||||
@@ -228,5 +220,324 @@
|
||||
"sourceCode": {
|
||||
"message": "Código fonte",
|
||||
"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_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": {
|
||||
"message": "segmentos de patrocínio"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Patrocínio saltado"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Reportar"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Reportar subimissão como inválida."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Ignorar"
|
||||
},
|
||||
@@ -97,12 +91,6 @@
|
||||
"voted": {
|
||||
"message": "Votado!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Já votou antes."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Parece que o servidor caiu. Contacte o desenvolvedor o quanto antes."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Deu-se um erro de conecção: Código: "
|
||||
},
|
||||
|
||||
@@ -1 +1,633 @@
|
||||
{}
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock pentru YouTube - Sari peste sponsorizări",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Sari peste sponsorizările din videoclipurile de pe YouTube. Adaugă sponsorizări din videoclipurile pe care le urmăriți pentru a salva timpul altora.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Serverul a spus că această cerere este invalidă"
|
||||
},
|
||||
"429": {
|
||||
"message": "Ai trimis prea multe timpuri ale sponsorizărilor pentru acest videoclip, sunteți sigur că sunt atât de multe?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Acest lucru a fost deja trimis înainte"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Canalul a fost adăugat la excepții!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponsor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponsori"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segment sponsorizat"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segmente sponsorizate"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Votează această înregistrare"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Raportează"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Raportează această înregistrare ca fiind incorectă."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Renunță"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Se încarcă..."
|
||||
},
|
||||
"Mins": {
|
||||
"message": "Minute"
|
||||
},
|
||||
"Secs": {
|
||||
"message": "Secunde"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Nu mai afișa niciodată"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Apasă unskip pentru a reveni."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Unskip"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Sari peste"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pauză"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Cronometru oprit"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Pentru a edita sau a șterge valori individuale, apasă butonul de informații sau deschide popup-ul extensiei apăsând iconița extensiei din colțul dreapta sus."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Ești sigur că vrei să ștergi asta?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "A apărut o eroare în trimiterea timpilor sponsorizărilor, încearcă din nou mai târziu."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Sponsorii acestui videoclip se află în baza de date!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Nu s-a gasit niciun sponsor"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Sponsorizarea Începe Acum"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Sponsorizarea Se Termină Acum"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nu există niciun videoclip YouTube în aceast tab. Dacă știți că acesta este un tab YouTube, închideți acest popup și deschideți-l din nou. Daca nici asta nu merge, încercați să reîncărcați pagina."
|
||||
},
|
||||
"success": {
|
||||
"message": "Succes!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Votat!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Se pare că serverul este oprit. Contactează imediat dezvoltatorul."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "A apărut o eroare de conexiune. Cod de eroare: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Doriți să trimiteți timpii sponsorizărilor pentru acest video id"
|
||||
},
|
||||
"leftTimes": {
|
||||
"message": "Se pare că ați lăsat unii timpi ai sponsorilor netrimiși. Mergeți înapoi la pagina respectivă pentru a îi trimite (timpii nu au fost șterși)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Șterge Timpii Sponsorizărilor"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Deschide Popup-ul SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Trimte Timpii Sponsorizărilor"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Sunteți sigur că doriți să trimiteți asta?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Adaugă Canalul La Excepții"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Șterge Canalul De La Excepții"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Votează Timpii Sponsorizărilor"
|
||||
},
|
||||
"recordTimes": {
|
||||
"message": "Înregistrează timpul unei sponsorizări"
|
||||
},
|
||||
"soFarUHSubmited": {
|
||||
"message": "Până acum, ai trimis"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Ai salvat alte persoane de la "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Vezi clasamentul"
|
||||
},
|
||||
"here": {
|
||||
"message": "aici"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Apasă pe butonul de mai jos când începe o sponsorizare și când se termină pentru a înregistra-o și pentru a o trimite la baza de date."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Indiciu: Apasă pe tasta punct și virgulă în timp ce ești centrat pe videoclip pentru a raporta începutul/finalul unei sponsorizări și apasă pe ghilimele pentru a o trimite. (Acest lucru poate fi schimbat din opțiuni)"
|
||||
},
|
||||
"lastTimes": {
|
||||
"message": "Ultimii Timpi Ai Mesajului Sponsorizat Aleși"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Șterge Timpii"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Trimite Timpii"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Acest lucru este folosit pe pagina publică de statistici pentru a arăta cât de mult ai contribuit. Vezi pagina"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Setează Numele De Utilizator"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Vino și alătură-te serverului oficial de discord pentru a oferi sugestii și feedback!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Ascunde asta"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Opţiuni"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Arată Butoanele Pe Playerul De YouTube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Ascunde Butoanele Pe Playerul De YouTube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Asta ascunde butoanele ce apar pe playerul de YouTube pentru a trimite segmente."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Arată Butoanele De Informații Pe Playerul De YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Ascunde Butoanele De Informații Pe Playerul De YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Acesta este butonul care deschide popup-ul pe pagina de YouTube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Ascunde Butonul De Ștergere Pe Playerul De YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Arată Butonul De Ștergere Pe Playerul De YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Acest buton de pe playerul de YouTube va șterge toate segmentele netrimise pentru videoclipul curent."
|
||||
},
|
||||
"disableViewTracking": {
|
||||
"message": "Dezactivează Urmărirea Săriturilor"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Activează Urmărirea Săriturilor"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Acest lucru urmărește peste ce sponsori ai sărit pentru a informa utilizatorii cât de mult înregistrările lor i-au ajutat pe alții și\neste folosit ca un contor împreună cu upvoturile pentru a ne asigura că spamul nu pătrunde în baza de date. Extensia trimite un mesaj\nserverului de fiecare dată când sari peste un sponsor. Sperăm că majoritatea oamenilor nu vor schimba această setare astfel că numerele să fie exacte. :)"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Arată Notificarea Din Nou"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock este o extensie care va sări peste segmentele sponsorizate din videoclipurile de pe YouTube. SponsorBlock este o extensie crowdsourced care lasă pe oricine să trimită începutul și finalul segmentelor sponsorizate din videoclipurile de pe YouTube. Odată ce o persoană trimite aceste informații, toată lumea cu această extensie va sări peste acel segment sponsorizat.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Website",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Cod Sursă",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "Notificarea a fost actualizată!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Dacă nu îți place, apasă butonul nu mai arăta niciodată.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Setează tasta pentru pornirea sponsorizării"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Setează tasta pentru trimiterea sponsorizării"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Selectează o tastă apasând-o"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tasta a fost setată la: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Dezactivează SponsorBlock"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "Activează SponsorBlock"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Munca Ta",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Serverul pare să fie supraîncărcat. Încercați din nou în câteva secunde."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Codul Erorii: "
|
||||
},
|
||||
"skip": {
|
||||
"message": "Sari"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Sărit"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Dezactivează Autoskip"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Activează Autoskip"
|
||||
},
|
||||
"autoSkipDescription": {
|
||||
"message": "Autoskip va sări automat peste segmentele sponsorizate pentru tine. Dacă este dezactivată, o notificare va apărea care vă va întreba dacă doriți să săriți peste."
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Notificare Audio Când Sari"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Notificarea audio va reda un sunet atunci când sari peste un segement sponsorizat. Daca este dezactivat (sau autoskip este dezactivat), niciun sunet nu va fi redat."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Ai sărit peste "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "V-ați salvat "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minut"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "minute"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "oră"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "ore"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Ai salvat alte persoane"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " din viața lor."
|
||||
},
|
||||
"guildlinesSummary": {
|
||||
"message": "- Asigurați-vă că segmentul conține doar promoții plătite, nimic altceva.\n- Asigurați-vă că dacă săriți peste acest segment nu săriți și peste conținut valoros\n- Dacă tot videoclipul este o sponsorizare, vă rugăm să nu îl trimiteți. Un sistem de trimitere a întregului videoclip este în lucru.\n- Vă rugăm să nu trimiteți mențiunile că videoclipul este sponsorizat care ar putea arăta favoritismul (spre exemplu dacă un videoclip de tip review este sponsorizat, nu trimiteți mențiunea că acel videoclip este sponsorizat)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Verificați status.sponsor.ajay.app pentru starea serverului."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Importă/Exportă Id-ul Tău De Utilizator"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Acest lucru trebuie să fie păstrat. Este ca și o parolă și nu ar trebui împartășită cu nimeni. Daca cineva are acest lucru, se poate da drept tu."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Setează Id-ul Utilizatorului"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Atenție: Schimbarea Id-ului Utilizatorului este permanentă. Sunteți sigur că doriți să faceți asta? Asigurați-vă că ați făcut o copie de rezervă."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Creat De"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Sari Peste Automat"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Arată O Notificare După Ce Am Sărit Peste O Sponsorizare"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". În prezent este setat:"
|
||||
},
|
||||
"supportInvidious": {
|
||||
"message": "Sprijină Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) este un client YouTube terț. Pentru a susține, trebuie să acceptați permisiunile suprimentare. Această funcție NU funcționează în incognito pe Chrome sau în alte variante Chromium."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Activează suportul Invidious, dezactivează autoskip-ul, ascunde butoanele și altele."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Adaugă O Instanță Invidious"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Adaugă o instanță personalizată Invidious. Aceasta trebuie să fie formatată DOAR cu domeniul. Exemplu: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Adaugă"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Acesta este un domeniu invalid. Acesta trebuie să includă DOAR partea de domeniu. Exemplu: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Resetează Lista De Instanțe Invidious"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Sunteți pe cale să resetați lista de instanțe Invidious"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Instanțele curente:"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Durată minimă (secunde):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Segmentele de sponsor mai scurte decât valoarea setată nu vor fi omise sau afișate în player."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Următoarea înregistrare este mai mică decât opțiunea voastră de durată minimă. Acest lucru ar putea însemna că a fost deja trimisă și a fost ignorat datorită acestei opțiuni. Sunteți sigur că doriți să trimiteți?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Arată Butonul De Încărcare"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Acest buton apare pe playerul YouTube după ce ați selectat un marcaj de timp și sunteți gata să îl trimiteți."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresa Serverului SponsorBlock"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "Adresa SponsorBlock este folosită pentru a se efectua apeluri către server.\nDacă nu ai propriul tău server, acesta nu ar trebui modificat."
|
||||
},
|
||||
"save": {
|
||||
"message": "Salvează"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Resetează"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Adresa nu este în forma corectă. Asigurați-vă că http:// sau https:// se află la început."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Sunteți sigur că doriți să resetați asta?"
|
||||
},
|
||||
"confirmPrivacy": {
|
||||
"message": "Acest videoclip a fost detectat ca nelistat. Apasă anulați dacă nu doriți să verificați sponsorii."
|
||||
},
|
||||
"unlistedCheck": {
|
||||
"message": "Ignoră Videoclipurile Nelistate/Private"
|
||||
},
|
||||
"whatUnlistedCheck": {
|
||||
"message": "Această setare va încetini puțin SponsorBlock. Căutările segmentelor sponsorizate necesită trimiterea ID-ului videoclipului către server. Dacă sunteți îngrijorat de trimiterea ID-ul videoclipurilor nelistate, activați această opțiune."
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com este acum suportat"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Importă/Exportă Toate Opțiunile"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Aceasta este întreaga configurație în format JSON. Asta include si ID-ul tău de utilizator, așa că fi sigur să împărtășești asta cu înțelepciune."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Setează Opțiuni"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "Atenție: Schimbarea acestei opțiuni este permanentă și poate strica instalarea. Sunteți sigur că doriți să faceți asta? Asigurati-vă că ați făcut o copie de rezervă."
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "Acest JSON nu este formatat corect. Opțiunile dumneavoastră nu au fost modificate."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Trimite Segment"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Trimite"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Anulează"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Șterge"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Previzualizare"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Editare"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "Copiază Informațiile de Depanare În Clipboard"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "Eroare la scrierea în clipboard"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Copiază informația în clipboard pentru a fi furnizată dezvoltatorului când se găsește o eroare / când un dezvoltator o cere. Informațiile sensibile precum ID-ul de utilizator, canale exceptate, și adresa serverului personalizat au fost șterse. Însă conține informații precum useragent-ul, browser-ul, sistemul de operare, și numărul versiunii extensiei. "
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Tasta"
|
||||
},
|
||||
"keyAlreadyUsedByYouTube": {
|
||||
"message": "este deja utilizat de YouTube. Vă rugăm selectați o altă tastă."
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "este deja setată la o altă acțiune. Vă rugăm să selectați o altă tastă."
|
||||
},
|
||||
"to": {
|
||||
"message": "până la",
|
||||
"description": "Used between sponsor times. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promovare plătită, refferali plătiți și reclame directe. Nu pentru autopromovări sau promovări gratis ale cauzelor/creatorilor/website-urilor/produselor."
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Animație de Început"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Animațiile de introducere care se repetă în serie sau care nu oferă nici o valoare directă. Această opțiune nu ar trebui folosită în videoclipurile muzicale."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Intro"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Ecran De Final/Credite"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credite sau când ecranul de final YouTube apare. Nu pentru concluzii vorbite. Nu ar trebui să includă conținut util. Nu ar trebui folosit în videoclipuri muzicale."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Reamintire de Interactiune (Abonare)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Când există o scurtă remintire pentru like, abonare sau urmărire în mijlocul conținutului. Daca este mai lung sau despre ceva specific, folosiți autopromovarea."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Reamintire de Interacțiune"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Promovare neplătită/autopromovare"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar cu \"sponsorizare\" doar că este neplătit sau autopromovare. Aceasta include secțiuni despre merchandise, donații, sau informații despre cei cu care au colaborat."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muzică: Secţiune Non-Muzicală"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Doar pentru videoclipuri muzicale. Include introducțiile sau outro-urile în videoclipurile muzicale."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Muzical"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Transmisiune În Direct: Donație/Citirea Mesajelor"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Citire Mesaj"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Dezactivare"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Sari Peste Manual"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Arată În Bara de Derulare"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Culoarea ta este formatată incorect. Ar trebui să fie un cod hexadecimal de 3 sau 6 cifre cu un hash la început."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Previzualizare Culoare",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Culoarea Barei de Derulare"
|
||||
},
|
||||
"category": {
|
||||
"message": "Categorie"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "Opțiunea Săriturii",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Activează Serverul de Teste"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "Înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal. Utilizați asta doar pentru teste."
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Toate înregistrările și voturile dumneavoastră NU VOR FI CONTORIZATE pe serverul principal în timp ce vă conectați la serverul de teste. Asigurați-vă că dezactivați asta când vreți să trimiteți înregistrări reale."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Acum)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Mai multe categorii"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Sfârșit)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "ascuns: downvote"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "ascuns: prea scurt"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"message": "ID-ul Canalului nu a fost încărcat încă."
|
||||
},
|
||||
"adblockerIssue": {
|
||||
"message": "Se pare că ceva blocheaza abilitatea extensiei SponsorBlock pentru a obține datele videoclipului. Cel mai probabil este adblocker-ul dumneavoastră. Vă rugăm să verificați https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Dacă acest lucru continuă să se întample, ar putea fi cauzat de adblocker-ul dumneavoastră. Vă rugăm să verificați \nhttps://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Forțează Verificarea Canalului Înainte De A Sări Peste Sponsorizări"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "În mod implicit, va sări peste sponsorizări chiar și înainte de a ști ce canal este. În mod implicit, s-ar putea să se sară și peste unele sponsorizări ce încep la secunda zero din canalele excluse. Activând această opțiune va preveni asta, dar va face ca toate săriturile să aibă o ușoară întârziere, deoarece obținerea Id-ului canalului poate dura ceva timp. Această întărziere poate fi neobservată daca aveți internet rapid."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Consideră Activarea Forțării Verificarii Canalului Înainte De A Sări Peste Sponsorizări"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Timpi Incorecți/Greșiți"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Categorie Greșită"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Categoria acestui videoclip este muzică. Sunteți sigur că doriți să trimiteți segmente non-muzicale? Dacă acest videoclip nu este de fapt muzică, nu ar trebui să trimiteți acest segment. Vă rugăm să citiți recomandările dacă sunteți confuz."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Segmente Multiple"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Instrucțiuni"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Citește Instrucțiunile!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Categoriile sunt aici!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Deschide opțiunile pentru a sări peste intro-uri, outro-uri, merch, etc."
|
||||
},
|
||||
"unsubmittedWarning": {
|
||||
"message": "Notificare Segmente Netrimise"
|
||||
},
|
||||
"unsubmittedWarningDescription": {
|
||||
"message": "Trimite o notificare atunci când părăsești un video cu segmente care nu au fost încărcate"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock для YouTube - Пропускайте спонсорские вставки",
|
||||
"description": "Name of the extension."
|
||||
@@ -31,15 +35,9 @@
|
||||
"Segments": {
|
||||
"message": "спонсорские вставки"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Спонсор пропущен"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Ошибка"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Сообщить, что информация об этом спонсорском сегменте ошибочна."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Закрыть"
|
||||
},
|
||||
@@ -97,12 +95,6 @@
|
||||
"voted": {
|
||||
"message": "Голос засчитан!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Вы уже проголосовали таким образом раньше."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Кажется, сервер не работает. Свяжитесь с разработчиком."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Ошибка соединения. Код ошибки: "
|
||||
},
|
||||
@@ -112,6 +104,12 @@
|
||||
"leftTimes": {
|
||||
"message": "Вы ещё не отправили отчёты о некоторых спонсорских вставках. Хотите вернуться на эту страницу, чтобы отправить их (они не удаляются)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Удалить отмеченные сегменты"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Отправить отмеченные сегменты"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Вы уверены, что хотите отправить эту информацию?"
|
||||
},
|
||||
@@ -259,12 +257,12 @@
|
||||
"errorCode": {
|
||||
"message": "Код ошибки: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Пропустить спонсорскую вставку?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Пропустить"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Пропущено"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Отключить автоматический пропуск"
|
||||
},
|
||||
@@ -274,6 +272,12 @@
|
||||
"autoSkipDescription": {
|
||||
"message": "Автоматический пропуск будет пропускать спонсорские вставки за Вас. Если выключено, будет показываться уведомление с предложением пропустить."
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Аудио уведомление при пропуске"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Аудио уведомление о пропуске будет воспроизводиться каждый раз, когда спонсор пропущен. Если отключено (или автоматическое пропуск отключен), звук не будет воспроизводиться."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Вы пропустили "
|
||||
},
|
||||
@@ -331,6 +335,9 @@
|
||||
"supportInvidious": {
|
||||
"message": "Поддержка Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) — это неофициальный клиент для YouTube. Чтобы включить поддержку, Вам понадобится принять дополнительные разрешения. Эта функция НЕ работает в режиме \"инкогнито\" в Chrome и браузерах, основанных на Chromium."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Включить поддержку Invidious, выключить автоматический пропуск, скрыть кнопки и не только."
|
||||
},
|
||||
@@ -355,12 +362,6 @@
|
||||
"currentInstances": {
|
||||
"message": "Текущие инстансы:"
|
||||
},
|
||||
"enableAutoUpvote": {
|
||||
"message": "Автоматически голосовать \"за\""
|
||||
},
|
||||
"whatAutoUpvote": {
|
||||
"message": "Если это включено, расширение будет голосовать \"за\" все предложения других пользователей, если Вы на них не пожалуетесь. Если уведомление отключено, это не будет происходить."
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Минимальная длительность (секунд):"
|
||||
},
|
||||
@@ -405,5 +406,23 @@
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com теперь поддерживается"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Импорт/Экспорт всех настроек"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Это вся конфигурация в формате JSON. Этот файл содержит Ваш идентификатор пользователя, поэтому не забудьте общаться с этим разумно."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Сейчас)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Прочие категории"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Конец)"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Неверная категория"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,9 +9,6 @@
|
||||
"Sponsors": {
|
||||
"message": "sponzori"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponzor bol Preskočený"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Nahlásiť"
|
||||
},
|
||||
@@ -54,9 +51,6 @@
|
||||
"errorCode": {
|
||||
"message": "Kód chyby: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Preskočiť Sponzor?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Preskočiť"
|
||||
},
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
{
|
||||
"Name": {
|
||||
"message": "SponsorBlock",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"fullName": {
|
||||
"message": "SponsorBlock för YouTube - Hoppa över sponsring",
|
||||
"description": "Name of the extension."
|
||||
@@ -19,6 +23,9 @@
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanal vitlistad!"
|
||||
},
|
||||
"Sponsor": {
|
||||
"message": "sponsor"
|
||||
},
|
||||
"Sponsors": {
|
||||
"message": "sponsorer"
|
||||
},
|
||||
@@ -28,14 +35,11 @@
|
||||
"Segments": {
|
||||
"message": "sponsorsegment"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsormeddelande undvikt"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Rapportera"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Rapportera det här sponsorsegmentet som inkorrekt."
|
||||
"message": "Rapportera det här segmentet som inkorrekt."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Avfärda"
|
||||
@@ -64,6 +68,9 @@
|
||||
"paused": {
|
||||
"message": "Pausad"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Timern stoppad"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Klicka på infoknappen eller öppna popup-rutan genom att klicka på tilläggets ikon i hörnet uppe till höger för att redigera eller ta bort inviduella värden."
|
||||
},
|
||||
@@ -94,11 +101,8 @@
|
||||
"voted": {
|
||||
"message": "Röstat!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Du har redan röstat."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Det ser ut som att servern är nere. Kontakta utvecklaren med en gång."
|
||||
"message": "Det verkar som att servern är nere. Kontakta utvecklaren omedelbart."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Anslutningsfel. Felkod: "
|
||||
@@ -142,6 +146,9 @@
|
||||
"viewLeaderboard": {
|
||||
"message": "Se leaderboarden"
|
||||
},
|
||||
"here": {
|
||||
"message": "här"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Klicka på knappen nedan när sponsormeddelandet börjar och slutar för att spela in och rapportera till databasen."
|
||||
},
|
||||
@@ -262,12 +269,12 @@
|
||||
"errorCode": {
|
||||
"message": "Felkod: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Hoppa över sponsormeddelande?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Hoppa över"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Skippat"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Avaktivera Hoppa Över Automatiskt"
|
||||
},
|
||||
@@ -340,6 +347,9 @@
|
||||
"supportInvidious": {
|
||||
"message": "Stöd Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) är en tredjeparts YouTube-klient. För att aktivera stöd måste du acceptera de extra behörigheterna. Detta kommer INTE att fungera i incognito i Chrome och andra Cromium-varianter."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Aktivera Invidious stöd, avaktivera hoppa över automatiskt, dölj knappar och mer."
|
||||
},
|
||||
@@ -364,12 +374,6 @@
|
||||
"currentInstances": {
|
||||
"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": {
|
||||
"message": "Minsta varaktighet (sekunder):"
|
||||
},
|
||||
@@ -476,8 +480,20 @@
|
||||
"category_sponsor": {
|
||||
"message": "Sponsormeddelande"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Självreklam och egna produkter"
|
||||
"category_intro": {
|
||||
"message": "Intro-animation"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Intro-animationer som är återkommande i serien eller inte ger direkt värde. Detta bör inte användas på musikvideor."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Intro"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Endast för användning i musikvideor. Detta inkluderar intros och outros i musikvideor."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Icke-musik"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Avaktivera"
|
||||
@@ -488,6 +504,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Visa Lager Ovanpå Spelare"
|
||||
},
|
||||
"category": {
|
||||
"message": "Kategori"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Aktivera Server För Betatestning"
|
||||
},
|
||||
@@ -506,6 +525,9 @@
|
||||
"bracketEnd": {
|
||||
"message": "(Slut)"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "dold: för kort"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"message": "Kanal-ID är inte inladdat än."
|
||||
},
|
||||
@@ -514,5 +536,24 @@
|
||||
},
|
||||
"itCouldBeAdblockerIssue": {
|
||||
"message": "Om detta fortsätter att inträffa, kan orsaken vara din annonsblockerare. Vänligen kontrollera https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Fel timing"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Fel kategori"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Den här videon är kategoriserad som musik. Är du säker på att du vill skicka in segment med icke-musikkategorier? Om denna video faktiskt är musik, bör du inte skicka in detta segment. Vänligen läs riktlinjerna om du är förvirrad."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Flera segment"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Riktlinjer"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Läs riktlinjerna!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,14 +35,14 @@
|
||||
"Segments": {
|
||||
"message": "sponsor bölümleri"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Sponsor Geçildi"
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Bu öneriye oy ver"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Raporla"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Bu sponsor bölümünü hatalı olarak rapor et."
|
||||
"message": "Bu öneriyi hatalı olarak bildir."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Yoksay"
|
||||
@@ -71,6 +71,9 @@
|
||||
"paused": {
|
||||
"message": "Duraklatıldı"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Zamanlayıcı Durduruldu"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -101,9 +104,6 @@
|
||||
"voted": {
|
||||
"message": "Oylandı!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Bu şekilde zaten oy kullanmıştın."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Sunucu çökmüş gibi duruyor. Derhal geliştiriciyle iletişime geçin."
|
||||
},
|
||||
@@ -272,12 +272,12 @@
|
||||
"errorCode": {
|
||||
"message": "Hata Kodu: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Sponsoru Atla?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Atla"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Atlandı"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Otomatik Atlamayı Devredışı Bırak"
|
||||
},
|
||||
@@ -377,12 +377,6 @@
|
||||
"currentInstances": {
|
||||
"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": {
|
||||
"message": "Minimum süre (saniye):"
|
||||
},
|
||||
@@ -499,7 +493,7 @@
|
||||
"message": "Etkileşim Hatırlatıcısı (Abonelik)"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Kendi Reklamını Yapma ve Ürün"
|
||||
"message": "Karşılıksız/Kendi Reklamı"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Müzik: Müzik Olmayan Bölüm"
|
||||
@@ -559,12 +553,15 @@
|
||||
"message": "Sponsorları Atlamadan Önce Kanal Kontrolünü Zorlamayı Gözden Geçir"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Hatalı"
|
||||
"message": "Hatalı/Yanlış Zaman"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Yanlış Kategori"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Birden Çok Bölüm"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,15 +35,9 @@
|
||||
"Segments": {
|
||||
"message": "спонсорські вставки"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "Спонсор пропущений"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Помилка"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Повідомити, що інформація про це спонсорський сегменті є хибною."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Закрити"
|
||||
},
|
||||
@@ -101,12 +95,6 @@
|
||||
"voted": {
|
||||
"message": "Голос зарахований!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "Ви вже проголосували таким чином раніше."
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Здається, сервер не працює. Зв'яжіться з розробником."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Помилка з'єднання. Код помилки: "
|
||||
},
|
||||
@@ -116,6 +104,15 @@
|
||||
"leftTimes": {
|
||||
"message": "Ви ще не надіслали звіти про деякі спонсорські вставки. Хочете повернутися на цю сторінку, щоб надіслати їх (вони не видаляються)."
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Видалити відмічені сегменти"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Відкрийте спливаюче вікно SponsorBlock"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Надіслати відмічені сегменти"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Ви впевнені, що хочете надіслати цю інформацію?"
|
||||
},
|
||||
@@ -263,12 +260,12 @@
|
||||
"errorCode": {
|
||||
"message": "Код помилки: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "Пропустити спонсорську вставку?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "Пропустити"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Пропущено"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Вимкнути автоматичний пропуск"
|
||||
},
|
||||
@@ -278,6 +275,12 @@
|
||||
"autoSkipDescription": {
|
||||
"message": "Автоматичний пропуск буде пропускати спонсорські вставки за Вас. Якщо вимкнено, буде показуватися повідомлення з пропозицією пропустити."
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Аудіо сповіщення при пропуску"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Аудіо сповіщення про пропуск буде відтворюватися кожен раз, коли спонсор пропущений. Якщо відключено (або автоматичне пропуск відключений), звук не буде відтворюватися."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Ви пропустили "
|
||||
},
|
||||
@@ -335,6 +338,9 @@
|
||||
"supportInvidious": {
|
||||
"message": "Підтримка Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) - це неофіційний клієнт для YouTube. Щоб увімкнути підтримку, Вам знадобиться прийняти додаткові дозволи. Ця функція НЕ працює в режимі \"інкогніто\" в Chrome і браузерах, заснованих на Chromium."
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Увімкнути підтримку Invidious, вимкнути автоматичний пропуск, приховати кнопки і не тільки."
|
||||
},
|
||||
@@ -359,12 +365,6 @@
|
||||
"currentInstances": {
|
||||
"message": "Поточні інстанси:"
|
||||
},
|
||||
"enableAutoUpvote": {
|
||||
"message": "Автоматично голосувати \"за\""
|
||||
},
|
||||
"whatAutoUpvote": {
|
||||
"message": "Якщо це увімкнено, розширення буде голосувати \"за\" всі пропозиції інших користувачів, якщо Ви на них не поскаржитеся. Якщо повідомлення вимкнуто, це не буде відбуватися."
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Мінімальна тривалість (секунд):"
|
||||
},
|
||||
@@ -410,6 +410,15 @@
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com тепер підтримується"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Імпорт/Експорт всіх налаштувань"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Це вся конфігурація в форматі JSON. Цей файл містить Ваш ідентифікатор користувача, тому не забудьте ділитися з цим розумно."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Встановити параметри"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Надіслати сегмент"
|
||||
},
|
||||
@@ -428,6 +437,9 @@
|
||||
"edit": {
|
||||
"message": "Редагувати"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Ключ"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Спонсор"
|
||||
},
|
||||
@@ -445,5 +457,8 @@
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Кінець)"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Невірна категорія"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,14 +35,14 @@
|
||||
"Segments": {
|
||||
"message": "赞助商广告片段"
|
||||
},
|
||||
"noticeTitle": {
|
||||
"message": "已跳过赞助商广告"
|
||||
"upvoteButtonInfo": {
|
||||
"message": "为这个提交点赞"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "报告"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "报告这个被提交的赞助商广告不正确。"
|
||||
"message": "报告此提交不正确。"
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "忽略"
|
||||
@@ -71,6 +71,9 @@
|
||||
"paused": {
|
||||
"message": "已暂停"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "计时器已停止"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "要编辑或删除个别值,请点击信息按钮或通过点击右上角的扩展图标打开扩展弹窗。"
|
||||
},
|
||||
@@ -101,9 +104,6 @@
|
||||
"voted": {
|
||||
"message": "已投票!"
|
||||
},
|
||||
"voteFail": {
|
||||
"message": "您之前已经这样投过了。"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "服务器似乎已宕机。请立即联系开发者。"
|
||||
},
|
||||
@@ -272,12 +272,12 @@
|
||||
"errorCode": {
|
||||
"message": "错误代码: "
|
||||
},
|
||||
"noticeTitleNotSkipped": {
|
||||
"message": "跳过赞助商广告?"
|
||||
},
|
||||
"skip": {
|
||||
"message": "跳过"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "跳过"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "禁用自动跳过"
|
||||
},
|
||||
@@ -350,6 +350,9 @@
|
||||
"supportInvidious": {
|
||||
"message": "支持 Invidious"
|
||||
},
|
||||
"supportInvidiousDescription": {
|
||||
"message": "Invidious (invidio.us) 是一个第三方 Youtube 客户端。要启用支持,您必须允许额外的权限。在 Chrome 及其他 Chromium 变种的匿名模式中无法工作。"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "启用 Invidious 支持,禁用自动跳过,隐藏按钮等等。"
|
||||
},
|
||||
@@ -374,12 +377,6 @@
|
||||
"currentInstances": {
|
||||
"message": "当前实例:"
|
||||
},
|
||||
"enableAutoUpvote": {
|
||||
"message": "自动点赞"
|
||||
},
|
||||
"whatAutoUpvote": {
|
||||
"message": "启用此选项后,扩展将会为所有您观看过的提交点赞,如果您没有报告它们的话。如果通知被禁用,那就不会出现。"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "最小持续时间(秒):"
|
||||
},
|
||||
@@ -486,8 +483,23 @@
|
||||
"category_sponsor": {
|
||||
"message": "赞助商广告"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "开头动画"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "结束画面/结尾职员表"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "互动提醒(订阅)"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "自我推销和商品"
|
||||
"message": "未收钱的/自我推销"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "音乐:非音乐部分"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "直播:捐赠/消息阅读"
|
||||
},
|
||||
"disable": {
|
||||
"message": "禁用"
|
||||
@@ -539,5 +551,17 @@
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "请考虑启用跳过赞助商广告前强制进行频道检查"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "不正确/错误的时间"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "错误的类别"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "此视频被归类为音乐。您确定要提交带有非音乐类别的片段吗?除非此视频实际上不是音乐,否则您不应提交此片段。如果您感到困惑,请阅读指南。"
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "多个片段"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,4 +394,22 @@ input::-webkit-inner-spin-button {
|
||||
color: white;
|
||||
border-width: 3px;
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
.helpButton {
|
||||
|
||||
}
|
||||
|
||||
.helpButton {
|
||||
height: 25px;
|
||||
cursor: pointer;
|
||||
padding: 5px;
|
||||
|
||||
margin: auto;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
position: absolute;
|
||||
}
|
||||
.helpButton:hover {
|
||||
filter: brightness(80%);
|
||||
}
|
||||
@@ -30,15 +30,15 @@
|
||||
Come contribute, make some suggestions and help out in the Discord: <a href="https://discord.gg/QnmVMpU">https://discord.gg/QnmVMpU</a>
|
||||
</p>
|
||||
|
||||
<div class="center">
|
||||
<a class="bigText" href="/options/options.html">Enable optional features</a>
|
||||
</div>
|
||||
<p style="margin-bottom: 0" class="bigText center">Please review the options below</p>
|
||||
|
||||
<p>
|
||||
Some features, such as support for non third-party YouTube sites, are disabled by default and can be enabled in the options. These can be enabled or disabled at any time.
|
||||
Many features are disabled by default. If you want to skip Intros, outros, use Invidious, please enable the specific options. These can be enabled or disabled at any time.
|
||||
You can also hide/show all UI elements added to the YouTube page.
|
||||
</p>
|
||||
|
||||
<iframe src="../options/options.html#embed" width="100%" height="500px" style="border: none"></iframe>
|
||||
|
||||
<h1>How skipping works</h1>
|
||||
|
||||
<p class="projectPreview">
|
||||
|
||||
58
public/icons/help.svg
Normal file
58
public/icons/help.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="help.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="M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z"
|
||||
id="path4"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
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 |
@@ -346,4 +346,8 @@ svg {
|
||||
font-size: 14px;
|
||||
padding: 5px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
.categoryColorTextBox {
|
||||
width: 60px;
|
||||
}
|
||||
@@ -12,13 +12,13 @@
|
||||
|
||||
<body class="sponsorBlockPageBody">
|
||||
|
||||
<div id="title">
|
||||
<div id="title" class="titleBar">
|
||||
<img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic"/>
|
||||
SponsorBlock
|
||||
</div>
|
||||
|
||||
<div class="center">
|
||||
<p class="createdBy">__MSG_createdBy__ <a href="https://ajay.app">Ajay Ramachandran</a> <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
|
||||
<p class="createdBy titleBar">__MSG_createdBy__ <a href="https://ajay.app">Ajay Ramachandran</a> <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
|
||||
|
||||
<h1>__MSG_Options__</h1>
|
||||
|
||||
@@ -149,6 +149,40 @@
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="toggle" sync-option="unsubmittedWarning">
|
||||
<label class="switch-container" label-name="__MSG_unsubmittedWarning__">
|
||||
<label class="switch">
|
||||
<input type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</label>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="small-description">__MSG_unsubmittedWarningDescription__</div>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="toggle" sync-option="forceChannelCheck">
|
||||
<label class="switch-container" label-name="__MSG_forceChannelCheck__">
|
||||
<label class="switch">
|
||||
<input type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
</label>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div class="small-description">__MSG_whatForceChannelCheck__</div>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
@@ -237,23 +271,6 @@
|
||||
<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">
|
||||
<label class="switch-container" label-name="__MSG_enableViewTracking__">
|
||||
<label class="switch">
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<div id="app" class="popupBody sponsorBlockPageBody">
|
||||
<h1 class="popupElement logoText">
|
||||
<img src="icons/IconSponsorBlocker256px.png" height="32px" id="sponsorBlockPopupLogo"/>
|
||||
__MSG_Name__
|
||||
SponsorBlock
|
||||
</h1>
|
||||
|
||||
<!-- Loading text -->
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import * as Types from "./types";
|
||||
import * as CompileConfig from "../config.json";
|
||||
|
||||
import Config from "./config";
|
||||
// Make the config public for debugging purposes
|
||||
@@ -30,7 +30,17 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
switch(request.message) {
|
||||
case "openConfig":
|
||||
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":
|
||||
addSponsorTime(request.time, request.videoID, callback);
|
||||
|
||||
@@ -47,17 +57,19 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
//this allows the callback to be called later
|
||||
return true;
|
||||
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
|
||||
return true;
|
||||
case "alertPrevious":
|
||||
chrome.notifications.create("stillThere" + Math.random(), {
|
||||
type: "basic",
|
||||
title: chrome.i18n.getMessage("wantToSubmit") + " " + request.previousVideoID + "?",
|
||||
message: chrome.i18n.getMessage("leftTimes"),
|
||||
iconUrl: "./icons/LogoSponsorBlocker256px.png"
|
||||
});
|
||||
if (Config.config.unsubmittedWarning) {
|
||||
chrome.notifications.create("stillThere" + Math.random(), {
|
||||
type: "basic",
|
||||
title: chrome.i18n.getMessage("wantToSubmit") + " " + request.previousVideoID + "?",
|
||||
message: chrome.i18n.getMessage("leftTimes"),
|
||||
iconUrl: "./icons/LogoSponsorBlocker256px.png"
|
||||
});
|
||||
}
|
||||
case "registerContentScript":
|
||||
registerFirefoxContentScript(request);
|
||||
return false;
|
||||
@@ -147,7 +159,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;
|
||||
|
||||
if (userID == undefined || userID === "undefined") {
|
||||
@@ -159,24 +171,60 @@ function submitVote(type, UUID, category, callback) {
|
||||
let typeSection = (type !== undefined) ? "&type=" + type : "&category=" + category;
|
||||
|
||||
//publish this vote
|
||||
utils.sendRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + typeSection, function(xmlhttp, error) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
callback({
|
||||
successType: 1
|
||||
});
|
||||
} else if (xmlhttp.readyState == 4 && xmlhttp.status == 405) {
|
||||
//duplicate vote
|
||||
callback({
|
||||
successType: 0,
|
||||
statusCode: xmlhttp.status
|
||||
});
|
||||
} else if (error) {
|
||||
//error while connect
|
||||
callback({
|
||||
successType: -1,
|
||||
statusCode: xmlhttp.status
|
||||
});
|
||||
let response = await asyncRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&userID=" + userID + typeSection);
|
||||
|
||||
if (response.ok) {
|
||||
return {
|
||||
successType: 1
|
||||
};
|
||||
} else if (response.status == 405) {
|
||||
//duplicate vote
|
||||
return {
|
||||
successType: 0,
|
||||
statusCode: response.status
|
||||
};
|
||||
} else {
|
||||
//error while connect
|
||||
return {
|
||||
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;
|
||||
}
|
||||
@@ -28,6 +28,26 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
|
||||
<table id="categoryChooserTable"
|
||||
className="categoryChooserTable">
|
||||
<tbody>
|
||||
{/* Headers */}
|
||||
<tr id={"CategoryOptionsRow"}
|
||||
className="categoryTableElement categoryTableHeader">
|
||||
<td id={"CategoryOptionName"}>
|
||||
{chrome.i18n.getMessage("category")}
|
||||
</td>
|
||||
|
||||
<td id={"CategorySkipOption"}>
|
||||
{chrome.i18n.getMessage("skipOption")}
|
||||
</td>
|
||||
|
||||
<td id={"CategoryColorOption"}>
|
||||
{chrome.i18n.getMessage("seekBarColor")}
|
||||
</td>
|
||||
|
||||
<td id={"CategoryPreviewColorOption"}>
|
||||
{chrome.i18n.getMessage("previewColor")}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{this.getCategorySkipOptions()}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -40,7 +60,6 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
|
||||
for (const category of CompileConfig.categoryList) {
|
||||
elements.push(
|
||||
<CategorySkipOptionsComponent category={category}
|
||||
defaultColor={"00d400"}
|
||||
key={category}>
|
||||
</CategorySkipOptionsComponent>
|
||||
);
|
||||
|
||||
@@ -2,14 +2,19 @@ import * as React from "react";
|
||||
|
||||
import Config from "../config"
|
||||
import { CategorySkipOption } from "../types";
|
||||
import Utils from "../utils";
|
||||
|
||||
const utils = new Utils();
|
||||
|
||||
export interface CategorySkipOptionsProps {
|
||||
category: string;
|
||||
defaultColor: string;
|
||||
defaultColor?: string;
|
||||
defaultPreviewColor?: string;
|
||||
}
|
||||
|
||||
export interface CategorySkipOptionsState {
|
||||
color: string;
|
||||
previewColor: string;
|
||||
}
|
||||
|
||||
class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsProps, CategorySkipOptionsState> {
|
||||
@@ -19,7 +24,8 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
|
||||
// Setup state
|
||||
this.state = {
|
||||
color: props.defaultColor
|
||||
color: props.defaultColor || Config.config.barTypes[this.props.category].color,
|
||||
previewColor: props.defaultPreviewColor || Config.config.barTypes["preview-" + this.props.category].color,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,28 +45,65 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
defaultOption = "autoSkip";
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (
|
||||
<tr id={this.props.category + "OptionsRow"}
|
||||
className="categoryTableElement">
|
||||
<td id={this.props.category + "OptionName"}
|
||||
className="categoryTableLabel">
|
||||
{chrome.i18n.getMessage("category_" + this.props.category)}
|
||||
</td>
|
||||
<>
|
||||
<tr id={this.props.category + "OptionsRow"}
|
||||
className="categoryTableElement">
|
||||
<td id={this.props.category + "OptionName"}
|
||||
className="categoryTableLabel">
|
||||
{chrome.i18n.getMessage("category_" + this.props.category)}
|
||||
</td>
|
||||
|
||||
<td id={this.props.category + "SkipOption"}>
|
||||
<select
|
||||
className="categoryOptionsSelector"
|
||||
defaultValue={defaultOption}
|
||||
onChange={this.skipOptionSelected.bind(this)}>
|
||||
{this.getCategorySkipOptions()}
|
||||
</select>
|
||||
</td>
|
||||
<td id={this.props.category + "SkipOption"}>
|
||||
<select
|
||||
className="categoryOptionsSelector"
|
||||
defaultValue={defaultOption}
|
||||
onChange={this.skipOptionSelected.bind(this)}>
|
||||
{this.getCategorySkipOptions()}
|
||||
</select>
|
||||
</td>
|
||||
|
||||
<td id={this.props.category + "ColorOption"}>
|
||||
<input
|
||||
className="categoryColorTextBox option-text-box"
|
||||
type="text"
|
||||
onChange={(event) => this.setColorState(event, false)}
|
||||
value={this.state.color} />
|
||||
</td>
|
||||
|
||||
{/* TODO: Add colour chooser */}
|
||||
</tr>
|
||||
<td id={this.props.category + "PreviewColorOption"}>
|
||||
<input
|
||||
className="categoryColorTextBox option-text-box"
|
||||
type="text"
|
||||
onChange={(event) => this.setColorState(event, true)}
|
||||
value={this.state.previewColor} />
|
||||
</td>
|
||||
|
||||
<td id={this.props.category + "SaveButton"}>
|
||||
<div
|
||||
className="option-button trigger-button"
|
||||
onClick={() => this.save()}>
|
||||
{chrome.i18n.getMessage("save")}
|
||||
</div>
|
||||
</td>
|
||||
|
||||
|
||||
</tr>
|
||||
|
||||
<tr id={this.props.category + "DescriptionRow"}
|
||||
className="small-description">
|
||||
<td
|
||||
colSpan={2}>
|
||||
{chrome.i18n.getMessage("category_" + this.props.category + "_description")}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -112,7 +155,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
|
||||
getCategorySkipOptions(): JSX.Element[] {
|
||||
let elements: JSX.Element[] = [];
|
||||
""
|
||||
|
||||
let optionNames = ["disable", "showOverlay", "manualSkip", "autoSkip"];
|
||||
|
||||
for (const optionName of optionNames) {
|
||||
@@ -125,6 +168,36 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
setColorState(event: React.ChangeEvent<HTMLInputElement>, preview: boolean) {
|
||||
if (preview) {
|
||||
this.setState({
|
||||
previewColor: event.target.value
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
color: event.target.value
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Save text box data
|
||||
save() {
|
||||
// Validate colors
|
||||
let checkVar = [this.state.color, this.state.previewColor]
|
||||
for (const color of checkVar) {
|
||||
if (color[0] !== "#" || (color.length !== 7 && color.length !== 4) || !utils.isHex(color.slice(1))) {
|
||||
alert(chrome.i18n.getMessage("colorFormatIncorrect") + " " + color.slice(1) + " " + utils.isHex(color.slice(1)) + " " + utils.isHex("abcd123"));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Save colors
|
||||
Config.config.barTypes[this.props.category].color = this.state.color;
|
||||
Config.config.barTypes["preview-" + this.props.category].color = this.state.previewColor;
|
||||
// Make listener get called
|
||||
Config.config.barTypes = Config.config.barTypes;
|
||||
}
|
||||
}
|
||||
|
||||
export default CategorySkipOptionsComponent;
|
||||
@@ -23,6 +23,7 @@ export interface NoticeState {
|
||||
|
||||
countdownTime: number,
|
||||
countdownText: string,
|
||||
countdownManuallyPaused: boolean,
|
||||
}
|
||||
|
||||
class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
@@ -55,6 +56,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
//the countdown until this notice closes
|
||||
countdownTime: maxCountdownTime(),
|
||||
countdownText: null,
|
||||
countdownManuallyPaused: false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,8 +73,8 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
<table id={"sponsorSkipNotice" + this.idSuffix}
|
||||
className={"sponsorSkipObject sponsorSkipNotice" + (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")}
|
||||
style={noticeStyle}
|
||||
onMouseEnter={this.pauseCountdown.bind(this)}
|
||||
onMouseLeave={this.startCountdown.bind(this)}>
|
||||
onMouseEnter={() => this.timerMouseEnter()}
|
||||
onMouseLeave={() => this.timerMouseLeave()}>
|
||||
<tbody>
|
||||
|
||||
{/* First row */}
|
||||
@@ -99,6 +101,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
{/* Time left */}
|
||||
{this.props.timed ? (
|
||||
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
|
||||
onClick={() => this.toggleManualPause()}
|
||||
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
|
||||
|
||||
{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
|
||||
countdown() {
|
||||
if (!this.props.timed) return;
|
||||
@@ -159,7 +186,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
//reset countdown and inform the user
|
||||
this.setState({
|
||||
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
|
||||
|
||||
@@ -2,7 +2,8 @@ import * as React from "react";
|
||||
|
||||
export interface NoticeTextSelectionProps {
|
||||
text: string,
|
||||
idSuffix: string
|
||||
idSuffix: string,
|
||||
onClick?: (event: React.MouseEvent) => any
|
||||
}
|
||||
|
||||
export interface NoticeTextSelectionState {
|
||||
@@ -16,8 +17,16 @@ class NoticeTextSelectionComponent extends React.Component<NoticeTextSelectionPr
|
||||
}
|
||||
|
||||
render() {
|
||||
let style: React.CSSProperties = {};
|
||||
if (this.props.onClick) {
|
||||
style.cursor = "pointer";
|
||||
style.textDecoration = "underline"
|
||||
}
|
||||
|
||||
return (
|
||||
<p id={"sponsorTimesInfoMessage" + this.props.idSuffix}
|
||||
onClick={this.props.onClick}
|
||||
style={style}
|
||||
className="sponsorTimesInfoMessage">
|
||||
{this.props.text}
|
||||
</p>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config"
|
||||
import { ContentContainer, SponsorHideType } from "../types";
|
||||
import { ContentContainer, SponsorHideType, SponsorTime } from "../types";
|
||||
|
||||
import Utils from "../utils";
|
||||
var utils = new Utils();
|
||||
@@ -9,9 +9,17 @@ var utils = new Utils();
|
||||
import NoticeComponent from "./NoticeComponent";
|
||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||
|
||||
enum SkipNoticeAction {
|
||||
None,
|
||||
Upvote,
|
||||
Downvote,
|
||||
CategoryVote,
|
||||
Unskip
|
||||
}
|
||||
|
||||
export interface SkipNoticeProps {
|
||||
segments: SponsorTime[];
|
||||
|
||||
export interface SkipNoticeProps {
|
||||
UUID: string;
|
||||
autoSkip: boolean;
|
||||
// Contains functions and variables from the content script needed by the skip notice
|
||||
contentContainer: ContentContainer;
|
||||
@@ -23,20 +31,24 @@ export interface SkipNoticeState {
|
||||
noticeTitle: string;
|
||||
|
||||
messages: string[];
|
||||
messageOnClick: (event: React.MouseEvent) => any;
|
||||
|
||||
countdownTime: number;
|
||||
maxCountdownTime: () => number;
|
||||
countdownText: string;
|
||||
|
||||
unskipText: string;
|
||||
unskipCallback: () => void;
|
||||
unskipCallback: (index: number) => void;
|
||||
|
||||
downvoting: boolean;
|
||||
choosingCategory: boolean;
|
||||
thanksForVotingText: boolean; //null until the voting buttons should be hidden
|
||||
|
||||
actionState: SkipNoticeAction;
|
||||
}
|
||||
|
||||
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
||||
UUID: string;
|
||||
segments: SponsorTime[];
|
||||
autoSkip: boolean;
|
||||
// Contains functions and variables from the content script needed by the skip notice
|
||||
contentContainer: ContentContainer;
|
||||
@@ -57,22 +69,31 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.noticeRef = React.createRef();
|
||||
this.categoryOptionRef = React.createRef();
|
||||
|
||||
this.UUID = props.UUID;
|
||||
this.segments = props.segments;
|
||||
this.autoSkip = props.autoSkip;
|
||||
this.contentContainer = props.contentContainer;
|
||||
this.audio = null;
|
||||
|
||||
let noticeTitle = chrome.i18n.getMessage("noticeTitle");
|
||||
|
||||
|
||||
let categoryName = chrome.i18n.getMessage(this.segments.length > 1 ? "multipleSegments"
|
||||
: "category_" + this.segments[0].category + "_short") || chrome.i18n.getMessage("category_" + this.segments[0].category);
|
||||
let noticeTitle = categoryName + " " + chrome.i18n.getMessage("skipped");
|
||||
if (!this.autoSkip) {
|
||||
noticeTitle = chrome.i18n.getMessage("noticeTitleNotSkipped");
|
||||
noticeTitle = chrome.i18n.getMessage("skip") + " " + categoryName + "?";
|
||||
}
|
||||
|
||||
//add notice
|
||||
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.idSuffix = this.UUID + this.amountOfPreviousNotices;
|
||||
for (const segment of this.segments) {
|
||||
this.idSuffix += segment.UUID;
|
||||
}
|
||||
this.idSuffix += this.amountOfPreviousNotices;
|
||||
|
||||
if (this.amountOfPreviousNotices > 0) {
|
||||
//another notice exists
|
||||
@@ -85,6 +106,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.state = {
|
||||
noticeTitle,
|
||||
messages: [],
|
||||
messageOnClick: null,
|
||||
|
||||
//the countdown until this notice closes
|
||||
maxCountdownTime: () => 4,
|
||||
@@ -92,14 +114,18 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
countdownText: null,
|
||||
|
||||
unskipText: chrome.i18n.getMessage("unskip"),
|
||||
unskipCallback: this.unskip.bind(this),
|
||||
unskipCallback: (index) => this.unskip(index),
|
||||
|
||||
downvoting: false,
|
||||
choosingCategory: false
|
||||
choosingCategory: false,
|
||||
thanksForVotingText: null,
|
||||
|
||||
actionState: SkipNoticeAction.None
|
||||
}
|
||||
|
||||
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")));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,6 +134,13 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.audio.volume = this.contentContainer().v.volume * 0.1;
|
||||
this.audio.play();
|
||||
}
|
||||
|
||||
if (Config.config.categoryUpdateShowCount < 3 && Config.config.categorySelections.length <= 1) {
|
||||
this.setNoticeInfoMessageWithOnClick(() => chrome.runtime.sendMessage({"message": "openConfig"})
|
||||
, chrome.i18n.getMessage("categoryUpdate1"), chrome.i18n.getMessage("categoryUpdate2"));
|
||||
|
||||
Config.config.categoryUpdateShowCount = Config.config.categoryUpdateShowCount + 1
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
@@ -140,35 +173,46 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
|
||||
|
||||
{/* Vote Button Container */}
|
||||
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorTimesVoteButtonsContainer">
|
||||
{!this.state.thanksForVotingText ?
|
||||
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorTimesVoteButtonsContainer">
|
||||
|
||||
{/* Report Text */}
|
||||
<span id={"sponsorTimesReportText" + this.idSuffix}
|
||||
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
|
||||
title={chrome.i18n.getMessage("reportButtonInfo")}
|
||||
style={{marginRight: "5px"}}>
|
||||
{/* Upvote Button */}
|
||||
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorSkipObject voteButton"
|
||||
style={{marginRight: "10px"}}
|
||||
src={chrome.extension.getURL("icons/thumbs_up.svg")}
|
||||
title={chrome.i18n.getMessage("upvoteButtonInfo")}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
|
||||
|
||||
</img>
|
||||
|
||||
{chrome.i18n.getMessage("reportButtonTitle")}
|
||||
</span>
|
||||
{/* Report Button */}
|
||||
<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 */}
|
||||
<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>
|
||||
:
|
||||
|
||||
<td id={"sponsorTimesVoteButtonInfoMessage" + this.idSuffix}
|
||||
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
|
||||
style={{marginRight: "10px"}}>
|
||||
{this.state.thanksForVotingText}
|
||||
</td>
|
||||
}
|
||||
|
||||
{/* Unskip Button */}
|
||||
<td className="sponsorSkipNoticeUnskipSection">
|
||||
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={{marginLeft: "4px"}}
|
||||
onClick={this.state.unskipCallback}>
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||
|
||||
{this.state.unskipText}
|
||||
</button>
|
||||
@@ -193,18 +237,16 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
{/* Normal downvote */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.contentContainer().vote(0, this.UUID, undefined, this)}>
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
|
||||
{chrome.i18n.getMessage("downvoteDescription")}
|
||||
</button>
|
||||
|
||||
{/* Category vote */}
|
||||
{Config.config.testingServer &&
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.openCategoryChooser()}>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.openCategoryChooser()}>
|
||||
|
||||
{chrome.i18n.getMessage("incorrectCategory")}
|
||||
</button>
|
||||
}
|
||||
{chrome.i18n.getMessage("incorrectCategory")}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
@@ -217,7 +259,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
{/* Category Selector */}
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
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}
|
||||
onChange={this.categorySelectionChange.bind(this)}>
|
||||
|
||||
@@ -225,11 +267,23 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
</select>
|
||||
|
||||
{/* Submit Button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.contentContainer().vote(undefined, this.UUID, this.categoryOptionRef.current.value, this)}>
|
||||
{this.segments.length === 1 &&
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.prepAction(SkipNoticeAction.CategoryVote)}>
|
||||
|
||||
{chrome.i18n.getMessage("submit")}
|
||||
</button>
|
||||
{chrome.i18n.getMessage("submit")}
|
||||
</button>
|
||||
}
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
|
||||
{/* Segment Chooser Row */}
|
||||
{this.state.actionState !== SkipNoticeAction.None &&
|
||||
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}>
|
||||
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
|
||||
{this.getSubmissionChooser()}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
@@ -238,6 +292,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 {
|
||||
if (this.state.messages.length === 0) {
|
||||
// Add a spacer if there is no text
|
||||
@@ -254,6 +334,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
elements.push(
|
||||
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
|
||||
text={this.state.messages[i]}
|
||||
onClick={this.state.messageOnClick}
|
||||
key={i}>
|
||||
</NoticeTextSelectionComponent>
|
||||
)
|
||||
@@ -262,6 +343,34 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
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) {
|
||||
if (!value) this.clearConfigListener();
|
||||
|
||||
@@ -286,6 +395,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.setState({
|
||||
choosingCategory: true,
|
||||
downvoting: false
|
||||
}, () => {
|
||||
if (this.segments.length > 1) {
|
||||
// Use the action selectors as a submit button
|
||||
this.prepAction(SkipNoticeAction.CategoryVote);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -321,37 +435,38 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
chrome.runtime.sendMessage({"message": "openConfig"});
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
|
||||
unskip() {
|
||||
this.contentContainer().unskipSponsorTime(this.UUID);
|
||||
unskip(index: number) {
|
||||
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 */
|
||||
unskippedMode(buttonText: string) {
|
||||
unskippedMode(index: number, buttonText: string) {
|
||||
//setup new callback and reset countdown
|
||||
this.setState(this.getUnskippedModeInfo(buttonText), () => {
|
||||
this.setState(this.getUnskippedModeInfo(index, buttonText), () => {
|
||||
this.noticeRef.current.resetCountdown();
|
||||
});
|
||||
}
|
||||
|
||||
getUnskippedModeInfo(buttonText: string) {
|
||||
getUnskippedModeInfo(index: number, buttonText: string) {
|
||||
let self = this;
|
||||
let maxCountdownTime = function() {
|
||||
let sponsorTime = utils.getSponsorTimeFromUUID(this.contentContainer().sponsorTimes, this.UUID);
|
||||
let duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
|
||||
let sponsorTime = self.segments[index];
|
||||
let duration = Math.round((sponsorTime.segment[1] - self.contentContainer().v.currentTime) * (1 / self.contentContainer().v.playbackRate));
|
||||
|
||||
return Math.max(duration, 4);
|
||||
}.bind(this);
|
||||
};
|
||||
|
||||
return {
|
||||
unskipText: buttonText,
|
||||
|
||||
unskipCallback: this.reskip.bind(this),
|
||||
unskipCallback: (index) => this.reskip(index),
|
||||
|
||||
//change max duration to however much of the sponsor is left
|
||||
maxCountdownTime: maxCountdownTime,
|
||||
@@ -360,8 +475,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
reskip() {
|
||||
this.contentContainer().reskipSponsorTime(this.UUID);
|
||||
reskip(index: number) {
|
||||
this.contentContainer().reskipSponsorTime(this.segments[index]);
|
||||
|
||||
//reset countdown
|
||||
this.setState({
|
||||
@@ -377,68 +492,52 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.setState({
|
||||
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.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
||||
|
||||
this.adjustDownvotingState(false);
|
||||
if (type === 0) {
|
||||
this.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
||||
this.adjustDownvotingState(false);
|
||||
}
|
||||
|
||||
// Change the sponsor locally
|
||||
let sponsorTime = utils.getSponsorTimeFromUUID(this.contentContainer().sponsorTimes, this.UUID);
|
||||
if (sponsorTime) {
|
||||
if (segment) {
|
||||
if (type === 0) {
|
||||
sponsorTime.hidden = SponsorHideType.Downvoted;
|
||||
segment.hidden = SponsorHideType.Downvoted;
|
||||
} else if (category) {
|
||||
sponsorTime.category = category;
|
||||
segment.category = category;
|
||||
}
|
||||
|
||||
this.contentContainer().updatePreviewBar();
|
||||
}
|
||||
}
|
||||
|
||||
setNoticeInfoMessageWithOnClick(onClick: (event: React.MouseEvent) => any, ...messages: string[]) {
|
||||
this.setState({
|
||||
messages,
|
||||
messageOnClick: (event) => onClick(event)
|
||||
});
|
||||
}
|
||||
|
||||
setNoticeInfoMessage(...messages: string[]) {
|
||||
this.setState({
|
||||
messages
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
addVoteButtonInfo(message) {
|
||||
this.resetVoteButtonInfo();
|
||||
|
||||
//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);
|
||||
this.setState({
|
||||
thanksForVotingText: message
|
||||
});
|
||||
}
|
||||
|
||||
resetVoteButtonInfo() {
|
||||
let previousInfoMessage = document.getElementById("sponsorTimesVoteButtonInfoMessage" + this.idSuffix);
|
||||
if (previousInfoMessage != null) {
|
||||
//remove it
|
||||
document.getElementById("sponsorSkipNoticeSecondRow" + this.idSuffix).removeChild(previousInfoMessage);
|
||||
}
|
||||
|
||||
//show button again
|
||||
document.getElementById("sponsorTimesDownvoteButtonsContainer" + this.idSuffix).style.removeProperty("display");
|
||||
this.setState({
|
||||
thanksForVotingText: null
|
||||
});
|
||||
}
|
||||
|
||||
closeListener() {
|
||||
|
||||
@@ -182,14 +182,23 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
{timeDisplay}
|
||||
|
||||
{/* Category */}
|
||||
<div style={{position: "relative"}}>
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
className="sponsorTimeCategories"
|
||||
defaultValue={sponsorTime.category}
|
||||
ref={this.categoryOptionRef}
|
||||
onChange={this.categorySelectionChange.bind(this)}>
|
||||
{this.getCategoryOptions()}
|
||||
</select>
|
||||
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
className="sponsorTimeCategories"
|
||||
defaultValue={sponsorTime.category}
|
||||
ref={this.categoryOptionRef}
|
||||
onChange={this.categorySelectionChange.bind(this)}>
|
||||
{this.getCategoryOptions()}
|
||||
</select>
|
||||
<img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
|
||||
className="helpButton"
|
||||
src={chrome.extension.getURL("icons/help.svg")}
|
||||
title={chrome.i18n.getMessage("categoryGuidelines")}
|
||||
onClick={() => chrome.runtime.sendMessage({"message": "openConfig"})}>
|
||||
|
||||
</img>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
|
||||
@@ -260,7 +269,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
|
||||
setTimeToNow(index: number) {
|
||||
this.setTimeTo(index, this.props.contentContainer().getRoughCurrentTime());
|
||||
this.setTimeTo(index, this.props.contentContainer().getRealCurrentTime());
|
||||
}
|
||||
|
||||
setTimeToEnd() {
|
||||
|
||||
@@ -86,13 +86,20 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
{this.getSponsorTimeMessages()}
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
{/* Last Row */}
|
||||
<tr id={"sponsorSkipNoticeSecondRow" + this.state.idSuffix}>
|
||||
|
||||
<td className="sponsorSkipNoticeRightSection"
|
||||
style={{position: "relative"}}>
|
||||
|
||||
{/* Guidelines button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={() => window.open("https://github.com/ajayyy/SponsorBlock/wiki/Guidelines")}>
|
||||
|
||||
{chrome.i18n.getMessage(Config.config.submissionCountSinceCategories > 3 ? "guidelines" : "readTheGuidelines")}
|
||||
</button>
|
||||
|
||||
{/* Submit Button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={this.submit.bind(this)}>
|
||||
@@ -161,7 +168,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
}
|
||||
|
||||
// Check if any non music categories are being used on a music video
|
||||
if (this.contentContainer().videoInfo.microformat.playerMicroformatRenderer.category === "Music") {
|
||||
if (this.contentContainer().videoInfo?.microformat?.playerMicroformatRenderer?.category === "Music") {
|
||||
let sponsorTimesSubmitting = this.props.contentContainer().sponsorTimesSubmitting;
|
||||
for (const sponsorTime of sponsorTimesSubmitting) {
|
||||
if (!sponsorTime.category.startsWith("music_")) {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as CompileConfig from "../config.json";
|
||||
import { CategorySelection, CategorySkipOption } from "./types";
|
||||
import { CategorySelection, CategorySkipOption, PreviewBarOption } from "./types";
|
||||
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
@@ -14,6 +14,8 @@ interface SBConfig {
|
||||
minutesSaved: number,
|
||||
skipCount: number,
|
||||
sponsorTimesContributed: number,
|
||||
submissionCountSinceCategories: number, // New count used to show the "Read The Guidelines!!" message
|
||||
unsubmittedWarning: boolean,
|
||||
disableSkipping: boolean,
|
||||
trackViewCount: boolean,
|
||||
dontShowNotice: boolean,
|
||||
@@ -24,17 +26,33 @@ interface SBConfig {
|
||||
hideDiscordLaunches: number,
|
||||
hideDiscordLink: boolean,
|
||||
invidiousInstances: string[],
|
||||
autoUpvote: boolean,
|
||||
supportInvidious: boolean,
|
||||
serverAddress: string,
|
||||
minDuration: number,
|
||||
audioNotificationOnSkip,
|
||||
checkForUnlistedVideos: boolean,
|
||||
mobileUpdateShowCount: number,
|
||||
testingServer: boolean,
|
||||
|
||||
categoryUpdateShowCount: number,
|
||||
|
||||
// What categories should be skipped
|
||||
categorySelections: CategorySelection[]
|
||||
categorySelections: CategorySelection[],
|
||||
|
||||
// Preview bar
|
||||
barTypes: {
|
||||
"sponsor": PreviewBarOption,
|
||||
"preview-sponsor": PreviewBarOption,
|
||||
"intro": PreviewBarOption,
|
||||
"preview-intro": PreviewBarOption,
|
||||
"outro": PreviewBarOption,
|
||||
"preview-outro": PreviewBarOption,
|
||||
"interaction": PreviewBarOption,
|
||||
"preview-interaction": PreviewBarOption,
|
||||
"selfpromo": PreviewBarOption,
|
||||
"preview-selfpromo": PreviewBarOption,
|
||||
"music_offtopic": PreviewBarOption,
|
||||
"preview-music_offtopic": PreviewBarOption
|
||||
}
|
||||
}
|
||||
|
||||
interface SBObject {
|
||||
@@ -114,6 +132,8 @@ var Config: SBObject = {
|
||||
minutesSaved: 0,
|
||||
skipCount: 0,
|
||||
sponsorTimesContributed: 0,
|
||||
submissionCountSinceCategories: 0,
|
||||
unsubmittedWarning: true,
|
||||
disableSkipping: false,
|
||||
trackViewCount: true,
|
||||
dontShowNotice: false,
|
||||
@@ -124,19 +144,71 @@ var Config: SBObject = {
|
||||
hideDiscordLaunches: 0,
|
||||
hideDiscordLink: false,
|
||||
invidiousInstances: ["invidio.us", "invidious.snopyta.org"],
|
||||
autoUpvote: true,
|
||||
supportInvidious: false,
|
||||
serverAddress: CompileConfig.serverAddress,
|
||||
minDuration: 0,
|
||||
audioNotificationOnSkip: false,
|
||||
checkForUnlistedVideos: false,
|
||||
mobileUpdateShowCount: 0,
|
||||
testingServer: false,
|
||||
|
||||
categoryUpdateShowCount: 0,
|
||||
|
||||
categorySelections: [{
|
||||
name: "sponsor",
|
||||
option: CategorySkipOption.AutoSkip
|
||||
}]
|
||||
}],
|
||||
|
||||
// Preview bar
|
||||
barTypes: {
|
||||
"sponsor": {
|
||||
color: "#00d400",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-sponsor": {
|
||||
color: "#007800",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"intro": {
|
||||
color: "#00ffff",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-intro": {
|
||||
color: "#008080",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"outro": {
|
||||
color: "#0202ed",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-outro": {
|
||||
color: "#000070",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"interaction": {
|
||||
color: "#cc00ff",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-interaction": {
|
||||
color: "#6c0087",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"selfpromo": {
|
||||
color: "#ffff00",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-selfpromo": {
|
||||
color: "#bfbf35",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"music_offtopic": {
|
||||
color: "#ff9900",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-music_offtopic": {
|
||||
color: "#a6634a",
|
||||
opacity: "0.7"
|
||||
}
|
||||
}
|
||||
},
|
||||
localConfig: null,
|
||||
config: null,
|
||||
@@ -252,6 +324,16 @@ async function migrateOldFormats() {
|
||||
}
|
||||
}
|
||||
|
||||
// Auto vote removal
|
||||
if (Config.config["autoUpvote"]) {
|
||||
chrome.storage.sync.remove("autoUpvote");
|
||||
}
|
||||
|
||||
// mobileUpdateShowCount removal
|
||||
if (Config.config["mobileUpdateShowCount"] !== undefined) {
|
||||
chrome.storage.sync.remove("mobileUpdateShowCount");
|
||||
}
|
||||
|
||||
// Channel URLS
|
||||
if (Config.config.whitelistedChannels.length > 0 &&
|
||||
(Config.config.whitelistedChannels[0] == null || Config.config.whitelistedChannels[0].includes("/"))) {
|
||||
@@ -265,7 +347,7 @@ async function migrateOldFormats() {
|
||||
let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
|
||||
|
||||
if (response.ok) {
|
||||
newChannelList.push((await response.json()).authorId);
|
||||
newChannelList.push((JSON.parse(response.responseText)).authorId);
|
||||
} else {
|
||||
// Add it at the beginning so it gets converted later
|
||||
newChannelList.unshift(item);
|
||||
|
||||
222
src/content.ts
222
src/content.ts
@@ -1,6 +1,6 @@
|
||||
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 Utils from "./utils";
|
||||
@@ -41,9 +41,6 @@ var sponsorSkipped: boolean[] = [];
|
||||
//the video
|
||||
var video: HTMLVideoElement;
|
||||
|
||||
/** The last time this video was seeking to */
|
||||
var lastVideoTime: number = null;
|
||||
|
||||
var onInvidious;
|
||||
var onMobileYouTube;
|
||||
|
||||
@@ -67,10 +64,6 @@ var channelWhitelisted = false;
|
||||
// create preview bar
|
||||
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
|
||||
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
|
||||
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
|
||||
var showingStartSponsor = true;
|
||||
|
||||
@@ -99,6 +86,9 @@ var popupInitialised = false;
|
||||
|
||||
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
|
||||
var skipNoticeContentContainer: ContentContainer = () => ({
|
||||
vote,
|
||||
@@ -116,7 +106,7 @@ var skipNoticeContentContainer: ContentContainer = () => ({
|
||||
changeStartSponsorButton,
|
||||
previewTime,
|
||||
videoInfo,
|
||||
getRoughCurrentTime
|
||||
getRealCurrentTime: getRealCurrentTime
|
||||
});
|
||||
|
||||
//get messages from the background script and the popup
|
||||
@@ -170,17 +160,10 @@ function messageListener(request: any, sender: any, sendResponse: (response: any
|
||||
video.play();
|
||||
}
|
||||
|
||||
// Start preview resetter
|
||||
if (previewResetter !== null){
|
||||
clearTimeout(previewResetter);
|
||||
}
|
||||
|
||||
previewResetter = setTimeout(() => previewResetter = null, 4000);
|
||||
|
||||
return
|
||||
return;
|
||||
case "getCurrentTime":
|
||||
sendResponse({
|
||||
currentTime: getRoughCurrentTime()
|
||||
currentTime: getRealCurrentTime()
|
||||
});
|
||||
|
||||
break;
|
||||
@@ -281,6 +264,9 @@ function resetValues() {
|
||||
} else {
|
||||
switchingVideos = true;
|
||||
}
|
||||
|
||||
// Reset advert playing flag
|
||||
isAdPlaying = false;
|
||||
}
|
||||
|
||||
async function videoIDChange(id) {
|
||||
@@ -446,6 +432,7 @@ function createPreviewBar(): void {
|
||||
* This happens when the resolution changes or at random time to clear memory.
|
||||
*/
|
||||
function durationChangeListener() {
|
||||
updateAdFlag();
|
||||
updatePreviewBar();
|
||||
}
|
||||
|
||||
@@ -464,13 +451,22 @@ function cancelSponsorSchedule(): void {
|
||||
function startSponsorSchedule(includeIntersectingSegments: boolean = false, currentTime?: number): void {
|
||||
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 (Config.config.disableSkipping || channelWhitelisted || (channelID === null && Config.config.forceChannelCheck)){
|
||||
return;
|
||||
}
|
||||
|
||||
if (incorrectVideoIDCheck()) return;
|
||||
if (incorrectVideoCheck()) return;
|
||||
|
||||
if (currentTime === undefined || currentTime === null) currentTime = video.currentTime;
|
||||
|
||||
@@ -483,6 +479,19 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
||||
let timeUntilSponsor = skipTime[0] - currentTime;
|
||||
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
|
||||
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ShowOverlay) return;
|
||||
|
||||
@@ -490,10 +499,10 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
|
||||
let forcedSkipTime: number = null;
|
||||
let forcedIncludeIntersectingSegments = false;
|
||||
|
||||
if (incorrectVideoIDCheck(videoID)) return;
|
||||
if (incorrectVideoCheck(videoID, currentSkip)) return;
|
||||
|
||||
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
|
||||
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
|
||||
*
|
||||
* TODO: Remove this bug catching if statement when the bug is found
|
||||
* This makes sure the videoID is still correct and if the sponsorTime is included
|
||||
*/
|
||||
function incorrectVideoIDCheck(videoID?: string): boolean {
|
||||
function incorrectVideoCheck(videoID?: string, sponsorTime?: SponsorTime): boolean {
|
||||
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
|
||||
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);
|
||||
@@ -556,6 +563,9 @@ function sponsorsLookup(id: string) {
|
||||
video.addEventListener('play', () => {
|
||||
switchingVideos = false;
|
||||
|
||||
// Check if an ad is playing
|
||||
updateAdFlag();
|
||||
|
||||
// Make sure it doesn't get double called with the playing event
|
||||
if (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000) {
|
||||
lastCheckTime = Date.now();
|
||||
@@ -563,6 +573,7 @@ function sponsorsLookup(id: string) {
|
||||
|
||||
startSponsorSchedule();
|
||||
}
|
||||
|
||||
});
|
||||
video.addEventListener('playing', () => {
|
||||
// Make sure it doesn't get double called with the play event
|
||||
@@ -578,8 +589,6 @@ function sponsorsLookup(id: string) {
|
||||
lastCheckVideoTime = -1
|
||||
lastCheckTime = 0;
|
||||
|
||||
lastVideoTime = video.currentTime;
|
||||
|
||||
if (!video.paused){
|
||||
startSponsorSchedule();
|
||||
}
|
||||
@@ -590,8 +599,6 @@ function sponsorsLookup(id: string) {
|
||||
lastCheckVideoTime = -1;
|
||||
lastCheckTime = 0;
|
||||
|
||||
lastVideoTime = video.currentTime;
|
||||
|
||||
cancelSponsorSchedule();
|
||||
});
|
||||
|
||||
@@ -610,9 +617,9 @@ function sponsorsLookup(id: string) {
|
||||
utils.asyncRequestToServer('GET', "/api/skipSegments", {
|
||||
videoID: id,
|
||||
categories
|
||||
}).then(async (response: Response) => {
|
||||
if (response.status === 200) {
|
||||
let recievedSegments: SponsorTime[] = await response.json();
|
||||
}).then(async (response: FetchResponse) => {
|
||||
if (response.ok) {
|
||||
let recievedSegments: SponsorTime[] = JSON.parse(response.responseText);
|
||||
if (!recievedSegments.length) {
|
||||
console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments));
|
||||
return;
|
||||
@@ -660,7 +667,7 @@ function sponsorsLookup(id: string) {
|
||||
|
||||
//check if this video was uploaded recently
|
||||
utils.wait(() => !!videoInfo).then(() => {
|
||||
let dateUploaded = videoInfo.microformat.playerMicroformatRenderer.uploadDate;
|
||||
let dateUploaded = videoInfo?.microformat?.playerMicroformatRenderer?.uploadDate;
|
||||
|
||||
//if less than 3 days old
|
||||
if (Date.now() - new Date(dateUploaded).getTime() < 259200000) {
|
||||
@@ -783,6 +790,11 @@ function updatePreviewBarPositionMobile(parent: Element) {
|
||||
}
|
||||
|
||||
function updatePreviewBar() {
|
||||
if(isAdPlaying) {
|
||||
previewBar.set([], [], 0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (previewBar === null || video === null) return;
|
||||
|
||||
let localSponsorTimes = sponsorTimes;
|
||||
@@ -812,7 +824,12 @@ function updatePreviewBar() {
|
||||
|
||||
//checks if this channel is whitelisted, should be done only after the channelID has been loaded
|
||||
function whitelistCheck() {
|
||||
channelID = videoInfo.videoDetails.channelId;
|
||||
channelID = videoInfo?.videoDetails?.channelId;
|
||||
if (!channelID) {
|
||||
channelID = null;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//see if this is a whitelisted channel
|
||||
let whitelistedChannels = Config.config.whitelistedChannels;
|
||||
@@ -838,7 +855,7 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
|
||||
let endTimeIndex = getLatestEndTimeIndex(sponsorTimes, minSponsorTimeIndex);
|
||||
|
||||
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 previewEndTimeIndex = getLatestEndTimeIndex(sponsorTimesSubmitting, minPreviewSponsorTimeIndex);
|
||||
@@ -942,68 +959,61 @@ function previewTime(time: number) {
|
||||
if (video.paused){
|
||||
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
|
||||
function skipToTime(v: HTMLVideoElement, index: number, sponsorTimes: SponsorTime[], openNotice: boolean) {
|
||||
let autoSkip: boolean = utils.getCategorySelection(sponsorTimes[index].category).option === CategorySkipOption.AutoSkip;
|
||||
function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) {
|
||||
// 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) {
|
||||
v.currentTime = sponsorTimes[index].segment[1];
|
||||
if (autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) {
|
||||
v.currentTime = skipTime[1];
|
||||
}
|
||||
|
||||
lastSponsorTimeSkipped = sponsorTimes[index].segment[0];
|
||||
|
||||
let currentUUID: string = sponsorTimes[index].UUID;
|
||||
lastSponsorTimeSkippedUUID = currentUUID;
|
||||
|
||||
if (openNotice) {
|
||||
//send out the message saying that a sponsor message was skipped
|
||||
if (!Config.config.dontShowNotice || !autoSkip) {
|
||||
let skipNotice = new SkipNotice(currentUUID, autoSkip, skipNoticeContentContainer);
|
||||
|
||||
//auto-upvote this sponsor
|
||||
if (Config.config.trackViewCount && autoSkip && Config.config.autoUpvote) {
|
||||
vote(1, currentUUID);
|
||||
}
|
||||
new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer);
|
||||
}
|
||||
}
|
||||
|
||||
//send telemetry that a this sponsor was skipped
|
||||
if (Config.config.trackViewCount && !sponsorSkipped[index] && autoSkip) {
|
||||
utils.sendRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + currentUUID);
|
||||
//send telemetry that a this sponsor was skipped
|
||||
if (Config.config.trackViewCount && autoSkip) {
|
||||
let alreadySkipped = false;
|
||||
let isPreviewSegment = false;
|
||||
|
||||
// Count this as a skip
|
||||
Config.config.minutesSaved = Config.config.minutesSaved + (sponsorTimes[index].segment[1] - sponsorTimes[index].segment[0]) / 60;
|
||||
for (const segment of skippingSegments) {
|
||||
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;
|
||||
|
||||
sponsorSkipped[index] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function unskipSponsorTime(UUID) {
|
||||
function unskipSponsorTime(segment: SponsorTime) {
|
||||
if (sponsorTimes != null) {
|
||||
//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();
|
||||
}
|
||||
}
|
||||
|
||||
function reskipSponsorTime(UUID) {
|
||||
if (sponsorTimes != null) {
|
||||
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]);
|
||||
}
|
||||
function reskipSponsorTime(segment: SponsorTime) {
|
||||
video.currentTime = segment.segment[1];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1126,29 +1136,14 @@ async function updateVisibilityOfPlayerControlsButton(): Promise<boolean> {
|
||||
* current time is out of date while scrubbing or at the end of the video. This is not needed
|
||||
* for sponsor skipping as the video is not playing during these times.
|
||||
*/
|
||||
function getRoughCurrentTime(): number {
|
||||
let htmlCurrentTimeString = document.querySelector(".ytp-time-current").textContent;
|
||||
let htmlDurationString = document.querySelector(".ytp-time-duration").textContent;
|
||||
|
||||
if (htmlCurrentTimeString == htmlDurationString) {
|
||||
// At the end of the video
|
||||
return video.duration;
|
||||
}
|
||||
|
||||
function getRealCurrentTime(): number {
|
||||
// Used to check if replay button
|
||||
let playButtonSVGData = document.querySelector("ytp-play-button")?.querySelector("ytp-svg-fill")?.getAttribute("d");
|
||||
let playButtonSVGData = document.querySelector(".ytp-play-button")?.querySelector(".ytp-svg-fill")?.getAttribute("d");
|
||||
let replaceSVGData = "M 18,11 V 7 l -5,5 5,5 v -4 c 3.3,0 6,2.7 6,6 0,3.3 -2.7,6 -6,6 -3.3,0 -6,-2.7 -6,-6 h -2 c 0,4.4 3.6,8 8,8 4.4,0 8,-3.6 8,-8 0,-4.4 -3.6,-8 -8,-8 z";
|
||||
|
||||
if (playButtonSVGData === replaceSVGData) {
|
||||
// At the end of the video
|
||||
return video.duration;
|
||||
}
|
||||
|
||||
let htmlCurrentTimeSections = htmlCurrentTimeString.split(":")[0];
|
||||
let htmlCurrentTime: number = parseInt(htmlCurrentTimeSections[0]) * 60 + parseInt(htmlCurrentTimeSections[1]);
|
||||
|
||||
if (Math.abs(video.currentTime - htmlCurrentTime) > 3) {
|
||||
return htmlCurrentTime;
|
||||
} else {
|
||||
return video.currentTime;
|
||||
}
|
||||
@@ -1163,11 +1158,11 @@ function startSponsorClicked() {
|
||||
//add to sponsorTimes
|
||||
if (sponsorTimesSubmitting.length > 0 && sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment.length < 2) {
|
||||
//it is an end time
|
||||
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment[1] = getRoughCurrentTime();
|
||||
sponsorTimesSubmitting[sponsorTimesSubmitting.length - 1].segment[1] = getRealCurrentTime();
|
||||
} else {
|
||||
//it is a start time
|
||||
sponsorTimesSubmitting.push({
|
||||
segment: [getRoughCurrentTime()],
|
||||
segment: [getRealCurrentTime()],
|
||||
UUID: null,
|
||||
// Default to sponsor
|
||||
category: "sponsor"
|
||||
@@ -1381,13 +1376,7 @@ function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNo
|
||||
if (skipNotice != null) {
|
||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||
//success (treat rate limits as a success)
|
||||
if (type === 0 || 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)();
|
||||
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
|
||||
} else if (response.successType == -1) {
|
||||
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode))
|
||||
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
|
||||
@@ -1505,6 +1494,10 @@ async function sendSubmitMessage(){
|
||||
// Increase contribution count
|
||||
Config.config.sponsorTimesContributed = Config.config.sponsorTimesContributed + sponsorTimesSubmitting.length;
|
||||
|
||||
// New count just used to see if a warning "Read The Guidelines!!" message needs to be shown
|
||||
// One per time submitting
|
||||
Config.config.submissionCountSinceCategories = Config.config.submissionCountSinceCategories + 1;
|
||||
|
||||
// Empty the submitting times
|
||||
sponsorTimesSubmitting = [];
|
||||
|
||||
@@ -1514,7 +1507,7 @@ async function sendSubmitMessage(){
|
||||
document.getElementById("submitButton").style.animation = "unset";
|
||||
(<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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1545,7 +1538,7 @@ function getSegmentsMessage(segments: number[][]): string {
|
||||
* Assumes that the the privacy info is available.
|
||||
*/
|
||||
function isUnlisted(): boolean {
|
||||
return videoInfo.microformat.playerMicroformatRenderer.isUnlisted || videoInfo.videoDetails.isPrivate;
|
||||
return videoInfo?.microformat?.playerMicroformatRenderer?.isUnlisted || videoInfo?.videoDetails?.isPrivate;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1587,3 +1580,16 @@ function sendRequestToCustomServer(type, fullAddress, callback) {
|
||||
//submit this request
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,60 +5,7 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
let barTypes = {
|
||||
"undefined": {
|
||||
color: "#00d400",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"sponsor": {
|
||||
color: "#00d400",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-sponsor": {
|
||||
color: "#007800",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"intro": {
|
||||
color: "#00ffff",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-intro": {
|
||||
color: "#008080",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"outro": {
|
||||
color: "#0202ed",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-outro": {
|
||||
color: "#000070",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"interaction": {
|
||||
color: "#cc00ff",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-interaction": {
|
||||
color: "#6c0087",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"selfpromo": {
|
||||
color: "#ffff00",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-selfpromo": {
|
||||
color: "#bfbf35",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"music_offtopic": {
|
||||
color: "#ff9900",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-music_offtopic": {
|
||||
color: "#a6634a",
|
||||
opacity: "0.7"
|
||||
}
|
||||
};
|
||||
import Config from "../config";
|
||||
|
||||
class PreviewBar {
|
||||
container: HTMLUListElement;
|
||||
@@ -103,9 +50,14 @@ class PreviewBar {
|
||||
categoryTooltip.classList.add("sbHidden");
|
||||
});
|
||||
|
||||
const observer = new MutationObserver(() => {
|
||||
const observer = new MutationObserver((mutations, observer) => {
|
||||
if (!mouseOnSeekBar) return;
|
||||
|
||||
// See if mutation observed is only this ID (if so, ignore)
|
||||
if (mutations.length == 1 && (mutations[0].target as HTMLElement).id === "sponsor-block-category-tooltip") {
|
||||
return;
|
||||
}
|
||||
|
||||
let tooltips = document.querySelectorAll(".ytp-tooltip-text");
|
||||
for (const tooltip of tooltips) {
|
||||
let splitData = tooltip.textContent.split(":");
|
||||
@@ -115,7 +67,7 @@ class PreviewBar {
|
||||
|
||||
// Find category at that location
|
||||
let category = null;
|
||||
for (let i = 0; i < this.timestamps.length; i++) {
|
||||
for (let i = 0; i < this.timestamps?.length; i++) {
|
||||
if (this.timestamps[i][0] < timeInSeconds && this.timestamps[i][1] > timeInSeconds){
|
||||
category = this.types[i];
|
||||
}
|
||||
@@ -203,8 +155,8 @@ class PreviewBar {
|
||||
let bar = this.createBar();
|
||||
bar.setAttribute('data-vs-segment-type', types[i]);
|
||||
|
||||
bar.style.backgroundColor = barTypes[types[i]].color;
|
||||
if (!this.onMobileYouTube) bar.style.opacity = barTypes[types[i]].opacity;
|
||||
bar.style.backgroundColor = Config.config.barTypes[types[i]].color;
|
||||
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[types[i]].opacity;
|
||||
bar.style.width = width + '%';
|
||||
bar.style.left = (timestamps[i][0] / duration * 100) + "%";
|
||||
bar.style.position = "absolute"
|
||||
|
||||
@@ -13,6 +13,13 @@ window.addEventListener('DOMContentLoaded', init);
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
|
||||
// Remove header if needed
|
||||
if (window.location.hash === "#embed") {
|
||||
for (const element of document.getElementsByClassName("titleBar")) {
|
||||
element.classList.add("hidden");
|
||||
}
|
||||
}
|
||||
|
||||
if (!Config.configListeners.includes(optionsConfigUpdateListener)) {
|
||||
Config.configListeners.push(optionsConfigUpdateListener);
|
||||
}
|
||||
|
||||
33
src/popup.ts
33
src/popup.ts
@@ -168,9 +168,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
||||
if (userID != undefined) {
|
||||
//there are probably some views on these submissions then
|
||||
//get the amount of views from the sponsors submitted
|
||||
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
let viewCount = JSON.parse(xmlhttp.responseText).viewCount;
|
||||
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(response) {
|
||||
if (response.status == 200) {
|
||||
let viewCount = JSON.parse(response.responseText).viewCount;
|
||||
if (viewCount != 0) {
|
||||
if (viewCount > 1) {
|
||||
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
|
||||
@@ -185,9 +185,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
||||
});
|
||||
|
||||
//get this time in minutes
|
||||
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(xmlhttp) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
let minutesSaved = JSON.parse(xmlhttp.responseText).timeSaved;
|
||||
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(response) {
|
||||
if (response.status == 200) {
|
||||
let minutesSaved = JSON.parse(response.responseText).timeSaved;
|
||||
if (minutesSaved != 0) {
|
||||
if (minutesSaved != 1) {
|
||||
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
|
||||
@@ -797,9 +797,9 @@ async function runThePopup(messageListener?: MessageListener) {
|
||||
//make the options username setting option visible
|
||||
function setUsernameButton() {
|
||||
//get username from the server
|
||||
utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, function (xmlhttp, error) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
PageElements.usernameInput.value = JSON.parse(xmlhttp.responseText).userName;
|
||||
utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, function (response) {
|
||||
if (response.status == 200) {
|
||||
PageElements.usernameInput.value = JSON.parse(response.responseText).userName;
|
||||
|
||||
PageElements.submitUsername.style.display = "unset";
|
||||
PageElements.usernameInput.style.display = "unset";
|
||||
@@ -808,13 +808,13 @@ async function runThePopup(messageListener?: MessageListener) {
|
||||
PageElements.setUsername.style.display = "unset";
|
||||
PageElements
|
||||
PageElements.setUsernameStatusContainer.style.display = "none";
|
||||
} else if (xmlhttp.readyState == 4) {
|
||||
} else {
|
||||
PageElements.setUsername.style.display = "unset";
|
||||
PageElements.submitUsername.style.display = "none";
|
||||
PageElements.usernameInput.style.display = "none";
|
||||
|
||||
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...";
|
||||
|
||||
//get the userID
|
||||
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (xmlhttp, error) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (response) {
|
||||
if (response.status == 200) {
|
||||
//submitted
|
||||
PageElements.submitUsername.style.display = "none";
|
||||
PageElements.usernameInput.style.display = "none";
|
||||
|
||||
PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("success");
|
||||
} else if (xmlhttp.readyState == 4) {
|
||||
PageElements.setUsernameStatus.innerText = utils.getErrorMessage(xmlhttp.status);
|
||||
} else {
|
||||
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)) {
|
||||
//success (treat rate limits as a success)
|
||||
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) {
|
||||
addVoteMessage(utils.getErrorMessage(response.statusCode), UUID)
|
||||
}
|
||||
|
||||
@@ -2,17 +2,20 @@ import * as React from "react";
|
||||
import * as ReactDOM from "react-dom";
|
||||
|
||||
import SkipNoticeComponent from "../components/SkipNoticeComponent";
|
||||
import { SponsorTime } from "../types";
|
||||
|
||||
class SkipNotice {
|
||||
UUID: string;
|
||||
segments: SponsorTime[];
|
||||
autoSkip: boolean;
|
||||
// Contains functions and variables from the content script needed by the skip notice
|
||||
contentContainer: () => any;
|
||||
|
||||
noticeElement: HTMLDivElement;
|
||||
|
||||
constructor(UUID: string, autoSkip: boolean = false, contentContainer) {
|
||||
this.UUID = UUID;
|
||||
skipNoticeRef: React.MutableRefObject<SkipNoticeComponent>;
|
||||
|
||||
constructor(segments: SponsorTime[], autoSkip: boolean = false, contentContainer) {
|
||||
this.segments = segments;
|
||||
this.autoSkip = autoSkip;
|
||||
this.contentContainer = contentContainer;
|
||||
|
||||
@@ -35,7 +38,11 @@ class SkipNotice {
|
||||
|
||||
let amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
||||
//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.id = "sponsorSkipNoticeContainer" + idSuffix;
|
||||
@@ -43,9 +50,10 @@ class SkipNotice {
|
||||
referenceNode.prepend(this.noticeElement);
|
||||
|
||||
ReactDOM.render(
|
||||
<SkipNoticeComponent UUID={UUID}
|
||||
<SkipNoticeComponent segments={segments}
|
||||
autoSkip={autoSkip}
|
||||
contentContainer={contentContainer}
|
||||
ref={this.skipNoticeRef}
|
||||
closeListener={() => this.close()} />,
|
||||
this.noticeElement
|
||||
);
|
||||
|
||||
21
src/types.ts
21
src/types.ts
@@ -5,12 +5,12 @@ interface ContentContainer {
|
||||
(): {
|
||||
vote: (type: any, UUID: any, category?: string, skipNotice?: SkipNoticeComponent) => void,
|
||||
dontShowNoticeAgain: () => void,
|
||||
unskipSponsorTime: (UUID: any) => void,
|
||||
unskipSponsorTime: (segment: SponsorTime) => void,
|
||||
sponsorTimes: SponsorTime[],
|
||||
sponsorTimesSubmitting: SponsorTime[],
|
||||
v: HTMLVideoElement,
|
||||
sponsorVideoID,
|
||||
reskipSponsorTime: (UUID: any) => void,
|
||||
reskipSponsorTime: (segment: SponsorTime) => void,
|
||||
updatePreviewBar: () => void,
|
||||
onMobileYouTube: boolean,
|
||||
sponsorSubmissionNotice: SubmissionNotice,
|
||||
@@ -18,10 +18,16 @@ interface ContentContainer {
|
||||
changeStartSponsorButton: (showStartSponsor: any, uploadButtonVisible: any) => Promise<boolean>,
|
||||
previewTime: (time: number) => void,
|
||||
videoInfo: any,
|
||||
getRoughCurrentTime: () => number
|
||||
getRealCurrentTime: () => number
|
||||
}
|
||||
}
|
||||
|
||||
interface FetchResponse {
|
||||
responseText: string,
|
||||
status: number,
|
||||
ok: boolean
|
||||
}
|
||||
|
||||
interface VideoDurationResponse {
|
||||
duration: number;
|
||||
}
|
||||
@@ -52,14 +58,21 @@ interface SponsorTime {
|
||||
hidden?: SponsorHideType;
|
||||
}
|
||||
|
||||
interface PreviewBarOption {
|
||||
color: string,
|
||||
opacity: string
|
||||
}
|
||||
|
||||
type VideoID = string;
|
||||
|
||||
export {
|
||||
FetchResponse,
|
||||
VideoDurationResponse,
|
||||
ContentContainer,
|
||||
CategorySelection,
|
||||
CategorySkipOption,
|
||||
SponsorTime,
|
||||
VideoID,
|
||||
SponsorHideType
|
||||
SponsorHideType,
|
||||
PreviewBarOption
|
||||
};
|
||||
71
src/utils.ts
71
src/utils.ts
@@ -1,5 +1,5 @@
|
||||
import Config from "./config";
|
||||
import { CategorySelection, SponsorTime } from "./types";
|
||||
import { CategorySelection, SponsorTime, FetchResponse } from "./types";
|
||||
|
||||
import * as CompileConfig from "../config.json";
|
||||
|
||||
@@ -276,29 +276,18 @@ class Utils {
|
||||
* @param address The address to add to the SponsorBlock server address
|
||||
* @param callback
|
||||
*/
|
||||
async asyncRequestToCustomServer(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;
|
||||
async asyncRequestToCustomServer(type: string, url: string, data = {}): Promise<FetchResponse> {
|
||||
return new Promise((resolve) => {
|
||||
// Ask the background script to do the work
|
||||
chrome.runtime.sendMessage({
|
||||
message: "sendRequest",
|
||||
type,
|
||||
url,
|
||||
data
|
||||
}, (response) => {
|
||||
resolve(response);
|
||||
});
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -308,7 +297,7 @@ class Utils {
|
||||
* @param address The address to add to the SponsorBlock server address
|
||||
* @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;
|
||||
|
||||
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 callback
|
||||
*/
|
||||
sendRequestToServer(type: string, address: string, callback?: (xmlhttp: XMLHttpRequest, err: boolean) => any) {
|
||||
let xmlhttp = new XMLHttpRequest();
|
||||
|
||||
sendRequestToServer(type: string, address: string, callback?: (response: FetchResponse) => void) {
|
||||
let serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
|
||||
|
||||
xmlhttp.open(type, serverAddress + address, true);
|
||||
|
||||
if (callback != undefined) {
|
||||
xmlhttp.onreadystatechange = function () {
|
||||
callback(xmlhttp, false);
|
||||
};
|
||||
|
||||
xmlhttp.onerror = function(ev) {
|
||||
callback(xmlhttp, true);
|
||||
};
|
||||
}
|
||||
|
||||
//submit this request
|
||||
xmlhttp.send();
|
||||
|
||||
// Ask the background script to do the work
|
||||
chrome.runtime.sendMessage({
|
||||
message: "sendRequest",
|
||||
type,
|
||||
url: serverAddress + address
|
||||
}, (response) => {
|
||||
callback(response);
|
||||
});
|
||||
}
|
||||
|
||||
getFormattedMinutes(seconds: number) {
|
||||
@@ -377,6 +358,10 @@ class Utils {
|
||||
return window.location.protocol === "http:" || window.location.protocol === "https:";
|
||||
}
|
||||
|
||||
isHex(num: string): boolean {
|
||||
return Boolean(num.match(/^[0-9a-f]+$/i));
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this Firefox (web-extensions)
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user