Compare commits
127 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6de1a58d88 | ||
|
|
43a9ba0f9e | ||
|
|
c3489e54a6 | ||
|
|
75c003b204 | ||
|
|
da5de43121 | ||
|
|
d20a44751c | ||
|
|
15706fd3c4 | ||
|
|
a9e43f95f5 | ||
|
|
11fe87a09e | ||
|
|
52741b2c0a | ||
|
|
09b18a4f6d | ||
|
|
326385f325 | ||
|
|
28884f5e9f | ||
|
|
50d5f956c6 | ||
|
|
585038c902 | ||
|
|
c79b06aed3 | ||
|
|
8d2883b6e2 | ||
|
|
c96ce694b7 | ||
|
|
989b5c9370 | ||
|
|
032264d8bb | ||
|
|
d089e43b8a | ||
|
|
b3336a218e | ||
|
|
bea943dc96 | ||
|
|
12f41521f5 | ||
|
|
36aec560ca | ||
|
|
e8a106d36b | ||
|
|
2c52b9e600 | ||
|
|
3c5316a11c | ||
|
|
c5044d3ebd | ||
|
|
db34f1fd5b | ||
|
|
21f563fdb7 | ||
|
|
3bbc699d98 | ||
|
|
53d688f219 | ||
|
|
2231e2a345 | ||
|
|
e126b59078 | ||
|
|
2a0e893dfc | ||
|
|
8b348a2aeb | ||
|
|
28096e1ba6 | ||
|
|
56b74d6863 | ||
|
|
ffc8f0b6a0 | ||
|
|
4fef6dcfa0 | ||
|
|
a3c80573fa | ||
|
|
a13f5d2359 | ||
|
|
42beaf698c | ||
|
|
4e99754b8c | ||
|
|
422139f474 | ||
|
|
93e5bf5033 | ||
|
|
1bd78ec1c4 | ||
|
|
f01a1ae4ec | ||
|
|
c8611adf50 | ||
|
|
b974806514 | ||
|
|
668b956bb7 | ||
|
|
7b54b79f27 | ||
|
|
ef36c79092 | ||
|
|
c1898d0db7 | ||
|
|
e9e3114549 | ||
|
|
a56bba0612 | ||
|
|
afeba5f077 | ||
|
|
81d0c0cab1 | ||
|
|
de1f18612f | ||
|
|
ba37f5885a | ||
|
|
9c54d141e9 | ||
|
|
2a3a04a504 | ||
|
|
13ad7516c2 | ||
|
|
bcb981ae3d | ||
|
|
8d83076ea1 | ||
|
|
17437870e7 | ||
|
|
2373b34067 | ||
|
|
839dd4613c | ||
|
|
c84a951acc | ||
|
|
d0949452da | ||
|
|
1a855a6993 | ||
|
|
1656fae2d4 | ||
|
|
22be10d33f | ||
|
|
324c28b867 | ||
|
|
d56637cb14 | ||
|
|
e720acc674 | ||
|
|
c396d1690d | ||
|
|
2f5d4dfe03 | ||
|
|
821c45a6b6 | ||
|
|
ff44016003 | ||
|
|
b11d99a196 | ||
|
|
6f548987a3 | ||
|
|
c6438872e2 | ||
|
|
8c9424b6c5 | ||
|
|
caae61a6a8 | ||
|
|
777f3a2769 | ||
|
|
6fa5aea680 | ||
|
|
a839480a33 | ||
|
|
797c9d67e4 | ||
|
|
528b475429 | ||
|
|
e39b441c16 | ||
|
|
b8cbedbc4d | ||
|
|
76b78ef132 | ||
|
|
572fee265d | ||
|
|
0dd2d18b07 | ||
|
|
798221606d | ||
|
|
55b38dc30e | ||
|
|
a1722db8d5 | ||
|
|
d27ddc85ae | ||
|
|
6d07abf6c8 | ||
|
|
7adf0ad169 | ||
|
|
0086f00889 | ||
|
|
d458bb0cdf | ||
|
|
71ec724295 | ||
|
|
5472919866 | ||
|
|
92eafdb6f3 | ||
|
|
5fbb8c0d4a | ||
|
|
ebf3b324b6 | ||
|
|
e680099cec | ||
|
|
616981a2b7 | ||
|
|
2aaee2c1c4 | ||
|
|
ef7e5d1312 | ||
|
|
a8af7a0d78 | ||
|
|
97ed091432 | ||
|
|
756233a959 | ||
|
|
9c13b7e8fd | ||
|
|
a812b16da5 | ||
|
|
4020cdc4f2 | ||
|
|
5cf6719681 | ||
|
|
0a587ed98b | ||
|
|
a08dbf4da1 | ||
|
|
edcda31db4 | ||
|
|
a10d7c338c | ||
|
|
3ff5fdb3a1 | ||
|
|
cc935624e9 | ||
|
|
2681dc1890 |
1
.github/FUNDING.yml
vendored
@@ -1,2 +1,3 @@
|
||||
github: ajayyy-org
|
||||
patreon: ajayyy
|
||||
custom: [sponsor.ajay.app/donate]
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
"serverAddress": "https://sponsor.ajay.app",
|
||||
"testingServerAddress": "https://sponsor.ajay.app/test",
|
||||
"serverAddressComment": "This specifies the default SponsorBlock server to connect to",
|
||||
"categoryList": ["sponsor", "selfpromo", "interaction", "intro", "outro", "preview", "music_offtopic"]
|
||||
"categoryList": ["sponsor", "selfpromo", "interaction", "poi_highlight", "intro", "outro", "preview", "music_offtopic"]
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "2.1.2.1",
|
||||
"version": "3.0.3",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"homepage_url": "https://sponsor.ajay.app",
|
||||
"content_scripts": [{
|
||||
"run_at": "document_start",
|
||||
"matches": [
|
||||
@@ -40,8 +41,11 @@
|
||||
"icons/help.svg",
|
||||
"icons/report.png",
|
||||
"icons/close.png",
|
||||
"icons/skipIcon.svg",
|
||||
"icons/refresh.svg",
|
||||
"icons/beep.ogg",
|
||||
"icons/pause.svg",
|
||||
"icons/stop.svg",
|
||||
"icons/PlayerInfoIconSponsorBlocker.svg",
|
||||
"icons/PlayerDeleteIconSponsorBlocker.svg",
|
||||
"popup.html",
|
||||
|
||||
20154
package-lock.json
generated
@@ -11,8 +11,8 @@
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"concurrently": "^5.1.0",
|
||||
"react": "^16.12.0",
|
||||
"react-dom": "^16.12.0"
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chrome": "0.0.91",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"fullName": {
|
||||
"message": "SponsorBlock за YouTube - пропускай спонсорства",
|
||||
"message": "SponsorBlock за YouTube - пропускайте спонсорства",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
@@ -8,16 +8,16 @@
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Сървърът каза, че тази заявка е невалидна"
|
||||
"message": "Сървърът съобщава, че тази заявка е невалидна"
|
||||
},
|
||||
"429": {
|
||||
"message": "Подали сте прекалено много спонсорства за едно видео, сигурни ли сте, че има толкова много?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Това спонсорство вече е подадено"
|
||||
"message": "Това спонсорство е вече изпратено"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Каналът е добавен към Whitelist!"
|
||||
"message": "Каналът е добавен към белия списък!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "сегмент"
|
||||
@@ -25,50 +25,74 @@
|
||||
"Segments": {
|
||||
"message": "сегменти"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Одобряване на това предложение"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Докладвай"
|
||||
"message": "Докладване"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Подайте сигнал за неправилно предложение."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Отхвърли"
|
||||
"message": "Отхвърляне"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Зареждане..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Никога не показвай"
|
||||
"message": "Никога да не се показва"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Натиснете \"върни\" за да се върнете където бяхте."
|
||||
"message": "Натиснете „връщане“, за да се върнете там, където бяхте."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Върни"
|
||||
"message": "Връщане"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Пропусни отново"
|
||||
"message": "Пропускане отново"
|
||||
},
|
||||
"paused": {
|
||||
"message": "На пауза"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Таймерът е спрян"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "За да редактирате или изтриете някои стойности, натиснете на \"инфо\" бутона или отворете изкачащият прозорец на добавката чрез кликване на иконата на добавката в горният ляв ъгъл."
|
||||
"message": "За да редактирате или изтриете отделни стойности, щракнете върху бутона за информация или отворете изскачащия прозорец на разширението, като щракнете върху иконата на разширението в горния десен ъгъл."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Сигурни ли сте, че искате да изчистите това?\n\n"
|
||||
"message": "Наистина ли искате да изчистите това?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Възникна грешка при подаването на Вашите спонсорски времена, моля опитайте отново по-късно."
|
||||
"message": "Възникна грешка при подаването на вашите времена на спонсорства, моля, опитайте отново по-късно."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Този видеоклип има сегменти в базата данни!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Не са намерени сегменти"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Сегментът Започва Сега"
|
||||
"message": "Сегментът започва сега"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Сегментът Свършва Сега"
|
||||
"message": "Сегментът свършва сега"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Отказ от създаването на сегмент"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Не е намерен видеоклип в YouTube.\nАко това е неправилно, опреснете раздела."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Опресняване на сегментите"
|
||||
},
|
||||
"success": {
|
||||
"message": "Успешно!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Гласувано!"
|
||||
"message": "Гласувахте!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Изглежда, че сървърът не работи. Свържете се с програмиста незабавно."
|
||||
@@ -76,26 +100,415 @@
|
||||
"connectionError": {
|
||||
"message": "Възникна грешка с връзката. Код на грешката: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "Искате ли да изпратите сегментите за видеоклип с id"
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Изчистване на сегментите"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Отворете изскачащия прозорец на SponsorBlock"
|
||||
"message": "Отваряне на изскачащия прозорец на SponsorBlock"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Затваряне на прозореца"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Изпращане на сегментите"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Сигурни ли сте, че искате да подадете това?"
|
||||
"message": "Наистина ли искате да изпратите това?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Добавяне на канала към белия списък"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Премахване на канала от белия списък"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Гласувайте за сегмент"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Изпратени сегменти"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Вие сте помогнали на хората да пропуснат "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Класиране"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Изпращане"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Редактирането на частите ще се появи, след като щракнете върху Изпращане",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Съвет: Можете да настроите клавиши за изпращане в опциите"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Изчистване на времената"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Изпращане на времената"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Това се използва на страницата с публичната статистика, за да покаже колко сте допринесли. Вижте го"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Потребителско име"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Задайте потребителско име"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Елате в официалния Discord сървър за да давате предложения!"
|
||||
"message": "Елате в официалния Discord сървър, за да давате предложения!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Скрий това"
|
||||
"message": "Скриване на това"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Настройки"
|
||||
"message": "Опции"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Показване на бутоните в YouTube Player-а"
|
||||
"message": "Показване на бутоните в плейъра на YouTube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Скриване на бутоните в YouTube Player-а"
|
||||
"message": "Скриване на бутоните в плейъра на YouTube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Показване на бутона за информация в плейъра на YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Скриване на бутона за информация в плейъра на YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Това е бутонът, който отваря изскачащ прозорец в страницата на YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Автоматично скриване на бутона за информация"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Скриване на бутона за изтриване в плейъра на YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Показване на бутона за изтриване в плейъра на YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Това е бутонът в плейъра на YouTube, който ще изчисти всичките ви неизпратени сегменти за текущия видеоклип."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Активиране проследяването на броя пропускания"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Тази функция проследява кои сегменти сте пропуснали, за да уведоми потребителите доколко приносът им е помогнал на другите и се използва като показател заедно с положителните гласове, за да се гарантира, че спамът няма да попадне в базата данни. Разширението изпраща съобщение до сървъра всеки път, когато пропуснете сегмент. Надяваме се, че повечето хора няма да променят тази настройка, така че броят на прегледите да е точен. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Активиране проследяването на броя пропускания в раздели „Инкогнито“"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Заявка по префикс на хеш"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Вместо да се изискват сегменти от сървъра с помощта на videoID, се изпращат първите 4 знака от хеша на videoID. Този сървър ще изпрати обратно данни за всички видеоклипове с подобни хешове."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Повторно извличане на сегментите при нови видеоклипове"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Ако видеоклипът е нов и няма намерени сегменти, той ще продължи да извлича на всеки няколко минути, докато гледате."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Отново покажете известието"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Показване на известие след пропускане на сегмент"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Известия за пропускане в пълен размер"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Малки известия за пропускане при автоматично пропускане"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Изцяло малки известия за пропускане"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Плавни известия за пропускане при автоматично пропускане"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Изцяло плавни известия за пропускане"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock ви позволява да прескачате спонсори, въведения, заключения, напомняния за абониране и други досадни части от видеоклиповете в YouTube. SponsorBlock е разширение за браузър, създадено от множество хора, което позволява на всеки да изпраща началния и крайния час на спонсорирани сегменти и други сегменти от видеоклиповете в YouTube. След като един човек подаде тази информация, всички останали с това разширение ще прескочат спонсорирания сегмент. Можете също да пропуснете части без музика при музикалните видеоклипове.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Уебсайт",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Програмен код",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "Известието е обновено!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Ако все още не ви харесва, натиснете бутона „Никога да не се показва“.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Задайте клавиш за пропускане на сегмент"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Задайте клавиш за начало/край на сегмент"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Задайте клавиш за изпращане"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Изберете клавиш, като го натиснете"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Клавишът е зададен за: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Времето за изчакване на връзката изтече. Проверете връзката си с интернет. Ако вашият интернет работи, вероятно сървърът е претоварен или не работи."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Пропускането е активирано"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "Пропускането е деактивирано"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Вашата работа",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Сървърът изглежда претоварен. Опитайте отново след няколко секунди."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Код на грешката: "
|
||||
},
|
||||
"skip": {
|
||||
"message": "Пропускане"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Пропускане на {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Прескачане до {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} пропуснат",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Прескочено до {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Деактивиране на автоматичното пропускане"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Активиране на автоматичното пропускане"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Звуково известие при пропускане"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Звуковото известие при пропускане ще пуска звук всеки път, когато се пропусне сегмент. Ако е забранено (или автоматичното пропускане е деактивирано), няма да се пуска звук."
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "Показване на времето с премахнати пропускания"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Това време се показва в скоби до текущото време под лентата за прогреса. Това показва общата продължителност на видеоклипа минус всички сегменти. Това включва сегменти, маркирани само като „Показване в лентата за прогреса“."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Пропуснали сте "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Спестили сте "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "минута"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "минути"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "час"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "часа"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Спестили сте на хората"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " от живота им"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Проверете status.sponsor.ajay.app за състоянието на сървъра."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Импортиране/експортиране на вашия UserID"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Това трябва да се пази тайно. То е като парола и не трябва да се споделя с никого. Ако някой го притежава, той може да се представи за вас."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Задаване на UserID"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Внимание: Промяната на UserID е постоянна. Наистина ли искате да направите това? Не забравяйте да архивирате стария си за всеки случай."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Създаден от"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". В момента е настроено на:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Поддръжка на YouTube-сайтове на трети страни"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Поддръжка на клиенти за YouTube на трети страни. За да активирате поддръжката, трябва да приемете допълнителните разрешения. Това НЕ работи в режим инкогнито в Chrome и други варианти на Chromium.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Поддържани сайтове: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Активиране поддръжката на Invidious, деактивиране на автоматичното пропускане, скриване на бутоните и др."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Добавяне екземпляр на клиент на трета страна"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Добавяне на персонализиран екземпляр. Това трябва да бъде форматирано само с домейна. Пример: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Добавяне"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Това е невалиден домейн. Трябва да включва само частта на домейна. Пример: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Нулиране списъка на Invidious"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "На път сте да нулирате списъка на Invidious"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Текущи екземпляри:"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Минимална продължителност (секунди):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Сегменти, по-кратки от зададената стойност, няма да бъдат пропускани или показвани в плейъра."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Продължителност на известието за пропускане (секунди):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Известието за пропускане ще остане на екрана поне толкова дълго. За ръчно пропускане може да се вижда по-дълго."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Следното предложение е по-кратко от опцията за минимална продължителност. Това може да означава, че вече е изпратено и просто е игнорирано поради тази опция. Наистина ли искате да го изпратите?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Показване на бутона за качване"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Този бутон се появява в плейъра на YouTube, след като сте избрали времева отметка и сте готови за изпращане."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Адрес на сървъра на SponsorBlock"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "Адресът, който SponsorBlock използва за осъществяване на заявки към сървъра.\nОсвен ако нямате собствен екземпляр на сървър, това не трябва да се променя."
|
||||
},
|
||||
"save": {
|
||||
"message": "Запазване"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Начално състояние"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Този адрес не е в правилния формат. Уверете се, че имате http:// или https:// в началото и няма последващи наклонени черти."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Наистина ли искате да върнете началното състояние?"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com вече се поддържа"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Импортиране/експортиране на всички опции"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Това е цялата ви конфигурация в JSON. Това включва вашия userID, така че се уверете, че споделяте това разумно."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Задаване на опции"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "Внимание: Промяната на опциите е постоянна и може да повреди вашата инсталация. Наистина ли искате да направите това? Не забравяйте да архивирате старите си за всеки случай."
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "Този JSON не е форматиран правилно. Вашите опции не са променени."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Изпращане на сегмента"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Изпращане"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Отказ"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Изтриване"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Преглед"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "Неизпратен"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Изследване"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Редактиране"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "Копиране на информацията за отстраняване на грешки в клипборда"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "Неуспешно записване в клипборда"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Копира информацията в клипборда, за да се предостави на разработчика при възникване на грешка или когато разработчикът поиска това. Деликатната информация като вашия user ID, канали в белия списък и потребителски адрес на сървъра са премахнати. Съдържа се обаче информация като вашия потребителски агент, браузър, операционна система и номер на версия на разширението. "
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Информацията за отстраняване на грешки е копирана в клипборда. Чувствайте се свободни да премахнете всяка информация, която предпочитате да не споделяте. Запазете това в текстов файл или го поставете в доклада за грешки."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Клавишът"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "е обвързан с друго действие. Моля, изберете друг клавиш."
|
||||
},
|
||||
"to": {
|
||||
"message": "до",
|
||||
@@ -104,52 +517,285 @@
|
||||
"category_sponsor": {
|
||||
"message": "Спонсорство"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Неплатена/Само-реклама"
|
||||
"message": "Неплатени/Самореклама"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Подобно на \"спонсорство\", но е неплатено. Това включва merchandise, дарения или информация с кого каналът има сътрудничество."
|
||||
"message": "Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Напомняне за действие (абониране)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или заради нещо специфично, трябва да е под \"само-реклама\"."
|
||||
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или за нещо специфично, трябва да е под „самореклама“."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Напомняне за взаимодействие"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Антракт/Начална анимация"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Антракт"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Крайни картички/Заслуги"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация."
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Кратко резюме/Обобщение"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Музика: Част без музика"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Без музика"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Акцент"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Частта от видеото, която повечето хора търсят. Подобно на коментарите „Видеото започва от х“."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Поточно предаване: Четене на съобщения/дарения"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Четене на съобщения"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Забрани"
|
||||
"autoSkip": {
|
||||
"message": "Автоматично пропускане"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Ръчно Прескачане"
|
||||
"message": "Ръчно пропускане"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Показване в seek лентата"
|
||||
"message": "Показване в лентата на прогреса"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Деактивиране"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Автоматично прескачане до началото"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Питане, когато видеото се зарежда"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Показване в лентата на прогреса"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Автоматично пропускане на всички сегменти, когато има сегмент без музика"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен hex код с \"#\" в началото."
|
||||
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен шестнадесетичен код с „#“ в началото."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Цвят на неизпратен сегмент",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Цвят на лентата на прогреса"
|
||||
},
|
||||
"category": {
|
||||
"message": "Категория"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "Метод за пропускане",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Активиране на сървъра за бета тестване"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "Вашите предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър. Използвайте това само за тестване."
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Всички предложения и гласове НЯМА ДА СЕ БРОЯТ към основния сървър, докато се свързвате с тестовия сървър. Не забравяйте да деактивирате това, когато искате да правите реални предложения."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Сега)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Още категории"
|
||||
},
|
||||
"chooseACategory": {
|
||||
"message": "Изберете категория"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "За да изпратите сегменти с категория „{0}“, трябва да я активирате от опциите. Ще бъдете пренасочени към опциите сега.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Трябва да изберете категория за всички сегменти, които изпращате!"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Край)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "скрито: глас против"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "скрито: твърде кратко"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "ID на канала все още не е зареден. Ако използвате вграден видеоклип, опитайте вместо това да използвате началната страница на YouTube. Това може да бъде причинено и от промени в оформлението на YouTube, ако мислите така, направете коментар тук:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Изглежда, че нещо блокира способността на SponsorBlock да получава видео данни. Моля, вижте https://github.com/ajayyy/SponsorBlock/issues/741 за повече информация."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Изглежда, че SponsorBlock не може да достигне API на YouTube. За да поправите това, приемете подканата за разрешение, която ще се появи след това, изчакайте няколко секунди и след това презаредете страницата."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Даване на разрешение"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Искането за разрешение е успешно!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Искането за разрешение не бе успешно, натиснахте ли Отказ?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Ако не можете да разрешите това, деактивирайте настройката „Принудителна проверка на канала преди пропускане“, тъй като SponsorBlock не може да извлече информацията за канала за този видеоклип"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Принудителна проверка на канала преди пропускане"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "По подразбиране ще пропусне сегменти веднага, преди дори да разбере какъв е каналът. По подразбиране някои сегменти в началото на видеоклипа може да бъдат пропуснати в канали от белия списък. Активирането на тази опция ще предотврати това, но при всички пропускания ще има леко забавяне, тъй като получаването на ID на канала може да отнеме известно време. Това забавяне може да бъде незабележимо, ако имате бърз интернет."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Помислете за активиране на „Принудителна проверка на канала преди пропускане“"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Грешно/Неправилно Време"
|
||||
"message": "Грешно/Неправилно време"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Грешна Категория"
|
||||
"message": "Грешна категория"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Няколко Сегмента"
|
||||
"message": "Няколко сегмента"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Правила"
|
||||
"message": "Насоки"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Прочетете насоките!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Категориите са тук!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Отворете опциите, за да пропускате въведения, заключения, продажба на стоки и т.н."
|
||||
},
|
||||
"help": {
|
||||
"message": "Помощ"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Разбрах",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Отказ от всички бъдещи експерименти",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Скриване завинаги"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени, и просто искаме да изясним правилата. Можете също да се присъедините към този чат с помощта на discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Гласуването е отхвърлено поради предупреждение. Щракнете, за да отворите чат и да го разрешите, или се върнете по-късно, когато имате време.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Дарение"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Скриване на връзката за дарение"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Благодарим ви, че инсталирахте SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Моля, прегледайте опциите по-долу"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Много функции са деактивирани по подразбиране. Ако искате да пропускате въведения, заключения, да използвате Invidious и т.н., активирайте ги по-долу. Можете също да скриете/покажете елементи от потребителския интерфейс."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Как работи пропускането"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Видео сегментите автоматично ще бъдат пропуснати, ако бъдат намерени в базата данни. Можете да отворите изскачащия прозорец, като щракнете върху иконата на разширението, за да прегледате какви са сегментите."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Всеки път, когато пропуснете сегмент, ще получите известие. Ако времето изглежда грешно, гласувайте против, като щракнете на палец надолу! Можете също така да гласувате в изскачащия прозорец."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Изпращане"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Изпращането може да се извърши или в изскачащия прозорец, като натиснете бутона „Сегментът започва сега“, или във видеоплейъра с бутоните на плейъра."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Щракването върху бутона за възпроизвеждане показва началото на сегмента, а щракването върху иконата за спиране показва края. Можете да подготвите множество спонсори, преди да натиснете „изпращане“. Щракването върху бутона за качване ще изпрати данните. Щракването върху кошчето за боклук ще ги изтрие."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Редактиране"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Ако сте объркали, можете да редактирате или изтриете сегментите си, след като щракнете върху бутона със стрелка нагоре."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Това е твърде бавно"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Има клавишни комбинации, ако искате да ги използвате. Натиснете клавиша с точка и запетая, за да посочите началото/края на спонсориран сегмент и щракнете върху апострофа, за да го изпратите. Клавишите могат да бъдат променени в опциите. Ако не използвате подредба QWERTY, вероятно трябва да промените зададените клавиши."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Мога ли да получа копие от базата данни? Какво ще стане, ако изчезнете?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Базата данни е публична и достъпна на адрес"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Програмният код е достъпен свободно. Така че, дори нещо да ми се случи, вашият принос не се губи."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Новини и как се прави"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Къде мога да получа програмния код?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Заслуги"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Ново! Отидете до съществената част на видеоклипа с едно щракване с новата категория „Акцент“"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Научете повече"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
"message": "Nebyly nalezeny žádné segmenty"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Segment nyní začíná"
|
||||
"message": "Nyní začíná segment"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Segment nyní končí"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Nebylo nalezeno žádné YouTube video.\nPokud je to špatně, obnovte záložku."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Aktualizovat segmenty"
|
||||
},
|
||||
"success": {
|
||||
"message": "Úspěch!"
|
||||
},
|
||||
@@ -221,6 +224,24 @@
|
||||
"showNotice": {
|
||||
"message": "Znovu zobrazit upozornění"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Zobrazit upozornění po přeskočení segmentu"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Oznámení o přeskočení v plné velikosti"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Malá oznámení o automatickém přeskočení"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Všechna malá oznámení o přeskočení"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Vybledlá oznámení o automatickém přeskočení"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Všechna vybledlá oznámení o přeskočení"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock vám umožní přeskakovat sponzorské sekce, intra, outra, oznámení k odběru a další otravné části YouTube videí. SponsorBlock je crowdsourcované rozšíření prohlížeče, které dává komukoli možnost odeslat začátek a konec sponzorovaných segmentů a dalších segmentů YouTube videí. Jakmile jedna osoba odešle tuto informaci, všichni ostatní s tímto rozšířením automaticky přeskočí sponzorovaný segment. Můžete také přeskakovat nehudební sekce v hudebních videích.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Přeskočit {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Přeskočit na {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "- přeskočeno"
|
||||
"message": "Segment {0} přeskočen",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Přeskočeno na {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Zakázat automatické přeskočení"
|
||||
@@ -344,12 +374,6 @@
|
||||
"createdBy": {
|
||||
"message": "Vytvořil"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatické přeskočení"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Zobrazit upozornění po přeskočení segmentu"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Je momentálně nastaveno na:"
|
||||
},
|
||||
@@ -541,14 +565,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Jiné než hudba"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Zvýraznění"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Část videa, kterou hledá většina lidí. Podobné komentářům typu \"Video začíná v x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Čtení donatů / zpráv"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Čtení zpráv"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Zakázat"
|
||||
"autoSkip": {
|
||||
"message": "Automatické přeskočení"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Ruční přeskočení"
|
||||
@@ -556,6 +586,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Zobrazit v liště"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Zakázat"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Automatické přeskočení na začátek"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Zeptat se při načtení videa"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Zobrazit v liště"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automaticky přeskočit všechny segmenty, když je ve videu nehudební segment"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Vaše barva má nesprávný formát. Měl by to být 3 nebo 6 znaků dlouhý HEX kód s křížkem na začátku."
|
||||
},
|
||||
@@ -666,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Nápověda"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Pomozte zabránit zmizení tohoto"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Toto video bylo detekováno jako neuvedené a bylo nahráno před rokem 2017\nStará neuvedená videa budou nastavena příští měsíc na soukromá\nSbíráme *veřejná* videa pro zálohu\nChtěli byste nám anonymně poslat toto video?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Rozumím",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Odhlásit se ze všech budoucích experimentů",
|
||||
@@ -678,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Skrýt napořád"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Dostali jste varování a nemůžete dočasně přidávat segmenty. To znamená, že jsme si všimli, že děláte běžné chyby, které nejsou škodlivé, jen chceme vyjasnit pravidla. Také se můžete připojit do tohoto chatu pomocí discord.gg/SponsorBlock nebo matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Hlas zamítnut kvůli varování. Klikněte pro otevření chatu pro vyřešení, nebo se vraťte později, až budete mít čas.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Přispět"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Skrýt odkaz na přispění"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Děkujeme za instalaci SponsorBlocku."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Zkontrolujte prosím možnosti níže"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Spousta funkcí je ve výchozím nastavení zakázána. Pokud chcete přeskakovat intra, outra, používat Invidious atd., povolte je níže. Můžete také zobrazit/skrýt UI prvky."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Jak funguje přeskakování"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Segmenty videa budou automaticky přeskočeny, pokud budou nalezeny v databázi. Můžete si otevřít vyskakovací okno kliknutím na ikonu rozšíření pro náhled, co jsou zač."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Kdykoli přeskočíte segment, dostanete oznámení. Pokud je časování nesprávné, můžete hlasovat proti kliknutím na palec dolů! Také můžete hlasovat ve vyskakovacím okně."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Odesílání"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Odeslání může být provedeno buď ve vyskakovacím okně kliknutím na tlačítko \"Nyní začíná segment\" v přehrávači videa nebo na tlačítkách na přehrávači."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Kliknutím na tlačítko přehrávání označí začátek segmentu a kliknutí na ikonu stop označuje konec. Před odesláním si můžete připravit více segmentů. Kliknutím na tlačítko k nahrání odešlete vaše segmenty. Kliknutím na ikonu koše vše smažete."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Úprava"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Pokud jste něco pokazili, můžete kliknutím na šipku nahoru upravit nebo odstranit své segmenty."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Je to příliš pomalé"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Pokud je chcete použít, jsou zde zkratky. Stiskněte pomlčku pro označení začátku/konce sponzorského segmentu a klikněte na apostrof pro odeslání. Tyto zkratky lze změnit v možnostech. Pokud nepoužíváte QWERTY, měli byste si je nejspíše změnit."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Mohu získat kopii databáze? Co se stane, pokud zmizíte?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Databáze je veřejná a dostupná na"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Zdrojový kód je volně dostupný. Takže i když se mi něco stane, vaše příspěvky nebudou ztraceny."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Novinky a jak to funguje"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Kde získám zdrojový kód?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Poděkování"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novinka! Dostaňte se k pointě videa jedním kliknutím s novou kategorií zvýraznění"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Zjistit více"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,5 +66,56 @@
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Der skete en fejl da du prøvede at indsende dine reklame tider, prøv lige igen."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Denne video har segmenter i databasen!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Ingen segmenter fundet"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Segment Begynder Nu"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Segment Slutter Nu"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Annuller Oprettelse Af Segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Ingen YouTube-video fundet.\nHvis dette er forkert, så genindlæs siden."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Opdater segmenter"
|
||||
},
|
||||
"success": {
|
||||
"message": "Succes!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Stemt!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Det ser ud til at serveren er nede. Kontakt udvikleren straks."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Der opstod en forbindelsesfejl. Fejlkode: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Ryd Segmenter"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Åbn SponsorBloker Pop-op"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Luk Pop-op"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Indsend Segmenter"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Er du sikker på, at du vil indsende dette?"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Stem På Et Segment"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Kein YouTube-Video gefunden.\nWenn dies falsch ist, aktualisiere den Tab."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Segment aktualisieren"
|
||||
},
|
||||
"success": {
|
||||
"message": "Geschafft!"
|
||||
},
|
||||
@@ -185,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "Dieser Knopf öffnet ein Pop-up auf der Youtube-Seite."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Info-Button automatisch ausblenden"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Deaktiviere den Löschen-Knopf im Youtube-Videoplayer"
|
||||
},
|
||||
@@ -200,6 +206,9 @@
|
||||
"whatViewTracking": {
|
||||
"message": "Diese Funktion erfasst, welche Segmente du übersprungen hast, um andere Nutzer zu zeigen, wie hilfreich ihre Beiträge sind. Außerdem stellt dies zusammen mit positiven Bewertungen sicher, dass keine unerwünschten Inhalte in die Datenbank gelangen. Die Erweiterung sendet jedes Mal, wenn du ein Segment überspringst, eine Meldung an den Server. Hoffentlich verändern die meisten Nutzer diese Einstellung nicht, um unsere Statistik zu verbessern :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktiviere den Übersprungen Zähler in Privaten/Incognito Tabs"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Abfrage nach Hash-Präfix"
|
||||
},
|
||||
@@ -215,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Hinweis erneut anzeigen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Zeige Pop-up nach dem Überspringen eines Segments"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock lässt dich gesponserte Videosegmente, Intros, Outros, Interaktions-Erinnerungen, Musikvideoteile ohne Musik und andere nervige Teile von YouTube-Videos überspringen. SponsorBlock ist eine crowdsourced Browser-Erweiterung, in der jeder die Start- und Endzeit gesponserter Videosegmente und anderer Segmente von YouTube-Videos einreicht. Sobald eine Person diese Informationen einreicht, überspringen alle anderen mit dieser Erweiterung das gesponserte Segment.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -275,8 +287,17 @@
|
||||
"skip_category": {
|
||||
"message": "{0} überspringen?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Zu {0} springen?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Übersprungen"
|
||||
"message": "{0} übersprungen",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Zu {0} gesprungen",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Automatisches Überspringen deaktivieren"
|
||||
@@ -338,18 +359,16 @@
|
||||
"createdBy": {
|
||||
"message": "Erstellt von"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatisch überspringen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Zeige Pop-up nach dem Überspringen eines Segments"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Aktuelle Einstellung:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Drittanbieter YouTube-Sites unterstützen"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Unterstütze Drittanbieter YouTube Clients. Zum unterstützen müssen zusätzlichliche Berechtigungen akzeptiert werden. Dies funktioniert NICHT im Incognitomodus auf Chrome oder anderen Chromium Varianten.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Unterstützte Seiten: "
|
||||
},
|
||||
@@ -383,6 +402,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Videosegmente, die kürzer als der festgelegte Wert sind, werden nicht übersprungen oder im Player angezeigt."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Benachrichtigungsdauer überspringen (Sekunden):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Die Überspringen Benachrichtigung wird mindestens so lange angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Die folgende Einreichung ist kürzer als deine Mindestdauer. Das könnte bedeuten, dass dieses Videosegment bereits eingereicht wurde und aufgrund dieser Option einfach ignoriert wird. Bist du dir sicher, dass du es übermitteln möchtest?"
|
||||
},
|
||||
@@ -513,6 +538,9 @@
|
||||
"category_preview": {
|
||||
"message": "Vorschau/Zusammenfassung"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Kurze Zusammenfassung bisheriger Videos oder eine Vorschau auf das aktuelle Video. Für zusammengeschnittene Clips gedacht, jedoch nicht für mündliche Zusammenfassungen."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musikvideoteile ohne Musik"
|
||||
},
|
||||
@@ -522,14 +550,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Musikvideoteile ohne Musik"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Hervorheben"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Der Teil des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "In Livestreams Spenden/Nachrichten vorlesen"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Wertschätzungen im Livestream"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktivieren"
|
||||
"autoSkip": {
|
||||
"message": "Automatisch überspringen"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manuelles Überspringen"
|
||||
@@ -537,6 +571,18 @@
|
||||
"showOverlay": {
|
||||
"message": "In der Video-Zeitleiste anzeigen"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktivieren"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Automatisch zum Start springen"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "In der Video-Zeitleiste anzeigen"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Alle Segmente automatisch überspringen, wenn ein nicht-Musiksegment vorhanden ist"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Die Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einer Raute am Anfang sein."
|
||||
},
|
||||
@@ -643,5 +689,22 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Öffne die Optionen um das Verhalten bei Intros, Outros, Merchandising (Fanartikel) usw. einzustellen."
|
||||
},
|
||||
"help": {
|
||||
"message": "Hilfe"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Abmeldung aller zukünftigen Experimente",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Dauerhaft verbergen"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Du wurdest ermahnt und kannst zur Zeit keine Segmente einreichen. Uns ist nämlich aufgefallen, dass du ein paar gängige Fehler machst, die nicht bösartig sind. Um die Regeln klarzustellen laden wir dich zu einem kurzem Gespräch auf discord.gg/SponsorBlock oder matrix.to/#/+sponsor:ajay.app ein"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Abstimmung wegen einer Warnung abgelehnt. Um über sie zu reden, klicke hier, oder schreibe uns später.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,9 +62,6 @@
|
||||
"skip": {
|
||||
"message": "Παράκαμψη"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Παραλείφθηκε"
|
||||
},
|
||||
"minLower": {
|
||||
"message": "λεπτό"
|
||||
},
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
"channelWhitelisted": {
|
||||
"message": "Channel Whitelisted!"
|
||||
},
|
||||
"Segment": {
|
||||
"Segment": {
|
||||
"message": "segment"
|
||||
},
|
||||
"Segments": {
|
||||
@@ -224,6 +224,24 @@
|
||||
"showNotice": {
|
||||
"message": "Show Notice Again"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Show Notice After A Segment Is Skipped"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Full Size Skip Notices"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Small Skip Notices for Auto Skip"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "All Small Skip Notices"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Faded Skip Notices for Auto Skip"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "All Faded Skip Notices"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock lets you skip over sponsors, intros, outros, subscription reminders, and other annoying parts of YouTube videos. SponsorBlock is a crowdsourced browser extension that let's anyone submit the start and end time's of sponsored segments and other segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. You can also skip over non music sections of music videos.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -284,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Skip {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Skip to {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Skipped"
|
||||
"message": "{0} Skipped",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Skipped to {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Disable Auto Skip"
|
||||
@@ -347,12 +374,6 @@
|
||||
"createdBy": {
|
||||
"message": "Created By"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Auto Skip"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Show Notice After A Segment Is Skipped"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". It is currently set to:"
|
||||
},
|
||||
@@ -544,14 +565,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Music"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Highlight"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "The part of the video that most people are looking for. Similar to \"Video starts at x\" comments."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Donation/Message Readings"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Message Reading"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Disable"
|
||||
"autoSkip": {
|
||||
"message": "Auto Skip"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manual Skip"
|
||||
@@ -559,6 +586,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Show In Seek Bar"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Disable"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Auto skip to the start"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Ask when video loads"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Show In Seek Bar"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Auto skip all segments when there is a non-music segment"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Your color is formatted incorrectly. It should be a 3 or 6 digit hex code with a number sign at the beginning."
|
||||
},
|
||||
@@ -669,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Help"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Help prevent this from disappearing"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "This video is detected as unlisted and uploaded before 2017\nOld unlisted videos are being set to private next month\nWe are collecting *public* videos to back up\nWould you like to anonymously send this video to us?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Got it",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Opt-out of all future experiments",
|
||||
@@ -681,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Hide forever"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "You got a warning and cannot submit segments temporarily. This means that we noticed you were making some common mistakes that are not malicious, and we just want to clarify the rules. You can also join this chat using discord.gg/SponsorBlock or matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Vote rejected due to a warning. Click to open a chat to resolve it, or come back later when you have time.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Donate"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Hide Donation Link"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Thanks for installing SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Please review the options below"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Many features are disabled by default. If you want to skip intros, outros, use Invidious, etc., enable them below. You can also hide/show UI elements."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "How skipping works"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Video segments will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Submitting"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Submitting can either be done in the popup by hitting the \"Segment Starts Now\" button or in the video player with the buttons on the player."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Editing"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "If you messed up, you can edit or delete your segments after clicking the up arrow button."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "This is too slow"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "There are hotkeys if you want to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit. These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Can I get a copy of the Database? What happens if you disappear?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "The database is public and available at"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "The source code is freely available. So, even if something happens to me, your submissions are not lost."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "News and how it is made"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Where can I get the source code?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Credits"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "New! Get to the point of the video with one click with the new highlight category"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Learn More"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,10 +74,10 @@
|
||||
"message": "No se han encontrado segmentos"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "El segmento comienza ahora"
|
||||
"message": "El Segmento Inicia Ahora"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "El segmento termina ahora"
|
||||
"message": "El Segmento Termina Ahora"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Cancelar Creación de Segmento"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "No se encontró vídeo de YouTube.\nSi esto es incorrecto, actualice la pestaña."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Actualizar segmentos"
|
||||
},
|
||||
"success": {
|
||||
"message": "¡Completado!"
|
||||
},
|
||||
@@ -221,6 +224,24 @@
|
||||
"showNotice": {
|
||||
"message": "Mostrar aviso de nuevo"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar aviso después de que se omita un segmento"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Avisos de Omisión de Tamaño Completo"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Avisos de Omisión Pequeños para la Omisión Automática"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Todos los Avisos de Omisión Pequeños"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Avisos de Omisión Desvanecidos para la Omisión Automática"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Todos los Avisos de Omisión Desvanecidos"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock te permite saltarte los patrocinadores, intros, outros, recordatorios de suscripción y otras partes molestas de los videos de YouTube. SponsorBlock es una extensión de navegador de código abierto que permite a cualquiera enviar el tiempo de inicio y fin de los segmentos de patrocinadores y otros segmentos de los videos de YouTube. Una vez que una persona envía esta información, todos los que tengan esta extensión podrán saltearse ese segmento. También es posible saltar las secciones no musicales de los videos musicales.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "¿Saltar {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "¿Saltar a {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Omitido/as"
|
||||
"message": "{0} Omitido/as",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Se ha saltado a {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Desactivar la omisión automática"
|
||||
@@ -344,12 +374,6 @@
|
||||
"createdBy": {
|
||||
"message": "Creado Por"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Omitir automáticamente"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar aviso después de que se omita un segmento"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Actualmente está configurado para:"
|
||||
},
|
||||
@@ -539,7 +563,13 @@
|
||||
"message": "Sólo para el uso en vídeos musicales. Esto sólo debe utilizarse para secciones de vídeos musicales que no están ya cubiertos por otra categoría."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "No musical"
|
||||
"message": "Sin Música"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Destacado"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "La parte del video que la mayoría de gente está buscando. Similar a los comentarios que dicen \"El video comienza en x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Directo: Lecturas de donaciones y mensajes"
|
||||
@@ -547,8 +577,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Lectura del mensaje"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Desactivar"
|
||||
"autoSkip": {
|
||||
"message": "Omitir automáticamente"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Omisión manual"
|
||||
@@ -556,6 +586,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Mostrar en la barra de búsqueda"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Desactivar"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Omitir automáticamente al inicio"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Preguntar cuando cargue el video"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Mostrar en la barra de búsqueda"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Omitir automáticamente todos los segmentos cuando hay un segmento sin música"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Su color está formateado incorrectamente. Debería ser un código hexadecimal de 3 o 6 dígitos con un signo numérico al principio."
|
||||
},
|
||||
@@ -612,7 +657,7 @@
|
||||
"message": "El ID del canal no está cargado todavía. Si está usando un vídeo incrustado, intente usar la página de inicio de YouTube en su lugar. Esto también podría ser causado por cambios en el diseño de YouTube, si lo cree, haga un comentario aquí:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Parece que algo está bloqueando la capacidad de SponsorBlock para obtener datos de video, Por favor, vea https://github.com/ajayyy/SponsorBlock/issues/741 para más información."
|
||||
"message": "Parece que algo está bloqueando la capacidad de SponsorBlock para obtener datos de video. Por favor, vea https://github.com/ajayyy/SponsorBlock/issues/741 para más información."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Parece que SponsorBlock no puede acceder a la API de YouTube. Para solucionarlo, acepte el aviso de permiso que aparecerá a continuación, espera unos segundos y vuelve a cargar la página."
|
||||
@@ -633,7 +678,7 @@
|
||||
"message": "Comprobación forzada del canal antes de saltarse"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."
|
||||
"message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso, ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Considere la posibilidad de activar \"Comprobación del canal de fuerza antes de saltar\""
|
||||
@@ -645,7 +690,7 @@
|
||||
"message": "Categoría Incorrecta"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Este video está clasificado como música. ¿Estás seguro de que esto tiene un patrocinador? Si esto es realmente un \"Segmento sin música\", abre las opciones de extensión y habilita esta categoría. Entonces, puedes enviar este segmento como \"No-Música\" en lugar de patrocinador. Por favor, lee las directrices si estás confundido."
|
||||
"message": "Este video está clasificado como música. ¿Estás seguro de que esto tiene un sponsor? Si esto es realmente un \"Segmento Sin Música\", abre las opciones de la extensión y activa esta categoría. Entonces, puedes enviar este segmento como \"Sin Música\" en lugar de sponsor. Por favor, lee las instrucciones si estás confundido/a."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Múltiples segmentos"
|
||||
@@ -666,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Ayuda"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Ayude a evitar que esto desaparezca"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Este vídeo se detecta como oculto y subido antes de 2017\nLos vídeos ocultos antiguos se pondrán como privados el próximo mes\nEstamos recopilando vídeos *públicos* para respaldar\n¿Quisiera enviarnos este vídeo de forma anónima?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Entendido",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "No participar en futuros experimentos",
|
||||
@@ -678,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Ocultar para siempre"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Ha recibido una advertencia y no puede enviar segmentos temporalmente. Esto significa que hemos notado de que estaba cometiendo algunos errores comunes que no son maliciosos, y solo queremos aclarar las reglas. Puedes unirte a este chat usando discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Voto rechazado debido a una advertencia. Haga clic aquí para abrir un chat para resolverlo, o vuelva más tarde cuando tenga tiempo.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Donar"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ocular Enlace de Donación"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Gracias por instalar SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Por favor, revise las siguientes opciones"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Muchas funciones están desactivadas por defecto. Si quiere saltar intros, outros, usar Invidious, etc., actívelos a continuación. También puede ocular/mostrar los elementos de la interfaz."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Como funciona el salteo"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Los segmentos de video serán omitidos automáticamente si son encontrados en la base de datos. Puede abrir la ventana emergente haciendo clic en el ícono de la extensión para obtener una vista previa de los que son."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Cada vez que salte un segmento, recibirá un aviso. ¡Si el tiempo parece equivocado, dele un voto negativo! También puede votar en la ventana emergente."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Envío"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "El envío puede realizarse desde la ventana emergente pulsando el botón \"El Segmento Inicia Ahora\" o en el reproductor de video con los botones de este."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Hacer clic en el botón de reproducir indica el inicio de un segmento y hacer clic en el icono de detener indica el final de este. Puede preparar múltiples sponsors antes de enviarlos. Hacer clic en el botón de subida lo(s) enviará. Hacer clic en la papelera lo(s) borrará."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Edición"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Si se equivoca, puede editar o eliminar sus segmentos después de hacer clic en el botón de flecha hacia arriba."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Esto es muy lento"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Hay teclas de acceso directo, si quiere usarlas. Presione la tecla de punto y coma para indicar el inicio/final de un segmento de sponsor y haga clic en el apóstrofe para enviar. Estas se pueden cambiar en las opciones. Si no usa un teclado QWERTY, probablemente debería cambiar la asignación de teclas."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "¿Puedo obtener una copia de la base de datos? ¿Qué sucede si tú desapareces?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "La base de datos es pública y disponible en"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "El código fuente está disponible libremente. Así que, aun si algo me sucede, sus envíos no se perderán."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Noticias y cómo se hace"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "¿Dónde puedo conseguir el código fuente?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Créditos"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "¡Nuevo! Llega al punto del video con un solo clic con la nueva categoría \"destacado\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Aprenda Más"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "YouTube'i videot ei leitud.\nKui see ei vasta tõele, laadi kaart uuesti."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Värskenda segmendid"
|
||||
},
|
||||
"success": {
|
||||
"message": "Õnnestus!"
|
||||
},
|
||||
@@ -221,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Kuva märkus uuesti"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Kuva segmendi vahelejätmisel teatis"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock lubab sul vahele jätta sponsorid, vaheajad, kanali tellimise meeldetuletused ja muud YouTube'i videote tüütud kohad. SponsorBlock on rahva ühistööna toimiv brauserilaiendus, mis lubab igaühel saata sponsoreeritud segmendi algus- ja lõpuaegu ning teiste video segmentide aegu. Kui üks inimene saadab sponsoreeritud segmendi, jätavad teised laienduse kasutajad kohe selle vahele. Laiendus võimaldab ka muusikavideotel mitte-muusika jaotised vahele jätta.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +287,17 @@
|
||||
"skip_category": {
|
||||
"message": "Jätad {0} vahele?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Jäta {0}-ni vahele?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "vahelejäetud"
|
||||
"message": "{0} vahelejäetud",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0}-ni vahelejäetud",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Keela automaatne vahelejätmine"
|
||||
@@ -344,12 +359,6 @@
|
||||
"createdBy": {
|
||||
"message": "Autor"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Autom. vahelejätmine"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Kuva segmendi vahelejätmisel teatis"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Hetkel on selleks määratud:"
|
||||
},
|
||||
@@ -541,14 +550,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Mitte-muusika"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Esiletõst"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Video osa, mida enamus inimesed otsivad. Sarnaneb kommentaaridele stiilis \"video algab ajal x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Otseülekanne: annetuste ja sõnumite lugemine"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Sõnumite lugemine"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Keela"
|
||||
"autoSkip": {
|
||||
"message": "Autom. vahelejätmine"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Käsitsi vahelejätmine"
|
||||
@@ -556,6 +571,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Kuva mängija ajaribal"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Keela"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Jäta automaatselt alguseni vahele"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Küsi video laadimisel"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Kuva mängija ajaribal"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Jäta automaatselt kõik segmendid vahele, kui eksisteerib mitte-muusika segment"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Sinu värv on sobimatult vormistatud. See peaks olema 3- või 6-numbriline 16-kümmendsüsteemis kood, arvu ees trellid."
|
||||
},
|
||||
@@ -666,11 +696,9 @@
|
||||
"help": {
|
||||
"message": "Abi"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Aita video kadumist vältida"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "See video tuvastati kui registriväline ning see laaditi üles enne 2017. aastat.\nVanad registrivälised videod muudetakse järgmisel kuul privaatseks.\nMe kogume varundamiseks *avalikke* videoid, \nkas sooviksid anonüümselt selle video meile saata?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Sain aru",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Keeldu kõigist tulevikus tehtavatatest eksperimentidest",
|
||||
@@ -678,5 +706,27 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Peida igaveseks"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Sa said hoiatuse ning ei saa ajutiselt segmente saata. See tähendab, et me leidsime sind tegemast teatud sagedasi, mitte-pahatahtlikke vigu, ning soovime sulle meie reegleid täpsustada (inglise keeles). Sa võid selle vestlusega liituda ka discord.gg/SponsorBlock või matrix.to/#/+sponsor:ajay.app kaudu."
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Hääletus hoiatuse tõttu tagasilükatud. Klõpsa, et avada selle lahendamiseks vestlus või tule hiljem tagasi, kui aega saad.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Anneta"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Peida annetuste link"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Täname SponsorBlocki paigaldamise eest."
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Tiitrid"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Lisateave"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"message": "Tämä on jo lähetetty aiemmin"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanava lisätty valkoiselle listalle!"
|
||||
"message": "Kanava lisätty valkolistalle!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmentti"
|
||||
@@ -41,7 +41,7 @@
|
||||
"message": "Ladataan..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Älä Näytä Koskaan"
|
||||
"message": "Älä näytä koskaan"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Paina 'älä ohita' mennäksesi takaisin kohtaan jossa olit."
|
||||
@@ -77,14 +77,17 @@
|
||||
"message": "Segmentti alkaa nyt"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Segmentti Päättyy Nyt"
|
||||
"message": "Segmentti päättyy nyt"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Peruuta Segmentin Luominen"
|
||||
"message": "Peruuta segmentin luominen"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube-videota ei löytynyt.\nJos tämä on väärässä, päivitä välilehti."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Päivitä segmentit"
|
||||
},
|
||||
"success": {
|
||||
"message": "Onnistui!"
|
||||
},
|
||||
@@ -101,16 +104,16 @@
|
||||
"message": "Haluatko lähettää segmentit videotunnukselle"
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Tyhjennä Segmentit"
|
||||
"message": "Tyhjennä segmentit"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Avaa SponsorBlock-ponnahdusikkuna"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Sulje Ponnahdusikkuna"
|
||||
"message": "Sulje ponnahdusikkuna"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Lähetä Segmentit"
|
||||
"message": "Lähetä segmentit"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Haluatko varmasti lähettää tämän?"
|
||||
@@ -122,7 +125,7 @@
|
||||
"message": "Poista kanava valkolistalta"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Äänestä Segmenttiä"
|
||||
"message": "Äänestä segmenttiä"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Lähetykset"
|
||||
@@ -137,7 +140,7 @@
|
||||
"message": "Lähetä"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Osien muokkaus ilmestyy sen jälkeen, kun klikkaat lähetä-nappia",
|
||||
"message": "Osien muokkaus ilmestyy sen jälkeen, kun klikkaat lähetä-painiketta",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
@@ -159,7 +162,7 @@
|
||||
"message": "Aseta käyttäjänimi"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Liity mukaan viralliseen discord-palvelimeen, jotta voit antaa ehdotuksia ja palautetta!"
|
||||
"message": "Liity mukaan viralliselle Discord-palvelimelle, jotta voit antaa ehdotuksia ja palautetta!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Piilota tämä"
|
||||
@@ -168,7 +171,7 @@
|
||||
"message": "Asetukset"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Näytä Painikkeet YouTuben Soittimessa"
|
||||
"message": "Näytä painikkeet YouTuben soittimessa"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Piilota painikkeet YouTuben soittimessa"
|
||||
@@ -177,7 +180,7 @@
|
||||
"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"
|
||||
"message": "Näytä info-painike YouTuben soittimessa"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Piilota info-painike YouTuben soittimessa"
|
||||
@@ -192,25 +195,25 @@
|
||||
"message": "Piilota poista-painike YouTuben soittimessa"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Näytä Poista-Painike YouTuben Soittimessa"
|
||||
"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."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Ota Ohitusten Lukumäärän Seuranta Käyttöön"
|
||||
"message": "Ota ohitusten lukumäärän seuranta käyttöön"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Tämä toiminto seuraa, mitä segmenttejä olet ohittanut. Sen avulla käyttäjät saavat tietää, kuinka paljon heidän lähetyksensä ovat auttaneet muita, ja sitä käytetään myös mittarina äänestysten kanssa estääksemme spämmin pääsyn tietokantaan. Laajennus lähettää viestin palvelimelle aina, kun ohitat segmentin. Toivottavasti useimmat eivät muuta tätä asetusta, jotta katselunumerot pysyisivät tarkkoina. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Ota Ohitusten Lukumäärän Seuranta Käyttöön Yksityis-/Incognito-välilehdissä"
|
||||
"message": "Ota ohitusten lukumäärän seuranta käyttöön yksityis-/incognito-välilehdissä"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Kysely Tiiviste-etuliittellä"
|
||||
"message": "Kysely tiiviste-etuliittellä"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Kokonaisen videon ID:n lähettämisen sijaan ID:n hashin 4 ensimmäistä merkkiä lähetetään. Palvelin lähettää takaisin dataa kaikista videoista, joilla on vastaavat hashit."
|
||||
"message": "Sen sijaan, että videoID:tä käyttäen pyydettäisiin segmenttejä palvelimelta, videoID:n tiivisteen 4 ensimmäistä merkkiä lähetetään. Tämä palvelin lähettää takaisin dataa kaikista videoista, joilla on samankaltaiset tiivisteet."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Hae segmentit uudelleen uusissa videoissa"
|
||||
@@ -219,10 +222,28 @@
|
||||
"message": "Jos video on uusi, eikä segmenttejä löydy, niitä haetaan uudelleen muutaman minuutin välein katsoessasi."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Näytä Huomautus Uudelleen"
|
||||
"message": "Näytä ilmoitus uudelleen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Näytä ilmoitus ohitetun segmentin jälkeen"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Täysikokoiset ohitusilmoitukset"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Pienet ohitusilmoitukset automaattiselle ohitukselle"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Kaikki pienet ohitusilmoitukset"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Haalistuneet ohitusilmoitukset automaattiselle ohitukselle"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Kaikki haalistuneet ohitusilmoitukset"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on joukkoistettu selainlaajennus, jonka avulla kuka tahansa voi lähettää sponsoroitujen ja muiden Youtube-videoiden segmenttien aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun segmentin. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
|
||||
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on joukkoistettu selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden segmenttien aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun segmentin. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
@@ -248,13 +269,13 @@
|
||||
"message": "Aseta pikanäppäin segmentin aloittamiseen/lopettamiseen"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Aseta näppäin tietojen lähetykseen"
|
||||
"message": "Aseta pikanäppäin tietojen lähetykseen"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Valitse näppäin painamalla sitä"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Näppäinmääritys on asetettu näppäimeen: "
|
||||
"message": "Pikanäppäin on asetettu näppäimeen: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla."
|
||||
@@ -266,7 +287,7 @@
|
||||
"message": "Ohitus on poistettu käytöstä"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Sinun työsi",
|
||||
"message": "Työsi",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Ohita {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Ohita {0}an?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Ohitettu"
|
||||
"message": "{0} ohitettu",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Ohitettiin {0}an",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Poista automaattinen ohitus käytöstä"
|
||||
@@ -291,7 +321,7 @@
|
||||
"message": "Ota automaattinen ohitus käyttöön"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Äänellinen Ilmoitus Ohitettaessa"
|
||||
"message": "Ääni-ilmoitus ohitettaessa"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Ääni-ilmoitus ohittaessa toistaa äänen kun segmentti ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta."
|
||||
@@ -309,13 +339,13 @@
|
||||
"message": "Olet säästänyt itseltäsi "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuutti"
|
||||
"message": "minuutin"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "minuuttia"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "tunti"
|
||||
"message": "tunnin"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "tuntia"
|
||||
@@ -330,7 +360,7 @@
|
||||
"message": "Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Tuo/vie sinun UserID:si"
|
||||
"message": "Tuo/vie UserID:si"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Tämä tulisi pitää yksityisenä. Tämä on kuin salasana eikä sitä pitäisi jakaa kenellekään. Jos joku saa tämän, hän voi esiintyä sinuna."
|
||||
@@ -344,30 +374,24 @@
|
||||
"createdBy": {
|
||||
"message": "Luonut"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Ohita Automaattisesti"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Näytä ilmoitus ohitetun segmentin jälkeen"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Tällä hetkellä se on asetettu:"
|
||||
"message": ". Tällä hetkellä se on asetettu näppäimeen:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Tue Kolmansien Osapuolien YouTube-sivustoja"
|
||||
"message": "Tue kolmansien osapuolien YouTube-sivustoja"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Tue kolmannen osapuolen YouTube-asiakasohjelmia. Jotta voit ottaa käyttöön tuen, sinun täytyy hyväksyä lisäkäyttöoikeudet. Tämä EI toimi incognitossa Chromessa ja muissa Chromium varianteissa.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Tuetut Sivustot: "
|
||||
"message": "Tuetut sivustot: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Ota käyttöön Invidious tuki, poista käytöstä automaattinen ohitus, piilota painikkeet ja muuta."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Lisää Kolmannen Osapuolen Asiakasohjelmainstanssi"
|
||||
"message": "Lisää kolmannen osapuolen asiakasohjelmainstanssi"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Lisää mukautettu instanssi. Tämän täytyy olla formatoitu VAIN verkkotunnuksella. Esimerkki: invidious.ajay.app"
|
||||
@@ -400,7 +424,7 @@
|
||||
"message": "Ohitusimoitus pysyy näytöllä ainakin näin kauan.\nManuaalisella ohituksella se saattaa pysyä pitempäänkin."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?"
|
||||
"message": "Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty, ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Näytä lähetä-painike"
|
||||
@@ -409,7 +433,7 @@
|
||||
"message": "Tämä painike ilmestyy YouTube-soittimeen, kun olet valinnut aikaleiman ja olet valmis lähettämään sen."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock Palvelimen Osoite"
|
||||
"message": "SponsorBlock-palvelimen osoite"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "Osoite, jota SponsorBlock käyttää lähettääkseen kutsuja palvelimelle.\nEllei sinulla ole omaa palvelininstanssia, tätä ei pitäisi muuttaa."
|
||||
@@ -445,10 +469,10 @@
|
||||
"message": "Tämä JSON ei ole muotoiltu oikein. Asetuksiasi ei ole muutettu."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Lähetä kohta"
|
||||
"message": "Lähetä segmentti"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Jatka"
|
||||
"message": "Lähetä"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Peruuta"
|
||||
@@ -469,7 +493,7 @@
|
||||
"message": "Muokkaa"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "Kopioi Vianetsintätiedot Leikepöydälle"
|
||||
"message": "Kopioi vianetsintätiedot leikepöydälle"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "Kirjoittaminen leikepöydälle epäonnistui"
|
||||
@@ -497,7 +521,7 @@
|
||||
"message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai huikkauksille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Maksamaton/Itsensä Mainostus"
|
||||
"message": "Maksamaton/Itsensä mainostus"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."
|
||||
@@ -533,38 +557,59 @@
|
||||
"message": "Nopea kertaus aiemmista jaksoista, tai esikatselu siitä, mitä on tulossa myöhemmin nykyisessä videossa. Tarkoitettu yhteen editoituja klippejä varten, ei puhutuille yhteenvedoille."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musiikki: Ei-Musiikki-Osio"
|
||||
"message": "Musiikki: Musiikiton osa"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Vain musiikkivideoille. Tätä tulee käyttää vain musiikkivideoiden osissa, jotka eivät jo kuulu toiseen kategoriaan."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Ei-Musiikki"
|
||||
"message": "Musiikiton"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Kohokohta"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Kohta videossa, mitä suurin osa ihmisistä etsivät.\nSamankaltainen \"Video alkaa kohdassa x\" kommenttien kanssa."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: lahjoituksen/viestin lukeminen"
|
||||
"message": "Livestream: lahjoitusten/viestien lukeminen"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Viestin Lukeminen"
|
||||
"message": "Viestien lukeminen"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Poista käytöstä"
|
||||
"autoSkip": {
|
||||
"message": "Ohita automaattisesti"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manuaalinen ohitus"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Näytä Liukusäätimessä"
|
||||
"message": "Näytä liukusäätimessä"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Poista käytöstä"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Ohita automaattisesti alkuun"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Kysy kun video latautuu"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Näytä liukusäätimessä"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Ohita kaikki segmentit automaattisesti, kun videossa on \"Musiikiton\" segmentti"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Väriformaattisi on muotoiltu väärin. Sen pitäisi olla 3 tai 6 numeroinen hex-koodi, jossa on # alussa."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Lähettämättömien Väri",
|
||||
"message": "Lähettämättömien väri",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Siirtymispalkin Väri"
|
||||
"message": "Siirtymispalkin väri"
|
||||
},
|
||||
"category": {
|
||||
"message": "Kategoria"
|
||||
@@ -592,14 +637,14 @@
|
||||
"message": "Valitse kategoria"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Lähettääksesi segmenttejä kategorialla \"{0}\", sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
|
||||
"message": "Lähettääksesi segmenttejä \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Sinun täytyy valita kategoria kaikille segmenteille, jota olet lähettämässä!"
|
||||
"message": "Sinun täytyy valita kategoria kaikille segmenteille, joita olet lähettämässä!"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Päättyy)"
|
||||
"message": "(Loppu)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "piilotettu: miinusääniä"
|
||||
@@ -630,13 +675,13 @@
|
||||
"message": "Jos et pysty ratkaisemaan tätä, poista käytöstä asetus 'Pakota kanavan tarkistus ennen ohittamista', koska SponsorBlock ei pysty noutamaan tämän videon kanavatietoja"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Pakota Kanavan Tarkistus Ennen Ohittamista"
|
||||
"message": "Pakota kanavan tarkistus ennen ohittamista"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Oletuksena segmentit ohitetaan heti ennen kuin kanava tiedetään. Oletuksena jotkut segmentit videon alussa saattavat tulla ohitetuiksi sallituilla kanavilla. Tämän vaihtoehdon ottaminen käyttöön estää sen, mutta kaikki ohitukset viivästyvät hieman, koska kanavatunnuksen saaminen voi kestää jonkin aikaa. Tämä viive saattaa olla huomaamaton, jos sinulla on nopea internetyhteys."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Harkitse \"Pakota Kanavan Tarkistus Ennen Ohittamista\" käyttöön ottaminen"
|
||||
"message": "Harkitse asetuksen \"Pakota kanavan tarkistus ennen ohittamista\" käyttöön ottaminen"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Virheellinen/väärä aika"
|
||||
@@ -645,16 +690,16 @@
|
||||
"message": "Väärä kategoria"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on sen sijaan \"musiikiton segmentti\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän segmentin oikeassa kategoriassa. Lue ohjeistus, jos on lisää kysyttävää."
|
||||
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton segmentti\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän segmentin oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Useita kohtia"
|
||||
"message": "Useita segmenttejä"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Säännökset"
|
||||
"message": "Säännöt"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Lue Säännökset!!",
|
||||
"message": "Lue säännöt!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
@@ -666,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Ohje"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Auta estämään tätä katoamasta"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Tämä video on havaittu piilotetuksi ja se on ladattu YouTubeen ennen vuotta 2017\nVanhat piilotetut videot asetetaan yksityisiksi ensi kuussa\nKeräämme *julkisia* videoita varmuuskopioitavaksi\nHaluaisitko anonyymisti lähettää tämän videon meille?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Selvä",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Jättäydy pois kaikista tulevista kokeiluista",
|
||||
@@ -678,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Piilota ikuisesti"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Sait varoituksen ja et voi lähettää segmenttejä väliaikaisesti. Tämä tarkoittaa, että huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahallisia, ja haluamme vain selventää säännöt. Voit myös liittyä tähän keskusteluun käyttäen discord.gg/SponsorBlock tai matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Ääni hylättiin varoituksen takia. Klikkaa avataksesi chatin sen ratkaisemiseksi, tai tule takaisin myöhemmin kun sinulla on siihen aikaa.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Lahjoita"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Piilota lahjoituslinkki"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Kiitos, että asensit SponsorBlockin."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Tarkista alla olevat vaihtoehdot kiitos"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Monet ominaisuudet ovat oletuksena pois päältä. Jos haluat ohittaa introt, outrot, käyttää Invidiousta, jne., ota ne käyttöön alhaalla. Voit myös piilottaa/näyttää käyttöliittymäelementtejä."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Miten ohittaminen toimii"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Videosegmentit ohitetaan automaattisesti, jos ne löytyvät tietokannasta. Voit avata ponnahdusikkunan klikkaamalla laajennuksen kuvaketta saadaksesi esikatselun siitä, mitä ne ovat."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Aina kun ohitat segmentin, saat ilmoituksen. Jos ajoitus näyttää väärältä, äänestä alaspäin klikkaamalla 👎! Voit myös äänestää ponnahdusikkunassa."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Lähettäminen"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Lähettäminen voidaan tehdä joko ponnahdusikkunassa painamalla \"Segmentti alkaa nyt\" -painiketta tai videosoittimessa olevilla painikkeilla."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Toistopainikkeen klikkaaminen osoittaa segmentin alun ja pysäytyskuvakkeen klikkaaminen sen lopun. Voit valmistella useita sponsoreita ennen kuin painat lähetä. Lähetä-painikkeen klikkaaminen lähettää segmentin. Roskakorin klikkaaminen poistaa."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Muokkaus"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Jos jokin meni pieleen, voit muokata tai poistaa segmenttisi ylänuolipainikkeen klikkaamisen jälkeen."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Tämä on liian hidasta"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Voit käyttää pikanäppäimiä jos haluat. Paina puolipiste näppäintä merkitäksesi sponsori segmentin alun/lopun, ja paina heittomerkkiä lähettääksesi sen. Nämä voidaan vaihtaa asetuksista. Jos et käytä QWERTYä, sinun varmaan kannattaisi vaihtaa pikanäppäimet."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Voinko saada kopion tietokannasta? Mitä tapahtuu, jos katoat?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Tietokanta on julkinen ja saatavilla osoitteessa"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Lähdekoodi on vapaasti saatavilla. Joten, vaikka jotain tapahtuisi minulle, sinun lähetyksesi eivät katoa."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Uutiset ja miten se on tehty"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Mistä voin saada lähdekoodin?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Tekijät"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Uutta! Pääse videon asiaan yhdellä klikkauksella uudella kohokohta kategorialla"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Opi lisää"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet si il est censé y en avoir une."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Rafraîchir les segments"
|
||||
},
|
||||
"success": {
|
||||
"message": "Succès !"
|
||||
},
|
||||
@@ -185,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "Il s'agit du bouton qui ouvre l'encart sur la page YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Masquer Automatiquement Le Button Info"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Cacher le bouton Supprimer sur le lecteur YouTube"
|
||||
},
|
||||
@@ -204,13 +210,13 @@
|
||||
"message": "Activer le suivi du nombre de sauts dans les onglets privés/incognito"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Requête avec seulement le début du hash"
|
||||
"message": "Requête par préfixe du hash"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Au lieu de demander des segments au serveur à l'aide de l'identifiant de la vidéo, les 4 premiers caractères du hash de l'identifiant de la vidéo sont envoyés. Ce serveur renverra les données pour toutes les vidéos ayant des hash similaires."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Re-récupérer les segments sur les nouvelles vidéos"
|
||||
"message": "Récupérer les segments sur les nouvelles vidéos"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Si la vidéo est nouvelle et qu'aucun segment n'a été trouvé, ils seront réactualisés toutes les quelques minutes pendant le visionnage."
|
||||
@@ -218,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Afficher la notification"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Notifier après qu'un segment ait été sauté"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock vous permet de passer les sponsors, les intros, les outros, les rappels d'abonnement et autres parties ennuyeuses des vidéos YouTube. SponsorBlock est une extension de navigateur qui permet à n'importe qui de soumettre les temps de début et de fin des segments sponsorisés et d'autres segments de vidéos YouTube. Une fois qu'une personne a soumis ces informations, toutes les autres personnes possédant cette extension passeront directement les segments sponsorisés. Vous pouvez également sauter les sections non musicales des vidéos musicales.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -278,9 +287,6 @@
|
||||
"skip_category": {
|
||||
"message": "Passer {0} ?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Passé"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Désactiver le passage automatique"
|
||||
},
|
||||
@@ -341,15 +347,16 @@
|
||||
"createdBy": {
|
||||
"message": "Créé par"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Passage automatique"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Notifier après qu'un segment ait été sauté"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Il est actuellement réglé sur :"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Support de YouTube-Sites tierces"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Support de clients YouTube tierces. Pour habiliter le support, vous devez accepter les autorisations supplémentaires. Cela ne fonctionne PAS en incognito sur Chrome et d'autres variantes de Chromium.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Sites pris en charge : "
|
||||
},
|
||||
@@ -359,6 +366,9 @@
|
||||
"addInvidiousInstance": {
|
||||
"message": "Ajouter une instance de client tiers"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Ajouter une instance personnalisée. Elle doit être formaté avec SEULEMENT le domaine. Exemple: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Ajouter"
|
||||
},
|
||||
@@ -380,6 +390,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Les segments plus courts que la valeur fixée ne seront pas sautés ou affichés dans le lecteur."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Durée du saut de segment (secondes):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "L'avis du saut restera à l'écran pendant au moins aussi longtemps. Pour passer manuellement, il peut être visible plus longtemps."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Le segment suivant est plus court que votre option de durée minimale. Cela pourrait signifier qu'il est déjà soumis, et just ignoré par cette option. Êtes-vous sûr de vouloir soumettre ?"
|
||||
},
|
||||
@@ -510,6 +526,9 @@
|
||||
"category_preview": {
|
||||
"message": "Aperçu/Résumé"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Résumé rapide des épisodes précédents, ou aperçu de ce qui se passera plus tard dans la vidéo en cours. Pour les plans collectifs édités, pas pour les résumés parlés."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musique : Segment non musical"
|
||||
},
|
||||
@@ -525,8 +544,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Lecture de messages"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Désactiver"
|
||||
"autoSkip": {
|
||||
"message": "Passage automatique"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Passer manuellement"
|
||||
@@ -534,6 +553,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Afficher dans la barre de progression"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Désactiver"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -643,5 +665,12 @@
|
||||
},
|
||||
"help": {
|
||||
"message": "Aide"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Se désinscrire de toutes les futures expériences",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Cacher pour toujours"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,10 +183,10 @@
|
||||
"createdBy": {
|
||||
"message": "נוצר על ידי"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "דילוג אוטומטי"
|
||||
},
|
||||
"add": {
|
||||
"message": "הוסף"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "דילוג אוטומטי"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -131,6 +131,9 @@
|
||||
"Options": {
|
||||
"message": "Opcije"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Pokaži obavijest nakon preskakanja isječka"
|
||||
},
|
||||
"website": {
|
||||
"message": "Web-stranica",
|
||||
"description": "Used on Firefox Store Page"
|
||||
@@ -158,9 +161,6 @@
|
||||
"skip_category": {
|
||||
"message": "Preskočiti {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Preskočeno"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Deaktiviraj automatsko preskakanje"
|
||||
},
|
||||
@@ -191,12 +191,6 @@
|
||||
"createdBy": {
|
||||
"message": "Izradio"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatsko preskakanje"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Pokaži obavijest nakon preskakanja isječka"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Trenutno je postavljeno na:"
|
||||
},
|
||||
@@ -290,6 +284,9 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Ne-glazbeni"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatsko preskakanje"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Ručno preskakanje"
|
||||
},
|
||||
|
||||
@@ -79,9 +79,15 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Szegmens vége"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Szegmens Készítés Visszavonása"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nem találtunk YouTube videót.\nHa ez helytelen, frissítsd a lapot."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Szegmensek frissítése"
|
||||
},
|
||||
"success": {
|
||||
"message": "Siker!"
|
||||
},
|
||||
@@ -124,12 +130,22 @@
|
||||
"Submissions": {
|
||||
"message": "Beküldések"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Megspóroltál másoknak "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Ranglista"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Küldés"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "A szegmens szerkesztés azután fog megjelenni miután a közzétételre kattintasz",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Tipp: A beállításokban készíthetsz gyorsbillentyűket a közzétetelhez"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Időpontok törlése"
|
||||
},
|
||||
@@ -172,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "Ez a gomb felhoz egy felugró dobozt a YouTube oldalon."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Automatikus elrejtése az Információ Gombnak"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Törlés gomb elrejtése a YouTube lejátszón"
|
||||
},
|
||||
@@ -202,6 +221,9 @@
|
||||
"showNotice": {
|
||||
"message": "Értesítés megjelenítése ismét"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Jelezzen, ha egy szegmens át lett ugorva"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "A SponsorBlock-al átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé tesz bárkit arra, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Ha megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a zene videók nem-zene részei is átugorhatóak.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -222,6 +244,9 @@
|
||||
"message": "Ha még mindig nem tetszik, kattintson a ne mutassa többé gombra.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Billentyű beállítása szegmens átugráshoz"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Billentyű beállítása a beküldés gombhoz"
|
||||
},
|
||||
@@ -256,9 +281,6 @@
|
||||
"skip_category": {
|
||||
"message": "Átugorja ezt: {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Átugorva"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Auto átugrás kikapcsolása"
|
||||
},
|
||||
@@ -277,6 +299,9 @@
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Ez az idő zárójelben jelenik meg az aktuális idő mellett a keresősáv alatt. Megmutatja a videó teljes időtartamát, levonva a szegmenseket. Beletartoznak a csak \"Megjelenítés a keresősávban\" jelöléssel ellátott szegmensek is."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Átugrottál "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Megtakarított magának "
|
||||
},
|
||||
@@ -292,6 +317,9 @@
|
||||
"hoursLower": {
|
||||
"message": "óra"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Megspóroltál másoknak"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " az életükből"
|
||||
},
|
||||
@@ -313,15 +341,12 @@
|
||||
"createdBy": {
|
||||
"message": "Készítette"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Auto átugrás"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Jelezzen, ha egy szegmens át lett ugorva"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Jelenleg erre van állítva:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Harmadik fél Youtube oldalainak támogatása"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Invidious támogatás engedélyezése, autoátugrás kikapcsolása, gombok eltűntetése és több."
|
||||
},
|
||||
@@ -482,8 +507,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Üzenet beolvasása"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Kikapcsol"
|
||||
"autoSkip": {
|
||||
"message": "Auto átugrás"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Átugrás manuálisan"
|
||||
@@ -491,6 +516,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Megjelenítés a keresősávban"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Kikapcsol"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "A szín helytelenül van formázva. Egy 3 vagy 6 számjegyből álló hex kódnak kell lennie egy kettőskereszttel az elején."
|
||||
},
|
||||
@@ -530,6 +558,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "elrejtve: túl rövid"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Engedély jóváhagyása"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Csatorna ellenőrzése átugrás előtt"
|
||||
},
|
||||
@@ -563,5 +594,8 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Nyissa meg a beállításokat, hogy átugorhasson introkat, outrokat stb."
|
||||
},
|
||||
"help": {
|
||||
"message": "Segítség"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,6 +218,9 @@
|
||||
"showNotice": {
|
||||
"message": "Tampilkan Pemberitahuan Lagi"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Tampilkan pemberitahuan setelah melewati segmen"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock membuat anda melewati sponsor, intro, outro, pengingat berlangganan dan segmen mengganggu lainnya di video YouTube. SponsorBlock adalah ekstensi browser crowdsourced yang membolehkan siapa saja mengirim waktu awal dan akhir dari segmen sponsor dan segmen video YouTube lainnya. Setelah seseorang mengirim informasi ini, orang lain yang memakai ekstensi ini akan melewati segmen sponsor di video yang sama. Anda juga dapat melewati bagian non-musik di musik video.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -278,9 +281,6 @@
|
||||
"skip_category": {
|
||||
"message": "Lewati {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Dilewati"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Nonaktifkan Lewati Otomatis"
|
||||
},
|
||||
@@ -341,12 +341,6 @@
|
||||
"createdBy": {
|
||||
"message": "Dibuat Oleh"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Lewati Otomatis"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Tampilkan pemberitahuan setelah melewati segmen"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Saat ini diatur pada:"
|
||||
},
|
||||
@@ -513,8 +507,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Membaca Pesan Chat"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Nonaktif"
|
||||
"autoSkip": {
|
||||
"message": "Lewati Otomatis"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Lewati Manual"
|
||||
@@ -522,6 +516,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Tampilkan Di Bilah Waktu"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Nonaktif"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Warna anda tidak diformat dengan benar. Harusnya terdiri dari 3 atau 6 digit kode heksa dengan tagar di awal."
|
||||
},
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Nessun video YouTube trovato.\nSe è un errore, ricarica la scheda."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Ricarica i segmenti"
|
||||
},
|
||||
"success": {
|
||||
"message": "Successo!"
|
||||
},
|
||||
@@ -141,7 +144,7 @@
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Suggerimento: Puoi configurare dei comandi rapidi per l'inserimento nelle opzioni"
|
||||
"message": "Suggerimento: puoi configurare dei comandi rapidi nelle opzioni"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Cancella Minutaggi"
|
||||
@@ -185,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "Questo è il pulsante che apre un popup nella pagina YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Nascondi in automatico il Pulsante di Informazioni"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Nascondi il Pulsante Elimina nel Lettore di YouTube"
|
||||
},
|
||||
@@ -218,6 +224,24 @@
|
||||
"showNotice": {
|
||||
"message": "Mostra di Nuovo l'Avviso"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostra Avviso Dopo Aver Saltato un Segmento"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Salta Avvisi di Dimensioni Complete"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Piccoli Salta Avvisi per Salto Automatico"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Tutti i Piccoli Salta Avvisi"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Salta Avvisi Offuscati per Salto Automatico"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Tutti i Salta Avvisi Offuscati"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock ti consente di saltare sponsorizzazioni, introduzioni, conclusioni, promemoria di iscrizione e altre componenti fastidiose dei video su YouTube. SponsorBlock è un'estensione per browser in crowdsourcing, che consente a chiunque di inviare l'ora di inizio e di fine dei segmenti sponsorizzati e altri segmenti video su YouTube. Quando una persona invia queste informazioni, chiunque altro in possesso di questa estensione sarà in grado di saltare direttamente il segmento sponsorizzato. È possibile saltare anche le sezioni non musicali dei video musicali.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -257,10 +281,10 @@
|
||||
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Saltare è abilitato"
|
||||
"message": "Abilitato"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "Saltare è disabilitato"
|
||||
"message": "Disabilitato"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Il Tuo Lavoro",
|
||||
@@ -278,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Vuoi saltare {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Saltare a {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Saltato"
|
||||
"message": "{0} Saltato",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Saltato a {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Disabilita Salto Automatico"
|
||||
@@ -341,12 +374,6 @@
|
||||
"createdBy": {
|
||||
"message": "Creato da"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Salta Automaticamente"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostra Avviso Dopo Aver Saltato un Segmento"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Attualmente è impostato su:"
|
||||
},
|
||||
@@ -390,6 +417,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "I segmenti più brevi del valore impostato non verranno saltati o visualizzati nel lettore."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Salta durata avviso (secondi):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "L'avviso salta rimarrà sullo schermo per almeno questo tempo. Per saltarlo manualmente, potrebbe esser visibile più a lungo."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Il seguente contributo è più breve della tua opzione di durata minima. Ciò potrebbe significare che questo è già stato inviato e viene semplicemente ignorato a causa di questa opzione. Sei sicuro di voler inviare?"
|
||||
},
|
||||
@@ -532,14 +565,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Musicale"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Evidenzia"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "La parte del video che gran parte delle persone stanno cercando. Simile ai commenti \"Il video inizia a x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Donazione/Letture dei Messaggi"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Lettura Messaggi"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Disattiva"
|
||||
"autoSkip": {
|
||||
"message": "Salta Automaticamente"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Salto Manuale"
|
||||
@@ -547,6 +586,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Mostra nella Barra di Ricerca"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Disattiva"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Salta automaticamente all'avvio"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Chiedi quando il video carica"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Mostra Nella Barra di Ricerca"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Salta automaticamente tutti i segmenti quando c'è un segmento non musicale"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Il tuo colore è formattato in modo errato. Dovrebbe essere un codice esadecimale a 3 o 6 cifre con un segno numerico iniziale."
|
||||
},
|
||||
@@ -657,7 +711,91 @@
|
||||
"help": {
|
||||
"message": "Aiuto"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Capito",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Disiscriviti dagli esperimenti futuri",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Nascondi per sempre"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Hai ricevuto un ammonimento and non puoi inviare segmenti temporaneamente. Ciò significa che abbiamo notato che stavi commettendo alcuni errori comuni senza scopo malevolo, e vogliamo che tu ricontrollassi le regole. Puoi anche partecipare a questa chat su discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Voto rifiutato a causa di un ammonimento. Clicca per aprire una chat per risolverlo, oppure torna dopo quando hai tempo.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Dona"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Nascondi Link di Donazione"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Grazie per aver installato SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Sei pregato di revisionare le seguenti opzioni"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Molte funzionalità sono disabilitate di default. Se vuoi saltare intro, outro, usare Invidious, etc. abilitale sotto. Puoi anche nascondere/mostrare gli elementi dell'UI."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Come funziona il salto"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "I segmenti video saranno automaticamente ignorati se sono trovati nel database. Puoi aprire il popup cliccando l'icona dell'estensione per ottenere un'anteprima di cosa sono."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Ogni volta che salti un segmento, sarai avvisato. Se il momento sembra sbagliato, vota in negativo cliccando downvote! Puoi anche votare nel popup."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Inviando"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "L'invio può esser eseguito nel popup cliccando il pulsante il \"Segmento Inizia Ora\" o nel lettore video con i pulsanti sul lettore."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Cliccare il pulsante di riproduzione indica l'inizio di un segmento e cliccare l'icona di interruzione indica la fine. Puoi preparare più sponsor prima di cliccare invio. Cliccare il pulsante carica invierà. Cliccare il cestino eliminerà."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Modifica"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Se hai fatto casino, puoi modificare o eliminare i tuoi segmenti dopo aver cliccato il pulsante della freccia in su."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Questo è troppo lento"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Esistono dei tasti di scelta rapida se desideri usarli. Premi il tasto del punto e virgola per indicare l'inizio/la fine di un segmento dello sponsor e clicca l'apostrofo per inviare. Questi sono modificabili nelle opzioni. Se non usi QWERTY, dovresti probabilmente cambiare l'associazione dei tasti."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Posso ottenere una copia del Database? Che succede se scompari?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Il database è pubblico e disponibile a"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Il codice sorgente è liberamente disponibile. Quindi, anche se mi succede qualcosa, i tuoi contributi non saranno persi."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Notizie e come è fatto"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Dove posso ottenere il codice sorgente?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Crediti"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novità! Vai al punto del video con un click con la nuova categoria d'evidenziazione"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Scopri di Più"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,16 +23,16 @@
|
||||
"message": "セグメント"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "区域"
|
||||
"message": "セグメント"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "この提案を支持する"
|
||||
"message": "この提案を支持"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "報告"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "この提案が正しくないことを報告する。"
|
||||
"message": "この提案が正しくないと報告"
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "無視"
|
||||
@@ -44,10 +44,10 @@
|
||||
"message": "非表示"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "元の場所に戻るには「スキップを取り消す」をクリックしてください。"
|
||||
"message": "スキップ解除を押すと元の場所へ戻ります"
|
||||
},
|
||||
"unskip": {
|
||||
"message": "スキップを取り消す"
|
||||
"message": "スキップ解除"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "再スキップ"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "YouTube動画が見つかりませんでした。\nこれが正しくない場合は、タブを再読み込みしてください。"
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "区域を更新"
|
||||
},
|
||||
"success": {
|
||||
"message": "成功しました!"
|
||||
},
|
||||
@@ -95,7 +98,7 @@
|
||||
"message": "サーバーがダウンしているようです。今すぐ開発者にお知らせください。"
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "接続エラーが発生しました。エラーコード: "
|
||||
"message": "接続エラーが発生しました。 エラーコード: "
|
||||
},
|
||||
"wantToSubmit": {
|
||||
"message": "次の動画IDで提出します:"
|
||||
@@ -116,35 +119,35 @@
|
||||
"message": "本当に提出してよろしいですか?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "許可表にある番組"
|
||||
"message": "ホワイトリストのチャンネル"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "許可表から番組を削除"
|
||||
"message": "ホワイトリストからチャンネルを削除"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "セグメントに投票"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "提出数"
|
||||
"message": "提案数"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "次のセグメント数から人々を救いました: "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "投票結果"
|
||||
"message": "リーダーボード"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "送信"
|
||||
"message": "提出"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "提出をクリックするとセクション編集画面が表示されます",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "心得: 利用者設定で,提出用の鍵盤束縛を設定できます"
|
||||
"message": "心得: 利用者設定で提出時のキーバインドを設定できます"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "時間をクリア"
|
||||
"message": "時間を消去"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "時間を提出"
|
||||
@@ -153,10 +156,10 @@
|
||||
"message": "これは公開の統計ページであなたがどれだけ貢献したかを示すために使用され、ここで確認することができます: "
|
||||
},
|
||||
"Username": {
|
||||
"message": "利用者名"
|
||||
"message": "ユーザー名"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "利用者名を設定"
|
||||
"message": "ユーザー名を設定"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください!"
|
||||
@@ -192,19 +195,19 @@
|
||||
"message": "YouTube プレイヤーから削除ボタンを隠す"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube プレイヤーから削除ボタンを表示する"
|
||||
"message": "YouTubeプレーヤーに削除ボタンを表示"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "これはYouTube再生画面上のUIで,現在の動画から未提出の区域を全て消去します。"
|
||||
"message": "これはYouTubeプレーヤー上のボタンで、現在の動画から未提出のセグメントを全て消去します。"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "スキップ回数の統計を有効にする"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "この機能は、あなたが飛び越した区域を追跡して、当該区域がどれだけ役に立ったかを他の利用者に知らせることで、不正な情報が情報集合体に紛れないようにするための評価基準として使用されます。あなたが区域を飛び越すたびに、拡張機能はサーバーに通報を送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"
|
||||
"message": "この機能は、あなたがスキップしたセグメントを追跡して、そのセグメントがどれだけ役に立ったかを他のユーザーに知らせることで、スパムがデータベースに紛れないようにするための評価基準として使用されます。あなたがセグメントをスキップするたびに、拡張機能はサーバーにメッセージを送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "匿名閲覧状態で計数追跡を飛び越す"
|
||||
"message": "プライベート/シークレット タブでスキップカウントトラッキングを有効にする"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "ハッシュプレフィックスを使って要求"
|
||||
@@ -216,11 +219,29 @@
|
||||
"message": "新しい動画ではセグメントを再取得する"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "動画がまだ新しく区域が見つからない場合は、動画を視聴している間、数分おきに区域を検索し続けます。"
|
||||
"message": "動画がまだ新しくセグメントが見つからない場合は、動画を視聴している間、数分おきにセグメントを検索し続けます。"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "再度通知を表示する"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "セグメントがスキップされた後に通知を表示する"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "飛び越し通知(全体)"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "自動飛び越し通知(小)"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "すべての飛び越し通知(小)"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "表示の終了した自動飛び越し通知"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "表示の終了した全ての飛び越し通知"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -245,32 +266,32 @@
|
||||
"message": "セグメントをスキップするキーを設定"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "セグメントを開始するキーを設定"
|
||||
"message": "セグメントの開始/停止キーのバインドを設定"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "投稿する鍵束縛を設定"
|
||||
"message": "提案キーのバインドを設定"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "選択する鍵束縛を打鍵してください"
|
||||
"message": "キーを入力して設定します"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "鍵束縛を次の通り設定しました: "
|
||||
"message": "キーバインドは次のように設定されました: "
|
||||
},
|
||||
"0": {
|
||||
"message": "接続がタイムアウトになりました。インターネット接続をご確認ください。接続に問題がない場合、サーバーが混雑またはダウンしている可能性があります。"
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "スキップは有効です"
|
||||
"message": "スキップ有効"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "スキップは無効です"
|
||||
"message": "スキップ無効"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "あなたの貢献",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "サーバーが混雑中です。数秒後にもう一度お試しください。"
|
||||
"message": "サーバー側で問題が起きているようです。時間をおいて再び試してください。"
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "エラーコード: "
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "{0} をスキップしますか?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "{0}まで飛び越しますか?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "スキップしました"
|
||||
"message": "{0}を飛び越しました",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0}まで飛び越しました",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "自動スキップを無効にする"
|
||||
@@ -291,10 +321,10 @@
|
||||
"message": "自動スキップを有効にする"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "オーディオ通知をスキップ"
|
||||
"message": "スキップ時に通知音を鳴らす"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "スキップ時の音声通知は、セグメントがスキップされる毎に音を鳴らす機能です。無効 (または自動スキップが無効) の場合、音は再生されません。"
|
||||
"message": "セグメントがスキップされた時に音を鳴らします。 無効 (もしくは自動スキップが無効) の場合、音は再生されません。"
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "スキップした分を除いた時間を表示する"
|
||||
@@ -330,25 +360,19 @@
|
||||
"message": "サーバーの状態についてはstatus.sponsor.ajay.appを確認してください。"
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "利用者IDの読み込み・書き出し"
|
||||
"message": "ユーザーIDのインポート/エクスポート"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "これを公開してはいけません。これは暗証語のようなものであり,誰とも共有するべきではありません。これを持っている人はあなたになりすませてしまいます。"
|
||||
"message": "ユーザーIDは公開しないでください。これはパスワードのようなもので誰とも共有するべきではありません。 他の誰かが知った場合、あなたになりすます可能性があります。"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "利用者IDを設定"
|
||||
"message": "ユーザーIDを設定"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "警告: 利用者IDの変更は恒久的です。本当に実行しますか? 念のため,旧IDを控えておいてください。"
|
||||
"message": "警告: ユーザーIDの変更は恒久的です。本当に実行しますか? 念のため以前のユーザーIDは控えておいてください。"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "作成者"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "自動スキップ"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "セグメントがスキップされた後に通知を表示する"
|
||||
"message": "作成者:"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。現在の設定は:"
|
||||
@@ -367,7 +391,7 @@
|
||||
"message": "Invidious対応を有効にし,自動飛越を無効にし,GUIを非表示にします。"
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "第三者製クライアントの実体を追加"
|
||||
"message": "サードパーティーのクライアントインスタンスを追加"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "任意のインスタンスを追加できます。ドメイン名だけを記入してください。例: invidious.ajay.app"
|
||||
@@ -388,7 +412,7 @@
|
||||
"message": "現在のインスタンス:"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "飛越す最短の時間(秒):"
|
||||
"message": "最小持続時間(秒):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "設定値より短いセグメントはスキップされず、プレーヤーにも表示されません。"
|
||||
@@ -406,7 +430,7 @@
|
||||
"message": "アップロードボタンを表示"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "時刻印を選択し提出準備が整ったあとにYouTube再生機上に表示されます。"
|
||||
"message": "このボタンはタイムスタンプを選択して投稿の準備ができた後にYouTubeプレーヤーに表示されます。"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock サーバーアドレス"
|
||||
@@ -436,7 +460,7 @@
|
||||
"message": "JSON形式の個人設定全体です。利用者IDが含まれているので,共有するときは注意してください。"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "設定する"
|
||||
"message": "オプション設定"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "警告: 設定の変更は恒久的で,本拡張機能を破壊する可能性があります。本当に実行しますか? 念のため,旧設定を控えておいてください。"
|
||||
@@ -469,7 +493,7 @@
|
||||
"message": "編集"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "詳細情報をクリップボードに写す"
|
||||
"message": "デバッグ情報をクリップボードにコピー"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "クリップボードに書き込めませんでした"
|
||||
@@ -481,10 +505,10 @@
|
||||
"message": "診断用情報がクリップボードに複製されました。共有したくない情報があればそこから削除できます。これをファイルに保存したり,不具合報告に貼り付けてください。"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "鍵束縛"
|
||||
"message": "キー"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "は別の動作に割り当て済みです。違う鍵を設定してください。"
|
||||
"message": "は他の動作に割り当てられています。異なったキーを選択してください。"
|
||||
},
|
||||
"to": {
|
||||
"message": "~",
|
||||
@@ -533,22 +557,28 @@
|
||||
"message": "前回の粗筋,または動画の後半内容の予告。音声による要約ではなく,編集された映像を指します。"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "音楽: 音楽ではない区間"
|
||||
"message": "音楽: 音楽以外のセクション"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "MVでのみ使用できます。MVにおける飛び越したい場面のうち,他の範疇に該当しないものです。"
|
||||
"message": "ミュージックビデオでの使用に限ります。他のカテゴリーに含まれていないミュージックビデオのセクションにのみ使用してください。"
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "音楽以外の部分"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "強調表示"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "ほとんどの人が必要としている動画の箇所。「xx:xx 開始」というようなコメントと類似。"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "ライブ配信: 寄付/メッセージの読み上げ"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "寄付などの読み上げ"
|
||||
},
|
||||
"disable": {
|
||||
"message": "無効"
|
||||
"autoSkip": {
|
||||
"message": "自動スキップ"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "手動スキップ"
|
||||
@@ -556,8 +586,23 @@
|
||||
"showOverlay": {
|
||||
"message": "シークバーに表示"
|
||||
},
|
||||
"disable": {
|
||||
"message": "無効"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "動画の開始時刻まで飛び越し"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "動画を読み込んだ際に確認する"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "シークバーに表示"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "非音楽区域がある場合,全区域を自動的に飛び越す"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "色の書式が正しくありません。井桁記号に続く3桁あるいは6桁の16進数である必要があります。"
|
||||
"message": "カラーコードの書式が間違っています。 #から始まる3桁または6桁の16進数コードでなければなりません。"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "未確定の色",
|
||||
@@ -570,7 +615,7 @@
|
||||
"message": "カテゴリ"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "飛び越し設定",
|
||||
"message": "スキップ設定",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
@@ -621,16 +666,16 @@
|
||||
"message": "許可を承認する"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "許可要求が成功しました。"
|
||||
"message": "許可リクエストが成功しました!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "権限要求に失敗しました。承認を拒否しましたか?"
|
||||
"message": "権限要求に失敗しました。拒否をクリックしましたか?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "これを解決できない場合は,「飛び越し前に強制的に番組を検査する」を無効にしてください。SponsorBlockはこの動画の番組情報を取得できませんでした。"
|
||||
"message": "これを解決できない場合は、設定「スキップする前にチャンネルチェックを強制」を無効にしてください。 SponsorBlockはこのビデオのチャンネル情報を取得できません。"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "飛び越し前に強制的に番組を検査する"
|
||||
"message": "スキップする前にチャンネルチェックを強制する"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "デフォルト設定では、チャンネル情報を取得する前にセグメントをスキップします。デフォルト設定では、ホワイトリストに追加されているチャンネルでも動画の先頭部分にあるセグメントがスキップされる場合があります。この設定を有効にするとこの挙動が回避されますが、channelIDの取得に時間がかかるため、すべてのスキップに遅延が発生します。高速なインターネット回線を使用している場合は気にならないかもしれません。"
|
||||
@@ -664,13 +709,11 @@
|
||||
"message": "導入画面・終了画面・商品紹介などを飛び越す個人設定を開きます。"
|
||||
},
|
||||
"help": {
|
||||
"message": "手引き"
|
||||
"message": "ヘルプ"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "これが消えないようにできます。"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "この動画は2017年以前の限定公開動画のようです。\n古い限定公開動画は来月中に非公開にされます。\nSponsorBlockでは**公開されている**動画の情報を収集しています。\nこの動画をSponsorBlockに匿名で送信していただけますか?\n参考: https://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "了解",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "実験的機能をすべて無効にする",
|
||||
@@ -678,5 +721,57 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "二度と表示しない"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "警告のため,区域の送信が一時的に禁止されています。これは利用者さまが間違いを犯されているというこちらどもの判断ではありますが,この間違いが悪意あるものとは思っておりません。単に,利用者さまに区域送信における規則を知っていただきたいだけです。連絡先: discord.gg/SponsorBlock,matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "警告により投票が拒否されました。クリックして運営に連絡するか,少し時間を置いてからやりなおしてください。",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "寄付"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "寄付のお願いを表示しない"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "SponsorBlockを導入いただきありがとうございます。"
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "以下の設定を確認してください"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "多くの機能は既定では無効となっています。動画の導入部や最後の余計な部分を飛び越したい場合は「非本質的な内容」を飛び越すようにしてください。また,UI要素の表示・非表示を切り替えることもできます。"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "飛び越しの仕組み"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "データベースにある動画区域が自動的に飛び越されます。この拡張機能のアイコンをクリックすると,区域の位置や範囲を確かめることができます。"
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "区域を飛び越すたびに通知されます。区域の範囲がおかしいと思ったら,その区域を低評価してください。ポップアップ画面でも同様に投票ができます。"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "提出中"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "編集中"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "ソースコードは自由に利用できます。運営になにがあろうとも,あなたの貢献(提出された区域)が失われることはありません。"
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "お知らせと作成方法"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "ソースコードの入手先"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "謝辞"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "さらに詳しく"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "유튜브 동영상을 찾을 수 없습니다.\n오류라면, 탭을 새로고침해보세요."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "구간 새로고침"
|
||||
},
|
||||
"success": {
|
||||
"message": "성공!"
|
||||
},
|
||||
@@ -221,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "알림 다시 보여주기"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "구간을 건너뛴 후 알림 표시"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock을 사용하면 영상에서 스폰서 광고, 인트로 영상, 아웃트로 영상, 구독 광고와 그 외 쓸데없는 부분을 즉시 건너뛸 수 있습니다. SponsorBlock은 모든 사람들이 참여하는 브라우저 확장 기능으로 확장 기능 사용자는 스폰서 광고 또는 다른 광고의 시작 시간과 끝 시간을 확인하여 서버로 전송할 수 있습니다. 이러한 정보가 전송되면 그 영상을 보는 다른 사용자들은 광고 구간이 나오기 전에 자동으로 건너뛸 수 있습니다. SponsorBlock을 사용하면 뮤직 비디오에서 음악이나 노래가 아닌 구간도 건너뛸 수 있습니다.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +287,17 @@
|
||||
"skip_category": {
|
||||
"message": "{0} 을(를) 건너뛰겠어요?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "{0}(으)로 건너뛰겠어요?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "스킵됨"
|
||||
"message": "{0} 건너뜀",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0}(으)로 건너뛰었습니다",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "자동 스킵 비활성화"
|
||||
@@ -344,12 +359,6 @@
|
||||
"createdBy": {
|
||||
"message": "개발자: "
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "자동으로 건너뛰기"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "구간을 건너뛴 후 알림 표시"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". 현재 다음으로 설정되어 있습니다:"
|
||||
},
|
||||
@@ -541,14 +550,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "음악이 아닌 구간"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "하이라이트"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "대부분의 사람들이 찾는 동영상의 파트를 말합니다. \"바쁘신 분들은...\" 댓글과 유사합니다."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "라이브스트림: 후원/메시지 읽기"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "메시지 읽기"
|
||||
},
|
||||
"disable": {
|
||||
"message": "비활성화"
|
||||
"autoSkip": {
|
||||
"message": "자동으로 건너뛰기"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "수동 스킵"
|
||||
@@ -556,6 +571,21 @@
|
||||
"showOverlay": {
|
||||
"message": "재생 시간 바 표시"
|
||||
},
|
||||
"disable": {
|
||||
"message": "비활성화"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "시점으로 자동 건너뛰기"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "동영상을 불러왔을 때 묻기"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "재생 시간 바에 표시"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "음악이 아닌 구간이 있을 때는 모든 구간 자동 건너뛰기"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "올바르지 않은 색상 코드입니다. 색상 코드는 샵 (#) 기호로 시작하여 3자리 또는 6자리의 16진수로 구성되어야 합니다."
|
||||
},
|
||||
@@ -666,7 +696,76 @@
|
||||
"help": {
|
||||
"message": "도움"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "확인",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "향후 모든 실험 기능 비활성화",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "다시 보지 않음"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "현재 귀하가 악의적이지 않은 일반적인 실수를 저지르고 있음을 발견했습니다. 이에 따라 경고 조치가 내려져 일시적으로 구간을 제출할 수 없게 되었습니다. 저희는 단지 규칙을 명확히 전달하고자 합니다. discord.gg/SponsorBlock 또는 matrix.to/#/+sponsor:ajay.app 링크를 통해 대화에 참여할 수도 있습니다."
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "경고로 인해 투표가 거부되었습니다. 클릭하여 대화로 해결하거나, 나중에 시간이 나면 다시 오세요.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "후원"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "후원 링크 숨기기"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "SponsorBlock을 설치해 주셔서 감사드립니다."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "아래 설정들을 확인해 주세요"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "많은 기능들이 기본적으로 비활성화되어 있습니다. 인트로, 아웃트로나 기타 불필요한 부분을 건너뛰고 싶으시면 아래에서 설정을 켜세요. UI 요소를 볼 것인지 말 것인지도 선택하실 수 있습니다."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "건너뛰기가 작동하는 방법"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "데이터베이스에서 동영상 구간을 찾으면 이를 자동으로 건너뛸 것입니다. 확장 프로그램 아이콘을 눌러 팝업 창을 열면 어떤 것이 무엇인지 미리 확인할 수 있습니다."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "구간을 건너뛰면 알림을 받게 됩니다. 알림 팝업에서는 투표도 진행할 수 있습니다. 타이밍이 잘못되었다면 반대 아이콘을 눌러 반대 투표를 보낼 수 있습니다!"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "제출"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "\"광고 구간 시작\" 버튼을 누른 다음 팝업에서 제출할 수도 있으며 동영상 플레이어 내 버튼으로 제출할 수도 있습니다."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "수정"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "구간을 잘못 설정했다면, 위쪽 화살표 버튼을 누른 다음 구간을 편집하거나 삭제할 수 있습니다."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "너무 느립니다"
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "소식 및 제작 방법"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "소스 코드는 어디에서 볼 수 있나요?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "크레딧"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "새 기능! 새로운 하이라이트 카테고리를 통해 동영상의 중요 지점으로 이동하세요"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "더보기"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +212,9 @@
|
||||
"showNotice": {
|
||||
"message": "അറിയിപ്പ് വീണ്ടും കാണിക്കുക"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കിയതിനുശേഷം അറിയിപ്പ് കാണിക്കുക"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "സ്പോൺസർമാർ, ആമുഖങ്ങൾ, ros ട്ട്ട്രോകൾ, സബ്സ്ക്രിപ്ഷൻ ഓർമ്മപ്പെടുത്തലുകൾ, YouTube വീഡിയോകളുടെ മറ്റ് ശല്യപ്പെടുത്തുന്ന ഭാഗങ്ങൾ എന്നിവ ഒഴിവാക്കാൻ സ്പോൺസർബ്ലോക്ക് നിങ്ങളെ അനുവദിക്കുന്നു. സ്പോൺസർബ്ലോക്ക് ഒരു ക്ര crow ഡ്സോഴ്സ്ഡ് ബ്ര browser സർ എക്സ്റ്റൻഷനാണ്, ഇത് സ്പോൺസർ ചെയ്ത സെഗ്മെന്റുകളുടെയും YouTube വീഡിയോകളുടെ മറ്റ് സെഗ്മെൻറുകളുടെയും ആരംഭ, അവസാന സമയങ്ങൾ സമർപ്പിക്കാൻ ആരെയും അനുവദിക്കുക. ഒരു വ്യക്തി ഈ വിവരങ്ങൾ സമർപ്പിച്ചുകഴിഞ്ഞാൽ, ഈ വിപുലീകരണമുള്ള മറ്റെല്ലാവരും സ്പോൺസർ ചെയ്ത സെഗ്മെൻറിനെ മറികടക്കും. സംഗീത വീഡിയോകളുടെ സംഗീതേതര വിഭാഗങ്ങളും നിങ്ങൾക്ക് ഒഴിവാക്കാം.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -269,9 +272,6 @@
|
||||
"skip_category": {
|
||||
"message": "{0} ഒഴിവാക്കുക?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "ഒഴിവാക്കി"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനരഹിതമാക്കുക"
|
||||
},
|
||||
@@ -332,12 +332,6 @@
|
||||
"createdBy": {
|
||||
"message": "ഉണ്ടാക്കിയത്"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "യാന്ത്രിക ഒഴിവാക്കുക"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കിയതിനുശേഷം അറിയിപ്പ് കാണിക്കുക"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". ഇത് നിലവിൽ ഇതായി സജ്ജീകരിച്ചിരിക്കുന്നു:"
|
||||
},
|
||||
@@ -504,8 +498,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "സന്ദേശ വായന"
|
||||
},
|
||||
"disable": {
|
||||
"message": "പ്രവർത്തനരഹിതമാക്കുക"
|
||||
"autoSkip": {
|
||||
"message": "യാന്ത്രിക ഒഴിവാക്കുക"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "സ്വമേധയാലുള്ള ഒഴിവാക്കൽ"
|
||||
@@ -513,6 +507,9 @@
|
||||
"showOverlay": {
|
||||
"message": "സീക്ക് ബാറിൽ കാണിക്കുക"
|
||||
},
|
||||
"disable": {
|
||||
"message": "പ്രവർത്തനരഹിതമാക്കുക"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "നിങ്ങളുടെ നിറം തെറ്റായി ഫോർമാറ്റുചെയ്തു. ഇത് തുടക്കത്തിൽ ഒരു നമ്പർ ചിഹ്നമുള്ള 3 അല്ലെങ്കിൽ 6 അക്ക ഹെക്സ് കോഡായിരിക്കണം."
|
||||
},
|
||||
|
||||
@@ -212,6 +212,9 @@
|
||||
"showNotice": {
|
||||
"message": "Tunjukkan Notis Lagi"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Tunjukkan Makluman Setelah Segmen Dilangkau"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock membolehkan anda melewati penaja, intro, outro, peringatan langganan, dan bahagian lain dari video YouTube yang menjengkelkan. SponsorBlock adalah pelanjutan penyemak imbas yang banyak untuk membolehkan sesiapa sahaja menghantar segmen tajaan dan masa tayangan dari segmen video YouTube yang lain. Setelah satu orang menyerahkan maklumat ini, semua orang yang mempunyai pelanjutan ini akan melangkau segmen yang ditaja. Anda juga boleh melangkau bahagian muzik video muzik bukan.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -269,9 +272,6 @@
|
||||
"skip_category": {
|
||||
"message": "Langkau {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Langkau"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Lumpuhkan Langkau Auto"
|
||||
},
|
||||
@@ -332,12 +332,6 @@
|
||||
"createdBy": {
|
||||
"message": "Dicipta oleh"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Langkau Auto"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Tunjukkan Makluman Setelah Segmen Dilangkau"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Pada masa ini ditetapkan untuk:"
|
||||
},
|
||||
@@ -504,8 +498,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Bacaan Mesej"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Nyahaktifkan"
|
||||
"autoSkip": {
|
||||
"message": "Langkau Auto"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Langkau Manual"
|
||||
@@ -513,6 +507,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Tunjukkan Di Bar Mencari"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Nyahaktifkan"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Warna anda tidak diformat dengan betul. Ia mestilah kod hex 3 atau 6 digit dengan tanda nombor pada awalnya."
|
||||
},
|
||||
|
||||
@@ -26,13 +26,13 @@
|
||||
"message": "segmenten"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Stemmen op deze indiening"
|
||||
"message": "Stemmen op deze inzending"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Rapporteren"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Deze indiening als onjuist rapporteren."
|
||||
"message": "Deze inzending als onjuist rapporteren."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Verwerpen"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Geen YouTube-video gevonden.\nVernieuw het tabblad als dit onjuist is."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Segmenten vernieuwen"
|
||||
},
|
||||
"success": {
|
||||
"message": "Gelukt!"
|
||||
},
|
||||
@@ -137,7 +140,7 @@
|
||||
"message": "Indienen"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Sectiebewerking verschijnt nadat u op verzenden hebt geklikt",
|
||||
"message": "Sectiebewerking verschijnt nadat u op indienen hebt geklikt",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
@@ -201,7 +204,7 @@
|
||||
"message": "Bijhouden van het aantal keren overslaan inschakelen"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Deze functie houdt bij welke segmenten u heeft overgeslagen om gebruikers te laten weten hoezeer hun indiening anderen heeft geholpen en wordt samen met upvotes als meetwaarde gebruikt om ervoor te zorgen dat spam niet in de database terechtkomt. De extensie stuurt telkens wanneer u een segment overslaat een bericht naar de server. Hopelijk veranderen de meeste mensen deze instelling niet zodat de weergavenummers accuraat zijn. :)"
|
||||
"message": "Deze functie houdt bij welke segmenten u heeft overgeslagen om gebruikers te laten weten hoezeer hun inzending anderen heeft geholpen en wordt samen met upvotes als meetwaarde gebruikt om ervoor te zorgen dat spam niet in de database terechtkomt. De extensie stuurt telkens wanneer u een segment overslaat een bericht naar de server. Hopelijk veranderen de meeste mensen deze instelling niet zodat de weergavenummers accuraat zijn. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen"
|
||||
@@ -221,6 +224,24 @@
|
||||
"showNotice": {
|
||||
"message": "Melding opnieuw weergeven"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Melding weergeven nadat een segment is overgeslagen"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Volledige grootte overslaan-meldingen"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Kleine overslaan-meldingen voor automatisch overslaan"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Allemaal kleine overslaan-meldingen"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Vervaagde overslaan-meldingen"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Allemaal vervaagde overslaan-meldingen"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock laat u sponsoring, intro's, outro's, herinneringen om te abonneren en andere vervelende onderdelen van YouTube-video's overslaan. SponsorBlock is een gecrowdsourcete browser-extensie waarmee iedereen de begin- en eindtijd van gesponsorde segmenten en andere segmenten van YouTube-video's kan indienen. Zodra één persoon deze informatie indient, zal iedereen met deze extensie het gesponsorde segment overslaan. U kunt ook secties zonder muziek in muziekvideo's overslaan.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -248,7 +269,7 @@
|
||||
"message": "Sneltoets instellen voor begin/einde van segment"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Sneltoets instellen voor indienen"
|
||||
"message": "Sneltoets instellen voor inzending"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Selecteer een toets door hem in te drukken"
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "{0} overslaan?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Overslaan naar {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Overgeslagen"
|
||||
"message": "{0} overgeslagen",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Overgeslagen naar {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Automatisch overslaan uitschakelen"
|
||||
@@ -344,12 +374,6 @@
|
||||
"createdBy": {
|
||||
"message": "Gemaakt door"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatisch overslaan"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Melding weergeven nadat een segment is overgeslagen"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Hij is momenteel ingesteld op:"
|
||||
},
|
||||
@@ -394,10 +418,10 @@
|
||||
"message": "Segmenten korter dan de ingestelde waarde worden niet overgeslagen of weergegeven in de speler."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Duur van melding om over te slaan (seconden):"
|
||||
"message": "Duur van overslaan-melding (seconden):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "De melding om over te slaan blijft ten minste zo lang op het scherm staan. Voor handmatig overslaan kan dit misschien zelfs langer zichtbaar zijn."
|
||||
"message": "De overslaan-melding blijft ten minste zo lang op het scherm staan. Voor handmatig overslaan kan dit misschien zelfs langer zichtbaar zijn."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "De volgende inzending is korter dan uw \"minimale tijdsduur\"-instelling. Dit kan betekenen dat dit al is ingediend en genegeerd wordt door deze optie. Weet u zeker dat u dit wilt indienen?"
|
||||
@@ -541,14 +565,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Niet-muziek"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Hoogtepunt"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Het deel van de video waar de meeste mensen naar op zoek zijn. Gelijkaardig aan \"video begint bij x\"-opmerkingen."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: donaties/lezen van berichten"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Lezen van berichten"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Uitschakelen"
|
||||
"autoSkip": {
|
||||
"message": "Automatisch overslaan"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Handmatig overslaan"
|
||||
@@ -556,6 +586,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Weergeven in tijdbalk"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Uitschakelen"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Automatisch overslaan naar het begin"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Vragen wanneer de video wordt geladen"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Weergeven in tijdbalk"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automatisch alle segmenten overslaan wanneer er een niet-muziek-segment is"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Uw kleur is verkeerd geformatteerd. Het moet een hexadecimale code van 3 of 6 cijfers zijn met een hekje aan het begin."
|
||||
},
|
||||
@@ -666,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Help"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Helpen voorkomen dat dit verdwijnt"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Deze video is gedetecteerd als niet-genoteerd en geüpload voor 2017.\nOude niet-genoteerde video's worden volgende maand op privé gezet.\nWe zijn *publieke* video's aan het verzamelen om te backuppen.\nWilt u deze video anoniem naar ons toesturen?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Begrepen",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Uitschrijven van alle toekomstige experimenten",
|
||||
@@ -678,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Voor altijd verbergen"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "U heeft een waarschuwing gekregen en kunt tijdelijk geen segmenten indienen. Dit betekent dat we gemerkt hebben dat u een aantal veelvoorkomende fouten maakt die niet kwaadaardig zijn, en we willen gewoon de regels verduidelijken. U kunt ook deelnemen aan deze chat via discord.gg/SponsorBlock of matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Stem geweigerd vanwege een waarschuwing. Klik om een chat te openen om het op te lossen, of kom later terug als u tijd hebt.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Doneren"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Donatiekoppeling verbergen"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Bedankt voor het installeren van SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Bekijk de onderstaande opties"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Veel functies zijn standaard uitgeschakeld. Als u intro's of outro's wilt overslaan, Invidious wilt gebruiken, enz., schakelt u ze hieronder in. U kunt ook UI-elementen verbergen/weergeven."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Hoe overslaan werkt"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Videosegmenten zullen automatisch worden overgeslagen als ze in de database worden gevonden. U kunt de popup openen door op het pictogram van de extensie te klikken om een voorbeeld te krijgen van wat ze zijn."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op downvote te klikken! U kunt ook stemmen in de popup."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Indienen"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Indienen kan ofwel in de popup door op de knop \"segment begint nu\" te drukken of in de videospeler met de knoppen op de speler."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Klikken op de afspelen-knop geeft het begin van een segment aan en klikken op het stop-pictogram geeft het einde aan. U kunt meerdere sponsors voorbereiden voordat u op indienen klikt. Klikken op de uploadknop zal indienen. Klikken op de vuilnisbak zal verwijderen."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Bewerken"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Als u een fout hebt gemaakt, kunt u uw segmenten bewerken of verwijderen nadat u op de knop met de pijl omhoog hebt geklikt."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Dit is te traag"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Er zijn sneltoetsen als u die wilt gebruiken. Druk op de puntkomma-toets om het begin/einde van een sponsorsegment aan te geven en klik op de apostrof om in te dienen. Deze kunnen worden veranderd in de opties. Als u geen QWERTY gebruikt, moet u waarschijnlijk de toetsencombinatie veranderen."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Kan ik een kopie van de database krijgen? Wat gebeurt er als u verdwijnt?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "De database is openbaar en beschikbaar op"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "De broncode is vrij beschikbaar. Dus, zelfs als mij iets overkomt, zijn uw inzendingen niet verloren."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Nieuws en hoe het gemaakt is"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Waar kan ik de broncode krijgen?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Dank aan"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Nieuw! Ga met één klik naar de kern van de video met de nieuwe hoogtepunt-categorie"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Meer informatie"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +212,9 @@
|
||||
"showNotice": {
|
||||
"message": "Vis varselet igjen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Vis varsel etter at et segment har blitt hoppet over"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock lar deg hoppe over sponsorer, introer, outro-er, abonnementspåminnelser, og andre irriterende deler av YouTube-videoer. SponsorBlock er en fellesskapsdrevet nettleserutvidelser som lar alle sende inn start- og sluttidspunktene til sponsede segmenter og andre segmenter i YouTube-videoer. Når en person sender inn denne informasjonen, vil alle andre med denne utvidelsen hoppe rett over det sponsede segmentet. Du kan også hoppe over ikke-musikk-seksjoner i musikkvideoer.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -269,9 +272,6 @@
|
||||
"skip_category": {
|
||||
"message": "Vil du hoppe over {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Hoppet over"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Skru av autohopping"
|
||||
},
|
||||
@@ -332,12 +332,6 @@
|
||||
"createdBy": {
|
||||
"message": "Opprettet av"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Hopp over automatisk"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Vis varsel etter at et segment har blitt hoppet over"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Den er før øyeblikket satt til:"
|
||||
},
|
||||
@@ -504,8 +498,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Høytlesning av meldinger"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktiver"
|
||||
"autoSkip": {
|
||||
"message": "Hopp over automatisk"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manuelt hopp"
|
||||
@@ -513,6 +507,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Vis i tidsstripen"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktiver"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Fargen din er formattert feil. Det burde være en 3- eller 6-sifret heksadesimal kode med et nummertegn foran."
|
||||
},
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Nie znaleziono filmu YouTube.\nJeżeli to błąd, odśwież stronę."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Odśwież segmenty"
|
||||
},
|
||||
"success": {
|
||||
"message": "Sukces!"
|
||||
},
|
||||
@@ -221,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Pokaż informacje ponownie"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Pokaż informację po pominięciu segmentu"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock pozwala pomijać sponsorów, intra, outra, przypomnienia o subskrypcjach i inne irytujące fragmenty filmów na YouTube. SponsorBlock jest opartym na crowdsourcingu rozszerzeniem do przeglądarki, które pozwala każdemu zgłosić początek i koniec segmentów sponsorowanych oraz innych segmentów w filmach na YouTube. Kiedy ktoś już zamieści te informacje, wszyscy pozostali z tym rozszerzeniem będą pomijać segment sponsorowany. Możesz również pomijać fragmenty teledysków bez muzyki.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,9 +287,6 @@
|
||||
"skip_category": {
|
||||
"message": "Pominąć {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Pominięto"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Wyłącz autopomijanie"
|
||||
},
|
||||
@@ -344,12 +347,6 @@
|
||||
"createdBy": {
|
||||
"message": "Stworzony przez"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Autopomijanie"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Pokaż informację po pominięciu segmentu"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Obecnie ustawiony:"
|
||||
},
|
||||
@@ -547,8 +544,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Czytanie wiadomości"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Wyłączone"
|
||||
"autoSkip": {
|
||||
"message": "Autopomijanie"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Ręczne pomijanie"
|
||||
@@ -556,6 +553,12 @@
|
||||
"showOverlay": {
|
||||
"message": "Pokaż na pasku"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Wyłączone"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automatycznie pomiń wszystkie segmenty, gdy istnieje segment niemuzyczny"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Nieprawidłowy format koloru. Powinien to być zapis szesnastkowy (heksadecymalny) składający się z 3 lub 6 znaków poprzedzonych kratką (#)."
|
||||
},
|
||||
@@ -666,17 +669,18 @@
|
||||
"help": {
|
||||
"message": "Pomoc"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Pomóż zapobiec zniknięciu tego"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Ten film jest wykryty jako nienotowany i przesłany przed 2017 r.\nStare filmy nienotowane są ustawione na prywatne w przyszłym miesiącu\nZbieramy *publiczne* filmy do kopii zapasowej\nCzy chcesz anonimowo wysłać do nas ten film?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Wyłączenie wszystkich przyszłych eksperymentów",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Schowaj na zawsze"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Otrzymałeś ostrzeżenie i nie możesz tymczasowo przesłać segmentów. Oznacza to, że zauważyliśmy, że popełniałeś pewne pospolite błędy, które nie są złośliwe i po prostu chcemy wyjaśnić zasady. Możesz również dołączyć do tego czatu używając discord.gg/SponsorBlock lub matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Głosowanie odrzucone z powodu ostrzeżenia. Kliknij, aby otworzyć czat w celu rozwiązania problemu lub wróć później, gdy będziesz miał czas.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Pule patrocinadores, pedidos para se inscrever e mais nos vídeos do YouTube. Reporte patrocinadores nos vídeos que você assistir para economizar o tempo dos outros.",
|
||||
"message": "Pule patrocinadores, pedidos para se inscrever, e outros nos vídeos do YouTube. Reporte patrocinadores nos vídeos que você assistir para economizar o tempo dos outros.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
@@ -74,10 +74,10 @@
|
||||
"message": "Nenhum segmento encontrado"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "O segmento começa agora"
|
||||
"message": "O Segmento Começa Agora"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "O segmento termina agora"
|
||||
"message": "O Segmento Termina Agora"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Cancelar Criação de Segmento"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Nenhum vídeo do YouTube encontrado.\nSe isto estiver incorreto, atualize a aba."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Atualizar segmentos"
|
||||
},
|
||||
"success": {
|
||||
"message": "Sucesso!"
|
||||
},
|
||||
@@ -128,7 +131,7 @@
|
||||
"message": "Envios"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Poupaste a outros de "
|
||||
"message": "Você poupou as pessoas de "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Placar de classificação"
|
||||
@@ -137,7 +140,7 @@
|
||||
"message": "Enviar"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "A edição da seção aparecerá depois que você clicar em enviar",
|
||||
"message": "A edição da seção aparecerá após você clicar em enviar",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
@@ -185,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "Este é o botão que abre o popup na pagina do Youtube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Esconder Automaticamente o Botão de Informação"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Esconder botão de Apagar no player do Youtube"
|
||||
},
|
||||
@@ -195,28 +201,49 @@
|
||||
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Ativar contador de segmentos pulados"
|
||||
"message": "Ativar Contador de Segmentos Pulados"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Este recurso controla quais segmentos você pulou para permitir que os usuários saibam o quanto a submissão deles ajudou outros e é usado como métrica, juntamente com votos positivos para garantir que spam não entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espera-se que a maioria das pessoas não mude essa configuração, para que os números de exibição estejam corretos. :)"
|
||||
"message": "Este recurso controla quais segmentos você pulou para permitir que os usuários saibam o quanto a submissão deles ajudou outros e foi usada como métrica, juntamente com votos positivos para garantir que nenhum spam entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espera-se que a maioria das pessoas não mude essa configuração, para que os números de exibição estejam corretos. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Ativar Pular Contagem de Rastreamento em Abas Privadas/Incógnito"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Consulta Por Prefixo Hash"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Em vez de solicitar segmentos do servidor usando o videoID, os 4 primeiros caracteres do hash do videoID foram enviados. Este servidor irá enviar dados de volta para todos os vídeos com hashes similares."
|
||||
"message": "Em vez de solicitar segmentos do servidor usando o videoID, os 4 primeiros caracteres do hash do videoID foram enviados. Este servidor enviará dados de volta para todos os vídeos com hashes similares."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Recuperar Segmentos Em Novos Vídeos"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Se o vídeo for novo e não houver segmentos encontrados, continuaremos buscando enquanto você assiste."
|
||||
"message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos buscando enquanto você assiste."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Mostrar notificação outra vez"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar Aviso Após Um Segmento Ser Ignorado"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Avisos de Ignorar em Tamanho Inteiro"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Avisos de Ignorar pequenos quando Pulado Automaticamente"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Todos os Avisos de Ignorar em Tamanho Pequeno"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Avisos de Ignorar semi-transparentes quando Pulado Automaticamente"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Todos os Avisos de Ignorar semi-transparentes"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "O SponsorBlock permite que você pule patrocinadores, introduções, outros, lembretes de inscrição e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de crowdsourcing que permite enviar o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções que não são de música dos vídeos de música.",
|
||||
"message": "O SponsorBlock permite que você pule patrocinadores, introduções, créditos finais, lembretes de inscrição, e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de crowdsourcing que permite enviar a qualquer um o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções que não são de música dos vídeos de música.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
@@ -275,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Pular {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Pular para {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Pulado"
|
||||
"message": "{0} Ignorado",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Pulado para {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Desativar Salto Automático"
|
||||
@@ -288,7 +324,7 @@
|
||||
"message": "Notificação de áudio ao pular"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "A notificação de áudio ao pular irá tocar um som sempre que um segmento for ignorado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."
|
||||
"message": "A notificação de áudio ao pular irá tocar um som sempre que um segmento for pulado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "Mostrar tempo com pulos removidos"
|
||||
@@ -338,18 +374,28 @@
|
||||
"createdBy": {
|
||||
"message": "Criado por"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Pular automaticamente"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar aviso após um segmento ser ignorado"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Atualmente, está definido para:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Suporte a Sites do YouTube de Terceiros"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Suporte a clientes de terceiros do YouTube. Para habilitar o suporte, você deve aceitar as permissões extras. Isso NÃO funciona em incógnito no Chrome e outras variantes do Chromium.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Sites Suportados: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Ativar apoio ao Invidious, desabilitar pular automaticamente, ocultar botões e mais."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Adicionar Instância de Cliente de Terceiros"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Adicionar uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Adicionar"
|
||||
},
|
||||
@@ -371,6 +417,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Segmentos menores do que o valor definido não serão pulados ou mostrados no reprodutor."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Duração do aviso prévio de pular (segundos):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "O aviso de pular ficará na tela por pelo menos este tempo. Para o pulo manual, pode ser visível por mais tempo."
|
||||
},
|
||||
"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?"
|
||||
},
|
||||
@@ -431,6 +483,9 @@
|
||||
"preview": {
|
||||
"message": "Pré-visualizar"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "Não enviado"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Inspecionar"
|
||||
},
|
||||
@@ -463,19 +518,19 @@
|
||||
"message": "Patrocinador"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promoção paga, indicações pagas e anúncios diretos. Não para auto-promoção ou mensagens grátis para causas/criadores/websites/produtos que eles gostam."
|
||||
"message": "Promoção paga, referências pagas e anúncios diretos. Não deve ser usado para Auto promoção ou mensagens grátis para causas/criadores/sites/produtos que eles gostam."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Não-pago/Auto promoção"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar a \"patrocinador\", mas para auto promoções e segmentos não-pagos. Isto inclui seções sobre vendas, doações ou informações sobre com quem colaboraram."
|
||||
"message": "Similar a \"patrocinador\", mas para auto promoções e segmentos não-pagos. Isso inclui seções sobre vendas, doações ou informações sobre com quem colaboraram."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Lembrete de interação (inscrever-se)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Quando houver um pequeno lembrete para curtir, inscrever-se ou segui-los no meio do conteúdo. Se é longo ou sobre algo específico, deveria ser sob Não-pago/Auto promoção."
|
||||
"message": "Quando houver um pequeno lembrete para curtir, inscrever-se ou segui-los no meio do conteúdo. Se é longo ou sobre algo em específico, deveria ser sob Não-pago/Auto promoção."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Lembrete de interação"
|
||||
@@ -495,23 +550,35 @@
|
||||
"category_outro_description": {
|
||||
"message": "Créditos ou quando os cards finais do YouTube aparecem. Não deve ser usado para conclusões informativas."
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Pré-visualização/Recapitulação"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Recapitulação rápida de episódios anteriores, ou uma prévia do que está chegando mais tarde no vídeo atual. Destinado a clipes editados juntos, não para resumos falados."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Música: Seção sem música"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Para uso em vídeos musicais somente. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria."
|
||||
"message": "Apenas para uso em vídeos musicais. Deve ser usado exclusivamente para seções de vídeos musicais que já não pertençam à outra categoria."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Não musical"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Destaques"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "A parte do vídeo que a maioria das pessoas procura. Similar aos comentários \"Vídeo começa aos x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Leituras de Doação/Mensagem"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Leitura de mensagens"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Desativar"
|
||||
"autoSkip": {
|
||||
"message": "Pular automaticamente"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Pular manualmente"
|
||||
@@ -519,8 +586,27 @@
|
||||
"showOverlay": {
|
||||
"message": "Mostrar barra de progresso"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Desativar"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Pular automaticamente para o início"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Perguntar quando o vídeo carregar"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Mostrar na barra de progresso"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Pular automaticamente todos os segmentos quando há um segmento que não é música"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma tralha / hashtag no início."
|
||||
"message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma cerquilha (hashtag) no início."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Cor Não Enviada",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Cor da barra"
|
||||
@@ -551,7 +637,7 @@
|
||||
"message": "Selecione uma Categoria"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-lo nas opções. Você será redirecionado para as opções agora.",
|
||||
"message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
@@ -568,13 +654,13 @@
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "ID do canal ainda não foi carregado. Se você estiver usando um vídeo embutido, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se você achar que este é o caso, faça um comentário aqui:"
|
||||
"message": "O ID do canal ainda não foi carregado. Se você estiver usando um vídeo embutido, tente usar a página inicial do YouTube. Isso também pode ser causado por mudanças no layout do YouTube, se você achar que este é o caso, faça um comentário aqui:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Parece que algo está bloqueando a habilidade do SponsorBlock de obter dados de vídeo. Por favor, veja https://github.com/ajayyy/SponsorBlock/issues/741 para mais informações."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Parece que o SponsorBlock é incapaz de acessar a API do YouTube. Para corrigir isso, aceite a permissão do prompt que aparecerá a seguir, espere alguns segundos e recarregue a página."
|
||||
"message": "Parece que o SponsorBlock não foi capaz de acessar a API do YouTube. Para corrigir isso, aceite a permissão do prompt que aparecerá a seguir, espere alguns segundos, e recarregue a página."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Aceitar permissão"
|
||||
@@ -583,19 +669,19 @@
|
||||
"message": "Solicitação de permissão bem-sucedida!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Falha na solicitação de permissão. Você clicou em negar?"
|
||||
"message": "Falha na solicitação de permissão, você clicou em negar?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Se você não consegue resolver isso, desative a configuração 'Forçar Verificação do Canal Antes de Pular', pois o SponsorBlock não pode recuperar as informações deste vídeo"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Forçar verificação do canal antes de pular"
|
||||
"message": "Forçar Verificação do Canal Antes de Pular"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Por padrão, isso pulará os segimentos imediatamente mesmo antes de saber qual é o canal. Por padrão, alguns segimentos no inicio do video 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."
|
||||
"message": "Por padrão, isso pulará os seguimentos imediatamente, mesmo antes de saber qual é o canal. Por padrão, alguns seguimentos no inicio do vídeo podem ser ignorados nos canais da lista branca. Habilitar esta opção evitará isso, mas fará com que todos os pulos 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 ativar a 'forçar verificação de canal antes de pular\""
|
||||
"message": "Considere Ativar a \"Forçar Verificação de Canal Antes de Pular\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Tempo errado ou incorreto"
|
||||
@@ -604,7 +690,7 @@
|
||||
"message": "Categoria errada"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Este vídeo é categorizado como música. Tem certeza que isto tem um patrocinador? Se este é realmente um \"segmento não musical\", abra as opções da extensão e habilite esta categoria. Assim você pode enviar este segmento como \"não-musical\" ao invés de patrocinador. Por favor leia as diretrizes se estiver confuso."
|
||||
"message": "Este vídeo é categorizado como música. Tem certeza de que isto tem um patrocinador? Se este é realmente um \"Segmento Não Musical\", abra as opções da extensão e habilite esta categoria. Assim você pode enviar este segmento como \"Não-Musical\" ao invés de patrocinador. Por favor leia as diretrizes se estiver confuso."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Múltiplos segmentos"
|
||||
@@ -620,6 +706,96 @@
|
||||
"message": "As categorias estão aqui!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Abra as opções para ignorar as introduções, outros, promoção de mercadoria, etc."
|
||||
"message": "Abra as opções para ignorar as introduções, créditos finais, promoção de mercadoria, etc."
|
||||
},
|
||||
"help": {
|
||||
"message": "Ajuda"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Entendi",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Optar por sair de todos os experimentos futuros",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Ocultar para sempre"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Você recebeu um aviso e temporariamente não poderá enviar segmentos. Isso significa que notamos que você cometeu alguns erros comuns que não são maliciosos, e queremos apenas clarificar as regras. Você também pode participar desse chat usando discord.gg/SponsorBlock ou matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Voto rejeitado devido a um aviso. Clique para abrir um chat para resolvê-lo, ou volte mais tarde quando tiver tempo.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Doar"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ocultar o Link de Doação"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Obrigado por instalar o SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Por favor revise as opções abaixo"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Muitoa recursos são desativados por padrão. Se você deseja pular introduções, encerramentos, usar o Invidious, etc, ative as opções abaixo. Você também pode ocultar/mostrar elementos da interface."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Como a função pular funciona"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Segmentos do vídeo serão pulados automaticamente se forem encontrados na base de dados. Você pode abrir a pop-up clicando no ícone da extensão para ter uma prévia de quais são."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Sempre que você pular um segmento, você receberá um aviso. Se o tempo estiver errado vote contra clicando no voto negativo! Você também pode votar na pop-up."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Enviando"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "O envio pode ser feito no pop-up apertando o botão \"Segmento começa Agora\" ou no reprodutor de vídeo com os botões no reprodutor."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Clicar no botão inicio indica o começo de um segmento e clicar no ícone parar indica o fim. Você pode preparar vários patrocinadores antes de clicar em enviar. Clicar no botão upload irá enviar. Clicar no lixo irá excluir."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Editando"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Se você errar, você pode editar ou deletar seus segmentos clicando na seta para cima."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Isto está muito devagar"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Há teclas de atalho se você quiser usá-las. Pressione a tecla ponto e vírgula para indicar o início/fim de um segmento de patrocinador e clique no apóstrofo para enviar. Estas podem ser alteradas nas opções. Se você não usa QWERTY, você provavelmente deve alterar as teclas vinculadas."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Posso baixar uma cópia do banco de dados? O que acontece se vocês desaparecerem?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "O banco de dados é público e está disponível em"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "O código-fonte está disponível gratuitamente. Então, mesmo que algo aconteça comigo, seus envios não estarão perdidos."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Notícias e como tudo é feito"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Onde posso obter o código-fonte?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Créditos"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novo! Vá direto ao ponto do vídeo com um clique com a nova categoria de Destaque"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Saiba mais"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +212,9 @@
|
||||
"showNotice": {
|
||||
"message": "Arată Notificarea Din Nou"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Arată o notificare după ce un segment este sărit"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock vă permite să săriți peste sponsori, intro, outros, memento-uri pentru abonament și alte părți enervante ale videoclipurilor YouTube SponsorBlock este o extensie crowdsourced de browser, care hai să trimită oricui timpul de început și de sfârșit pentru segmente sponsorizate și alte segmente de videoclipuri YouTube. Odată ce o persoană transmite aceste informații, toți ceilalți cu această extensie vor sări peste segmentul sponsorizat. De asemenea, poți sări peste secțiunile non-muzicale ale videoclipurilor.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -269,9 +272,6 @@
|
||||
"skip_category": {
|
||||
"message": "Omiteți {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Sărit"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Dezactivează Autoskip"
|
||||
},
|
||||
@@ -332,12 +332,6 @@
|
||||
"createdBy": {
|
||||
"message": "Creat De"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Sari Peste Automat"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Arată o notificare după ce un segment este sărit"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". În prezent este setat:"
|
||||
},
|
||||
@@ -501,8 +495,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Citire Mesaj"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Dezactivare"
|
||||
"autoSkip": {
|
||||
"message": "Sari Peste Automat"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Sari Peste Manual"
|
||||
@@ -510,6 +504,9 @@
|
||||
"showOverlay": {
|
||||
"message": "Arată În Bara de Derulare"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Dezactivare"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Culoarea ta este formatată incorect. Ar trebui să fie un cod hexadecimal de 3 sau 6 cifre cu un hash la început."
|
||||
},
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
"message": "В базе есть сегменты для этого видео!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Сегментов не найдено"
|
||||
"message": "Сегменты не найдены"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Сегмент начинается отсюда"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Видео YouTube не найдено.\nЕсли это не так, обновите вкладку."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Обновить сегменты"
|
||||
},
|
||||
"success": {
|
||||
"message": "Успех!"
|
||||
},
|
||||
@@ -92,7 +95,7 @@
|
||||
"message": "Голос засчитан!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Кажется, сервера не работают. Незамедлительно свяжитесь с разработчиком."
|
||||
"message": "Кажется, сервер не отвечает. Свяжитесь с разработчиком."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Ошибка соединения. Код ошибки: "
|
||||
@@ -221,6 +224,24 @@
|
||||
"showNotice": {
|
||||
"message": "Показать уведомление снова"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Показывать уведомление после пропуска сегмента"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Полноразмерные уведомления о пропусках"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Уменьшенные уведомления для автоматических пропусков"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Все уведомления уменьшенного размера"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Полупрозрачные уведомления для автоматических пропусков"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Полупрозрачные уведомления для всех пропусков"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock позволяет пропускать спонсорские вставки, начальные и конечные заставки, просьбы подписаться и другое в видео на YouTube. SponsorBlock — коллективное расширение, которое позволяет каждому отправить время начала и конца подобных сегментов в видео. После того, как кто-нибудь отправляет эту информацию, все остальные пользователи расширения будут автоматически пропускать эти сегменты. Так же можно пропускать части клипов без музыки.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Пропустить {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Пропустить до {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Пропущено"
|
||||
"message": "Пропущено: {0}",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Пропущено до {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Отключить автоматический пропуск"
|
||||
@@ -300,7 +330,7 @@
|
||||
"message": "Показывать длительность без сегментов"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Эта длительность отображается в скобках рядом с фактической под полосой прокрутки. Показывает длительность видео без сегментов. Включает сегменты, для которых выбрано \"Отображать в полосе прокрутки\"."
|
||||
"message": "Длительность отображается в скобках после фактической под полосой прокрутки. Показывает длительность видео без сегментов. Включает сегменты, для которых выбрано \"Отображать в полосе прокрутки\"."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Вы пропустили "
|
||||
@@ -339,17 +369,11 @@
|
||||
"message": "Установить идентификатор пользователя"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Внимание: изменение идентификатора пользователя необратимо. Вы действительно хотите это сделать? Сделайте резервную копию вашего старого на всякий случай."
|
||||
"message": "Внимание: изменение идентификатора пользователя необратимо. Вы действительно хотите это сделать? Сделайте резервную копию на всякий случай."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Создано"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Автоматический пропуск"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Показывать уведомление после пропуска сегмента"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Он сейчас назначен на:"
|
||||
},
|
||||
@@ -397,7 +421,7 @@
|
||||
"message": "Длительность отображения окошка о пропуске (в секундах):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Окошко о пропуске будет оставаться на экране в течение как минимум этого времени. Может быть активно дольше при пропуске вручную."
|
||||
"message": "Окошко о пропуске будет оставаться на экране как минимум в течение этого времени. Может быть активно дольше при пропуске вручную."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Следующий диапазон времени короче, чем Ваша настройка минимальной длительности. Это может означать, что он уже был отправлен, и просто игнорируется из-за этой настройки. Вы действительно хотите отправить?"
|
||||
@@ -475,7 +499,7 @@
|
||||
"message": "Не удалось скопировать в буфер"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Копирует информацию в буфер обмена, которая будет предоставлена разработчику при возникновении ошибки / по запросу разработчика. Такие сведения, как ID пользователя, список разрешенных каналов и адрес пользовательского сервера не передаются. Однако, отправляются ваш user agent, браузер, операционная система и номер версии расширения. "
|
||||
"message": "Копирует в буфер обмена информацию, которая будет предоставлена разработчику при возникновении ошибки / по запросу разработчика. Такие сведения, как ID пользователя, список разрешенных каналов и адрес пользовательского сервера не передаются. Однако, отправляются ваш user agent, браузер, операционная система и номер версии расширения. "
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Отладочная информация скопирована в буфер обмена. Вы можете удалить любую информацию, которой не хотите делиться. Сохраните ее в текстовом файле или вставьте в отчет об ошибке."
|
||||
@@ -527,7 +551,7 @@
|
||||
"message": "Титры или время появления конечных заставок YouTube. Не для подведения итогов сказанного в видео."
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Предварительный просмотр/краткое содержание"
|
||||
"message": "Предпросмотр/краткое содержание"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Краткое содержание предыдущих эпизодов или предварительный просмотр того, что будет в данном видео. Предназначено для сегментов, смонтированных из кусков видео, а не для устных пересказов."
|
||||
@@ -541,14 +565,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Без музыки"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Важное"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Часть видео, которую ищет большинство людей. По сути заменяет комментарии типа \"Видео начинается с x:xx\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Прямые трансляции: пожертвование/чтение сообщения"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Чтение сообщений"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Отключить"
|
||||
"autoSkip": {
|
||||
"message": "Автоматический пропуск"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Пропускать вручную"
|
||||
@@ -556,6 +586,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Показывать в полосе прокрутки"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Отключить"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Автоматически пропускать к началу видео"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Спрашивать после загрузки видео"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Показывать в полосе прокрутки"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Пропускать все сегменты автоматически при наличии сегмента без музыки"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Вы ввели цвет в неправильном формате. Это должно быть 3-х или 6-ти значное шестнадцатеричное число с символом # в начале."
|
||||
},
|
||||
@@ -639,7 +684,7 @@
|
||||
"message": "Рекомендуем включить \"Принудительная проверка каналов перед пропуском\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Неверно указано время"
|
||||
"message": "Не нужен/неверно указано время"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Неверная категория"
|
||||
@@ -666,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Помощь"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Помогите архивировать это видео"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Это видео было загружено до 2017 и имеет доступ по ссылке\nДля всех подобных видео в следующем месяце будет установлен ограниченный доступ\nМы собираем *публичные* видео для резервного копирования\nВы хотели бы анонимно отправить нам это видео?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Ясно",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Отказаться от всех будущих экспериментов",
|
||||
@@ -678,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Скрыть навсегда"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Вы получили предупреждение и временно не можете отправлять сегменты. Мы заметили, что вы совершали распространенные ошибки, которые не являются злонамеренными, и просто хотим уточнить для вас правила. Вы также можете присоединиться к нашему чату, используя discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Голосование отклонено из-за предупреждения. Нажмите, чтобы открыть чат, где вы можете решить проблему, или вернитесь, когда у вас будет время.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Пожертвовать"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Скрыть ссылку на пожертвование"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Спасибо за установку SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Пожалуйста, ознакомьтесь с настройками ниже"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Многие функции по умолчанию отключены. Если вы хотите пропускать начальные и конечные заставки, использовать Invidious и т.д., включите их ниже. Вы также можете скрыть/показать элементы интерфейса."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Как работает пропуск"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Сегменты видео будут автоматически пропущены, если они находятся в базе данных. Вы можете открыть всплывающее окно, нажав на значок расширения, чтобы посмотреть, какие сегменты добавлены."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Когда вы будете пропускать сегмент, вы получите уведомление. Если время покажется вам неправильным, проголосуйте против, нажав на палец вниз! Вы также можете проголосовать во всплывающем окне."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Отправка"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Отправка может быть выполнена во всплывающем окне нажатием на кнопку \"Сегмент начинается отсюда\" или кнопками в видеоплеере."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Нажатие на кнопку воспроизведения означает начало сегмента и нажатие на кнопку стоп обозначает его конец. Вы можете обозначить несколько сегментов перед тем, как нажать на кнопку отправки. Нажатие на корзину удалит всё."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Редактирование"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Если вы сделали что-то не так, вы можете отредактировать или удалить сегменты, нажав на кнопку со стрелкой вверх."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Это слишком медленно"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Всё это также можно делать при помощи горячих клавиш. Нажмите клавишу \"ж\" для указания начала/конца сегмента, \"э\" для отправки. Клавиши могут быть изменены в настройках. Если вы не используете QWERTY, то стоит сразу поменять горячее клавиши."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Могу ли я получить копию базы данных? Что если вы пропадёте?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "База данных доступна для всех здесь:"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Исходный код в открытом доступе, так что даже если что-то случится со мной, ваш вклад не пропадёт."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Новости и как это сделано"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Где можно получить исходный код?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Авторы"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Новинка! Переходите сразу к главному моменту видео с помощью новой категории \"Важное\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Узнать больше"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"message": "segment"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segmenty"
|
||||
"message": "segmentov"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Hlasovať pre tento príspevok"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Nenašlo sa žiadne YouTube video.\nAk je to chyba, obnovte záložku."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Znova načítať segmenty"
|
||||
},
|
||||
"success": {
|
||||
"message": "Hotovo!"
|
||||
},
|
||||
@@ -221,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Znovu zobraziť upozornenie"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Zobraziť upozornenie pri preskočení segmentu"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock umožňuje preskočiť sponzorov, úvodné časti, záverečné časti, pripomienky na odber, nehudobné časti videoklipov alebo iné otravné časti YouTube videí. SponsorBlock je crowdsourceové rozšírenie prehliadača, pomocou ktorého môže ktokoľvek označiť začiatok a koniec takéhoto segmentu. Po odoslaní potom všetci ostatní s týmto rozšírením tieto segmenty automaticky preskočia.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +287,17 @@
|
||||
"skip_category": {
|
||||
"message": "Preskočiť {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Preskočiť na {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "preskočené"
|
||||
"message": "{0} preskočené",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Preskočené na {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Zakázať Automatické Preskočenie"
|
||||
@@ -312,7 +327,7 @@
|
||||
"message": "minúta"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "minúty"
|
||||
"message": "minút"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "hodina"
|
||||
@@ -344,12 +359,6 @@
|
||||
"createdBy": {
|
||||
"message": "Vytvoril"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatické Preskočenie"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Zobraziť upozornenie pri preskočení segmentu"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Aktuálne je nastavené na:"
|
||||
},
|
||||
@@ -541,14 +550,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Bez hudby"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Hlavný obsah videa"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Tá časť videa, ktorú ľudia vyhľadávajú. Podobné komentárom \"Video začína v čase x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Živé vysielanie: oznamy a dary"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Oznamy"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Zakázať"
|
||||
"autoSkip": {
|
||||
"message": "Automatické Preskočenie"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Manuálne Preskočenie"
|
||||
@@ -556,6 +571,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Zobraziť v časovej lište"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Zakázať"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Automaticky preskočiť na začiatok"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Opýtať sa, keď sa video nahraje"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Zobraziť v časovej lište"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automaticky preskočiť všetky segmenty ak neexistuje segment bez hudby"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Vaša farba je nesprávne naformátovaná. Mal by to byť 3 alebo 6-miestny hexadecimálny kód so znakom čísla na začiatku."
|
||||
},
|
||||
@@ -666,11 +696,9 @@
|
||||
"help": {
|
||||
"message": "Pomocník"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Pomôžte zamedziť zmiznutiu tohto videa"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Toto video bolo nahraté pred r. 2007 a je nezverejnené.\nTakéto videá budú o mesiac zmenené na súkromné.\nZbierame a zálohujeme *verejné*.\nChceli by ste nám toto video anonymne poslať?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Rozumiem",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Odmietnuť všetky budúce experimenty",
|
||||
@@ -678,5 +706,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Navždy skryť"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Dostali ste varovanie a nemôžete tak dočasne odosielať segmenty. To znamená, že sme si všimli, že ste spravili nejaké chyby, ktoré nie sú myslené zle, a chceme Vám len objasniť pravidlá. Môžete sa pripojiť do konverzácie pomocou discord.gg/SponsorBlock alebo matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Hlasovanie bolo zamietnuté kvôli varovaniu. Kliknite pre otvorenie chatu, aby ste ho vyriešili, alebo sa vráťte až budete mať čas.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Prispieť"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Skryť možnosti prispenia"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Ďakujeme za inštaláciu SponsorBlock-u."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Skontrolujte prosím možnosti nižšie"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Veľa funkcií je vo východiskovom stave vypnutých. Ak chcete preskakovať úvody, závery, používať Invidious apod., zapnite ich nižšie. Taktiež môžete zobraziť alebo skryť niektoré ovládacie prvky."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Ako funguje preskakovanie"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Video segmenty budú automaticky preskočené, ak sa nájdu v databáze. Zobraziť si ich môžete po kliknutí na ikonu rozšírenia vo vyskakovacom okne."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Vždy keď preskočíte segment, tak dostanete oznam. Ak sa vám nepozdáva načasovanie, môžete o tom zahlasovať palcom dole! Zahlasovať tiež môžete vo vyskakovacom okne."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Odosielam"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Odosielanie môžete vykonať z vyskakovacieho okna stlačením \"Začiatok segmentu\" alebo priamo tlačidlami v prehrávači."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Stlačenie tlačidla Prehrať označí začiatok segmentu a stlačenie tlačidla Stop označí koniec. Takto viete označiť aj viac segmentov pred odoslaním. Stlačením tlačidla \"Nahrať\" segmenty odošlete. Stlačením tlačidla \"Kôš\" segmenty zmažete."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Úpravy"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Ak ste sa pomýlili, môžete segment upraviť alebo zmazať po stlačení šípky hore."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Príliš pomalé"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Môžete využiť aj klávesové skratky. Bodkočiarka označí začiatok alebo koniec segmentu a apostrof ho odošle."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Viem získať kópiu databázy? Čo bude ak zmizneš?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Databáza je verejná a dostupná na"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Zdrojový kód je voľne dostupný. Takže aj keby sa mi niečo stalo, vaše príspevky sa nestratia."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Novinky a ako to funguje"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Kde môžem získať zdrojový kód?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Autori"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novinka! Pomocou novej kategórie \"Hlavný obsah videa\" môžete jedným klikom preskočiť \"k veci\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Zistiť viac"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Felaktigt anrop enligt servern"
|
||||
"message": "Servern sa att denna begäran var ogiltig"
|
||||
},
|
||||
"429": {
|
||||
"message": "Du har rapporterat för många sponsormeddelanden för den här videon, är du säker att det finns så många?"
|
||||
@@ -65,7 +65,7 @@
|
||||
"message": "Är du säker på att du vill rensa detta?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Ett fel uppstod vid rapportering av sponsorsegment, försök igen senare."
|
||||
"message": "Ett fel uppstod vid rapportering av sponsormeddelandet, försök igen senare."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Denna video har segment i databasen!"
|
||||
@@ -80,11 +80,14 @@
|
||||
"message": "Segmentet slutar nu"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Avbryt skapandet av segmentet"
|
||||
"message": "Avbryt skapande av segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Hittade ingen YouTube-video.\nUppdatera fliken om detta är felaktigt."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Uppdatera segment"
|
||||
},
|
||||
"success": {
|
||||
"message": "Klart!"
|
||||
},
|
||||
@@ -168,13 +171,13 @@
|
||||
"message": "Alternativ"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Visa Knappar På YouTube-spelaren"
|
||||
"message": "Visa knappar på YouTube-spelaren"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Dölj Knappar På YouTube-spelaren"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Detta döljer knapparna på YouTube-spelaren som du kan rapportera sponsormeddelanden med. Jag förstår att det kan se störande ut för en del. Istället för att ha knappen där kan den här popup-rutan användas för att rapportera sponsormeddelanden. För att dölja notisen som dyker upp, tryck på knappen som syns på notisen som säger \"Visa inte det här igen\". Du kan alltid slå på dessa inställningar igen senare."
|
||||
"message": "Detta döljer knapparna på YouTube-spelaren som du kan skicka in segment med som ska hoppas över."
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Visa Infoknapp På YouTube-spelaren"
|
||||
@@ -192,16 +195,16 @@
|
||||
"message": "Dölj \"Ta Bort\"-knappen På YouTube-spelaren"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Visa \"Ta Bort\"-knappen På YouTube-spelaren"
|
||||
"message": "Visa knappen ta bort på YouTube-spelaren"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Denna knappen tar bort alla sponsormeddelanden på YouTube-spelaren."
|
||||
"message": "Den här knappen på YouTube-spelaren rensar bort alla segment som ej har skickats in på aktuell video."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Aktivera spåra antalet hoppa över"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Den här funktionen spårar vilka segment du har hoppat över för att låta användarna veta hur mycket tid en användare har sparat andra och tillsammans med användarnas röster säkerställa att spam inte kommer in i databasen. Detta tillägg skickar ett meddelande till servern varje gång du hoppar över ett segment. Förhoppningsvis ändrar inte folk den här inställningen så statistiken hålls tillförlitlig. :)"
|
||||
"message": "Den här funktionen spårar vilka segment du har hoppat över för att låta användarna veta hur mycket tid en användare har sparat andra och tillsammans med användarnas röster säkerställa att spam inte kommer in i databasen. Detta tillägg skickar ett meddelande till servern varje gång du hoppar över ett segment. Förhoppningsvis ändrar de flesta inte den här inställningen så statistiken hålls tillförlitlig. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktivera spåra antalet hoppa över i privata/inkognitoflikar"
|
||||
@@ -216,11 +219,29 @@
|
||||
"message": "Uppdatera segment på nya videor"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Om videon är ny och inga segment hittades då kommer den att uppdatera med några minuter mellanrum medan du tittar på videon."
|
||||
"message": "Om videon är ny och inga segment hittades då kommer den att uppdateras med några minuters mellanrum medan du tittar på videon."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Visa Notisen Igen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Visa ett meddelande efter att ett segment har hoppats över"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Hoppa över-meddelanden i fullstorlek"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Små meddelanden för automatisk hoppa över"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Alla hoppa över-meddelanden är små"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Meddelanden som tonar bort för automatisk hoppa över"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Alla hoppa över-meddelanden tonas bort"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock låter dig hoppa över sponsormeddelanden, introduktioner, eftertexter, prenumerationspåminnelser och andra irriterande delar av YouTube-videor. SponsorBlock är ett crowdsourced webbläsartillägg som låter vem som helst att skicka in start- och sluttid på sponsorsegment och andra segment av YouTube-videor. När en person skickar in denna information kommer alla andra som har detta tillägg installerat att hoppa över det sponsrade segmentet. Du kan även hoppa över icke-musikavsnitt i musikvideor.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -248,7 +269,7 @@
|
||||
"message": "Ange den genväg som ska fungera som start-/stopptangent för ett segment"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Välj knapp att koppla till rapportering av sponsormeddelande"
|
||||
"message": "Ange den tangent som ska fungera som inskickningstangent"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Ange tangent genom att trycka på den"
|
||||
@@ -281,8 +302,17 @@
|
||||
"skip_category": {
|
||||
"message": "Hoppa över {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Hoppa till {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Skippat"
|
||||
"message": "{0} överhoppad",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Hoppat till {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Inaktivera hoppa över automatiskt"
|
||||
@@ -291,7 +321,7 @@
|
||||
"message": "Aktivera Hoppa Över Automatiskt"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Ljudeffekt vid hopp"
|
||||
"message": "Ljudavisering vid hoppa över"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Ljudavisering vid hoppa över kommer att spela upp ett ljud när ett segment hoppas över. Om inaktiverad (eller om hoppa över automatiskt är inaktiverat), kommer inget ljud att spelas upp."
|
||||
@@ -333,7 +363,7 @@
|
||||
"message": "Importera/Exportera Ditt AnvändarID"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Detta bör hållas hemligt. Det fungerar som ett lösenord och borde inte delas vidare med någon. Om någon kommer över detta kan den personen utge sig för att vara dig."
|
||||
"message": "Denna ska hållas privat. Den fungerar som ett lösenord och ska inte delas med någon. Om någon får tag i den kan de utge sig för att vara dig."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Ange AnvändarID"
|
||||
@@ -344,12 +374,6 @@
|
||||
"createdBy": {
|
||||
"message": "Skapad av"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Hoppa Över Automatiskt"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Visa ett meddelande efter att ett segment har hoppats över"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Nuvarande snabbtangent är:"
|
||||
},
|
||||
@@ -357,14 +381,14 @@
|
||||
"message": "Stöd för tredjeparts YouTube-webbplatser"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Stöd tredje parts YouTube-klienter. För att aktivera support måste du acceptera de extra behörigheterna. Detta fungerar INTE i inkognito på Chrome och andra Chromium-varianter.",
|
||||
"message": "Stöd tredjeparts YouTube-klienter. För att aktivera support måste du acceptera de extra behörigheterna. Detta fungerar INTE i inkognito på Chrome och andra Chromium-varianter.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Webbplatser som stöds: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Aktivera Invidious stöd, inaktivera hoppa över automatiskt, dölj knappar och mer."
|
||||
"message": "Aktivera stöd för Invidious, inaktivera hoppa över automatiskt, dölj knappar och mer."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Lägg till tredjepartsklientinstans"
|
||||
@@ -376,7 +400,7 @@
|
||||
"message": "Lägg till"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Detta är en individuell domän. Den måste ENBART inkludera domändelen. Exempelvis: invidious.ajay.app"
|
||||
"message": "Detta är en ogiltig domän. Den ska ENDAST inkludera domändelen. Exempelvis: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Rensa Invidious instanslista"
|
||||
@@ -403,16 +427,16 @@
|
||||
"message": "Följande rapport är kortare än ditt minstavärde i inställningarna. Det skulle kunna betyda att det redan är rapporterat och bara ignorerat på grund av denna inställning. Är du säker på att du vill rapportera?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Visa Uppladdningsknapp"
|
||||
"message": "Visa uppladdningsknapp"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Denna knapp visas på YouTube-spelaren efter att du har valt en tidpunkt och är redo att rapportera."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock Serveradress"
|
||||
"message": "Serveradress för SponsorBlock"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "Adressen SponsorBlock använder för att prata med servern.\nOm du inte har din egen serverinstans ska den här inställningen inte ändras."
|
||||
"message": "Adressen SponsorBlock använder för att kommunicera med servern.\nOm du inte har din egen serverinstans ska den här inställningen inte ändras."
|
||||
},
|
||||
"save": {
|
||||
"message": "Spara"
|
||||
@@ -433,7 +457,7 @@
|
||||
"message": "Importera/Exportera alla alternativen"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Detta är alla dina alternativ i JSON-format. Det inkluderar ditt användar-ID, så var noga med hur du hanterar datan."
|
||||
"message": "Detta är alla dina alternativ i JSON-format. Det inkluderar ditt användar-ID, så var noga med hur du hanterar informationen."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Ange alternativ"
|
||||
@@ -541,20 +565,41 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Icke-musik"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Markera"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Liveström: Donations-/meddelandeavläsningar"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Meddelandeläsning"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Hoppa över automatiskt"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Hoppa över manuellt"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Visa i sökfältet"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Inaktivera"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Hoppa Över Manuellt"
|
||||
"autoSkip_POI": {
|
||||
"message": "Hoppa automatiskt till start"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Visa Lager Ovanpå Spelare"
|
||||
"manualSkip_POI": {
|
||||
"message": "Fråga när video laddas"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Visa i sökfältet"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Hoppa över alla segment automatiskt när det finns ett icke-musiksegment"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Din färg är felaktigt formaterad. Det ska vara en 3- eller 6-siffrig hex-kod med en siffra i början."
|
||||
@@ -580,7 +625,7 @@
|
||||
"message": "Dina rapporter och röster KOMMER INTE RÄKNAS mot huvudservern. Använd endast detta för testning."
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Alla rapporter och röster KOMMER INTE RÄKNAS mot huvudservern så länge du är ansluten mot testservern. Se till att avaktivera detta när du vill rapportera ett riktigt sponsormeddelande."
|
||||
"message": "Alla inskickningar och röster KOMMER INTE ATT RÄKNAS mot huvudservern så länge du är ansluten mot testservern. Se till att inaktivera detta när du vill skicka in riktiga inskickningar."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Nu)"
|
||||
@@ -633,13 +678,13 @@
|
||||
"message": "Tvinga kontroll av kanalen innan hoppa över"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Som standard kommer segment att hoppas över direkt innan ens den vet vad det är för kanal. Som standard kan vissa segment i början av videon hoppas över på vitlistade kanaler. Aktiverar du detta alternativet kommer du att förhindra detta, men det göra att alla överhoppningar har en liten fördröjning eftersom det tar lite tid att få kanal-ID. Denna fördröjning kan vara obetydlig om du har en snabb internetuppkoppling."
|
||||
"message": "Som standard kommer segment att hoppas över direkt innan ens den vet vad det är för kanal. Som standard kan vissa segment i början av videon hoppas över på vitlistade kanaler. Aktiverar du detta alternativet kommer du att förhindra detta, men det gör att alla överhoppningar har en liten fördröjning eftersom det tar lite tid att få kanal-ID. Denna fördröjning kan vara obetydlig om du har en snabb internetuppkoppling."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Överväg att aktivera \"Tvinga kontroll av kanalen innan hoppa över\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Fel timing"
|
||||
"message": "Fel/Fel tidsintervall"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Fel kategori"
|
||||
@@ -666,11 +711,9 @@
|
||||
"help": {
|
||||
"message": "Hjälp"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Hjälp till att förhindra att detta försvinner"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Detta är en olistad videon som laddades upp före 2017.\nGamla olistade videor kommer att bli ändrade till privata nästa månad.\nVi samlar in *offentliga* videor för att säkerhetskopiera.\nVill du anonymt skicka den här videon till oss?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"GotIt": {
|
||||
"message": "Jag förstår",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Hoppa av alla framtida experiment",
|
||||
@@ -678,5 +721,81 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Dölj för alltid"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Du har fått en tillfällig varning och kan inte skicka in segment. Detta innebär att vi har upptäckt att några vanliga misstag är gjorda som inte är uppsåtliga och vi vill bara klargöra reglerna. Du kan också gå med i den här chatten genom att använda discord.gg/SponsorBlock eller matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Rösten avvisades på grund av en varning. Klicka för att öppna ett chattfönster för att lösa problemet eller kom tillbaka senare när du har tid.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Donera"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Dölj donationslänk"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Tack för att du installerade SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Granska alternativen nedan"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Många funktioner är inaktiverade som standard. Om du vill hoppa över intros, outros, använda Invidious, etc, aktivera dem nedan. Du kan också dölja/visa UI-element."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Hur hoppa över fungerar"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Videosegment hoppas över automatiskt om de finns i databasen. Du kan öppna popup-fönstret genom att klicka på tilläggsikonen för att få en förhandsvisning av vad de är."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "När du hoppar över ett segment får du ett meddelande. Om tidpunkten verkar felaktig rösta då ner genom att klicka på nerröstning! Du kan också rösta i popup-fönstret."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Skickar in"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Skicka in kan antingen göras i popup-fönstret genom att trycka på knappen \"Segmentet startar nu\" eller i videospelaren med knapparna på spelaren."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Genom att klicka på uppspelningsknappen anges början på ett segment och genom att klicka på stopp-ikonen anges slutet. Du kan förbereda flera sponsorer innan du trycker på skicka. Klicka på uppladdningsknappen för att skicka in. Klicka på papperskorgen för att ta bort."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Redigerar"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Om du gör fel kan du redigera eller ta bort dina segment efter att du klickat på uppåtpilen."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Detta är för långsamt"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Det finns snabbtangenter om du vill använda dem. Tryck på semikolontangenten för att ange start/slut på ett sponsorsegment och klicka på apostrofen för att skicka in. Dessa kan ändras i inställningarna. Om du inte använder QWERTY, bör du förmodligen ändra tangentbindningen."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Kan jag få en kopia av databasen? Vad händer om du försvinner?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Databasen är offentlig och finns på"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Källkoden är fritt tillgänglig. Så, även om något händer mig, är dina bidrag inte förlorade."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Nyheter och hur är det gjort"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Var kan jag få tag på källkoden?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Medverkande"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Nytt! Ta dig till stället i videon med ett klick med den nya markeringskategorin"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Läs mer"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,6 +212,9 @@
|
||||
"showNotice": {
|
||||
"message": "அறிவிப்பை மீண்டும் காட்டு"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "ஸ்பான்சர்கள், அறிமுகங்கள், அவுட்ரோஸ், சந்தா நினைவூட்டல்கள் மற்றும் YouTube வீடியோக்களின் பிற எரிச்சலூட்டும் பகுதிகளைத் தவிர்க்க ஸ்பான்சர் பிளாக் உங்களை அனுமதிக்கிறது. ஸ்பான்சர் பிளாக் என்பது ஒரு கூட்ட நெரிசலான உலாவி நீட்டிப்பாகும், இது ஸ்பான்சர் செய்யப்பட்ட பிரிவுகளின் தொடக்க மற்றும் இறுதி நேரங்களையும் YouTube வீடியோக்களின் பிற பிரிவுகளையும் எவரும் சமர்ப்பிக்கலாம். ஒரு நபர் இந்த தகவலைச் சமர்ப்பித்தவுடன், இந்த நீட்டிப்பு உள்ள மற்றவர்கள் ஸ்பான்சர் செய்யப்பட்ட பிரிவைத் தவிர்த்து விடுவார்கள். இசை வீடியோக்களின் இசை அல்லாத பிரிவுகளையும் நீங்கள் தவிர்க்கலாம்.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -269,9 +272,6 @@
|
||||
"skip_category": {
|
||||
"message": "{0} ஐ தவிர்?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "தவிர்க்கப்பட்டது"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "ஆட்டோ ஸ்கிப்பை முடக்கு"
|
||||
},
|
||||
@@ -332,12 +332,6 @@
|
||||
"createdBy": {
|
||||
"message": "உருவாக்கியது"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "ஆட்டோ ஸ்கிப்"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". இது தற்போது அமைக்கப்பட்டுள்ளது:"
|
||||
},
|
||||
@@ -504,8 +498,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "செய்தி வாசிப்பு"
|
||||
},
|
||||
"disable": {
|
||||
"message": "முடக்கு"
|
||||
"autoSkip": {
|
||||
"message": "ஆட்டோ ஸ்கிப்"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "கையேடு தவிர்"
|
||||
@@ -513,6 +507,9 @@
|
||||
"showOverlay": {
|
||||
"message": "சீக் பட்டியில் காட்டு"
|
||||
},
|
||||
"disable": {
|
||||
"message": "முடக்கு"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "உங்கள் நிறம் தவறாக வடிவமைக்கப்பட்டுள்ளது. இது ஆரம்பத்தில் எண் அடையாளத்துடன் 3 அல்லது 6 இலக்க ஹெக்ஸ் குறியீடாக இருக்க வேண்டும்."
|
||||
},
|
||||
|
||||
@@ -212,6 +212,9 @@
|
||||
"showNotice": {
|
||||
"message": "మళ్ళీ నోటీసు చూపించు"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "ఒక విభాగం దాటవేయబడిన తర్వాత నోటీసు చూపించు"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "స్పాన్సర్లు, పరిచయాలు, ros ట్రోలు, చందా రిమైండర్లు మరియు YouTube వీడియోల యొక్క ఇతర బాధించే భాగాలను దాటవేయడానికి స్పాన్సర్బ్లాక్ మిమ్మల్ని అనుమతిస్తుంది. స్పాన్సర్బ్లాక్ అనేది క్రౌడ్ సోర్స్డ్ బ్రౌజర్ పొడిగింపు, ఇది ఎవరైనా స్పాన్సర్ చేసిన విభాగాలు మరియు యూట్యూబ్ వీడియోల యొక్క ప్రారంభ మరియు ముగింపు సమయాన్ని సమర్పించనివ్వండి. ఒక వ్యక్తి ఈ సమాచారాన్ని సమర్పించిన తర్వాత, ఈ పొడిగింపు ఉన్న ప్రతి ఒక్కరూ ప్రాయోజిత విభాగంలో దాటవేస్తారు. మీరు మ్యూజిక్ వీడియోల యొక్క నాన్-మ్యూజిక్ విభాగాలను కూడా దాటవేయవచ్చు.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -269,9 +272,6 @@
|
||||
"skip_category": {
|
||||
"message": "{0} ని దాటవేయాలా?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "దాటవేయబడింది"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "ఆటో దాటవేయిని ఆపివేయి"
|
||||
},
|
||||
@@ -332,12 +332,6 @@
|
||||
"createdBy": {
|
||||
"message": "సృష్టికర్త"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "ఆటో దాటవేయి"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "ఒక విభాగం దాటవేయబడిన తర్వాత నోటీసు చూపించు"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". ఇది ప్రస్తుతం దీనికి సెట్ చేయబడింది:"
|
||||
},
|
||||
@@ -504,8 +498,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "సందేశ పఠనం"
|
||||
},
|
||||
"disable": {
|
||||
"message": "డిసేబుల్"
|
||||
"autoSkip": {
|
||||
"message": "ఆటో దాటవేయి"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "మాన్యువల్ దాటవేయి"
|
||||
@@ -513,6 +507,9 @@
|
||||
"showOverlay": {
|
||||
"message": "సీక్ బార్లో చూపించు"
|
||||
},
|
||||
"disable": {
|
||||
"message": "డిసేబుల్"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "మీ రంగు తప్పుగా ఆకృతీకరించబడింది. ఇది ప్రారంభంలో సంఖ్య గుర్తుతో 3 లేదా 6 అంకెల హెక్స్ కోడ్ అయి ఉండాలి."
|
||||
},
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
"message": "Bu videonun kısımları veri tabanımızda mevut"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Kısımlar bulunamadı"
|
||||
"message": "Kısım bulunamadı"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Kısım Şimdi Başlıyor"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "YouTube videosu bulunamadı.\nHatalı olduğunu düşünüyorsanız sayfayı yenileyin."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Kısımları tazele"
|
||||
},
|
||||
"success": {
|
||||
"message": "Başarılı!"
|
||||
},
|
||||
@@ -221,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Uyarıyı Tekrar Göster"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Bir Kısmı Atladıktan Sonra Uyarı Göster"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock, sponsorları, giriş ve bitiş kısımlarını, abonelik hatırlatıcılarını ve YouTube videolarının diğer can sıkıcı kısımlarını atlamanıza olanak tanır. SponsorBlock, herkesin sponsorlu kısımları ve YouTube videolarının diğer kısımlarının başlangıç ve bitiş zamanlarını göndermesine izin veren kitle kaynaklı bir tarayıcı uzantısıdır. Bir kişi bu bilgiyi gönderdikten sonra, bu uzantıya sahip diğer herkes sponsorlu kısımları hemen atlayacaktır. Müzik videolarının müzik dışı bölümlerini de atlayabilirsiniz.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,8 +287,17 @@
|
||||
"skip_category": {
|
||||
"message": "{0} atla?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "{0} kısmına atlansın mı?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Atlandı"
|
||||
"message": "{0} Atlandı",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0} kısmına atlandı",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Otomatik Atlamayı Devredışı Bırak"
|
||||
@@ -344,12 +359,6 @@
|
||||
"createdBy": {
|
||||
"message": "Oluşturan"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Otomatik Atla"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Bir Kısmı Atladıktan Sonra Uyarı Göster"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Şu an buna ayarlı:"
|
||||
},
|
||||
@@ -547,8 +556,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Canlı Yayın Mesajlarını Okumak"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Devredışı"
|
||||
"autoSkip": {
|
||||
"message": "Otomatik Atla"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Elle Atla"
|
||||
@@ -556,6 +565,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Arama Çubuğunda Göster"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Devredışı"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Başlangıca otomatik atla"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Videonun başında sor"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Arama Çubuğunda Göster"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Müzik olmayan kısım varsa tüm kısımları otomatik atla"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Renginiz yanlış biçimlendirilmiştir. Başında bir kare işareti bulunan 3 veya 6 basamaklı bir onaltılık kod olmalıdır."
|
||||
},
|
||||
@@ -666,17 +690,18 @@
|
||||
"help": {
|
||||
"message": "Yardım"
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Bunun kaybolmasını önlemeye yardımcı ol"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Bu video liste dışı ve 2017'den önce yüklenmiş\nListe dışı eski videolar önümüzdeki aydan itibaren gizli hâle getirilecek\n*Herkese açık* videoları derleyerek yedekliyoruz\nBu videoyu bize anonim kalarak göndermek ister misiniz?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Gelecekteki deneylerin hiçbirine katılma",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Asla gösterme"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Bir uyarı aldınız ve geçici bir süreliğine kısım gönderemeyeceksiniz. Sizin kısım göndermede zararlı olmayan bazı hatalar yaptığınızı belirledik ve size kuralları açıklamak istiyoruz. Bu sohbete discord.gg/SponsorBlock veya matrix.to/#/+sponsor:ajay.app üzerinden de katılabilirsiniz"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Bir uyarı nedeniyle oy reddedildi. Çözüm bulmak için buraya tıklayarak bir sohbet açın veya daha sonra vaktiniz olduğunda uğrayın.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Відео YouTube, не знайдено.\nЯкщо це не так, поновіть вкладку."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Оновити сегменти"
|
||||
},
|
||||
"success": {
|
||||
"message": "Успіх!"
|
||||
},
|
||||
@@ -185,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "Ця кнопка відкриває спливаюче вікно на сторінці YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Кнопка \"Автоматично сховати інформацію\""
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Приховати кнопку видалення в плеєрі YouTube"
|
||||
},
|
||||
@@ -218,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Показувати сповіщення знову"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Показувати сповіщення після пропуску сегмента"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock дозволяє пропускати спонсорські вставки, початкові і кінцеві заставки, прохання підписатися і інше в відео на YouTube. SponsorBlock - колективне розширення, яке дозволяє кожному надіслати час початку і кінця подібних сегментів в відео. Після того, як хто-небудь надсилає цю інформацію, всі інші користувачі розширення будуть автоматично пропускати ці сегменти. Так само можна пропускати частини кліпів без музики.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -278,8 +287,17 @@
|
||||
"skip_category": {
|
||||
"message": "Пропустити {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Пропустить до {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Пропущено"
|
||||
"message": "{0} Пропущено",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Пропущено до {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Вимкнути автоматичний пропуск"
|
||||
@@ -341,12 +359,6 @@
|
||||
"createdBy": {
|
||||
"message": "Створено"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Автоматичний пропуск"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Показувати сповіщення після пропуску сегмента"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Він зараз призначений на:"
|
||||
},
|
||||
@@ -390,6 +402,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Тривалість повідомлення пропуску (в секундах):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Повідомлення про пропуск залишиться на екрані принаймні так довго. Для пропуску вручну він може бути видимим довше."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Наступний діапазон часу коротше, ніж Ваше налаштування мінімальної тривалості. Це може означати, що він вже був надісланий, і просто ігнорується через це налаштування. Ви дійсно хочете надіслати?"
|
||||
},
|
||||
@@ -532,14 +550,20 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Без музики"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Основные"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Часть видео, которую ищут большинство людей. Аналогично комментарию «Видео начинается с X:XX»."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Прямі трансляції: пожертвування/читання повідомлення"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Читання повідомлень"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Вимкнути"
|
||||
"autoSkip": {
|
||||
"message": "Автоматичний пропуск"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Пропуск вручну"
|
||||
@@ -547,6 +571,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Показувати в смузі прокрутки"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Вимкнути"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Автоматический переход к началу"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Спросите, когда видео загружается"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Показать на панели поиска"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Автоматично пропустити усі сегменти, якщо присутній сегмент без музики"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Ви ввели колір в неправильному форматі. Це повинно бути 3-х або 6-ти значне шістнадцяткове число з символом # на початку."
|
||||
},
|
||||
@@ -654,11 +693,8 @@
|
||||
"categoryUpdate2": {
|
||||
"message": "Відкрийте налаштування, щоб пропускати початкові і кінцеві заставки, саморекламу та інше."
|
||||
},
|
||||
"experimentUnlistedTitle": {
|
||||
"message": "Допоможіть цьому не зникнути"
|
||||
},
|
||||
"experimentUnlistedText": {
|
||||
"message": "Це відео приховане і завантажено до 2017.\nСтарі приховані відео стануть приватними наступного місяця\nМи збираємо загальнодоступні відео для резервного копіювання\nЧи ви хочете анонімно надіслати це відео нам?\nhttps://support.google.com/youtube/answer/9230970"
|
||||
"help": {
|
||||
"message": "Довідка"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Відмова від усіх майбутніх експериментів",
|
||||
@@ -666,5 +702,12 @@
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Сховати назавжди"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Ви отримали попередження, тому тимчасово не можете обирати сегменти. Це означає, що ми помітили, що ви робили кілька поширених помилок, які не є злісними. Тому ми хочемо нагадати вам правила. Ви можете приєднатися до чату з правилами використовуючи discord.gg/SponsorBlock або matrix.to/#/+sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Голосування відхилено через попередження. Натисніть, щоб відкрити чат для вирішення цієї проблеми, або поверніться пізніше.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
"message": "Đoạn quảng cáo bắt đầu vào lúc này"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Đoạn quảng cáo kết thúc vào lúc này"
|
||||
"message": "Phân đoạn kết thúc vào lúc này"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Huỷ tạo phân đoạn"
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Không tìm thấy video nào.\nNếu sai, hãy thử tải lại thẻ này."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Làm mới segments"
|
||||
},
|
||||
"success": {
|
||||
"message": "Thành công!"
|
||||
},
|
||||
@@ -221,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "Hiện thông báo lại"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Hiển thị thông báo sau khi bỏ qua quảng cáo"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock giúp bạn bỏ qua quảng cáo từ nhà tài trợ, đoạn giới thiệu, đoạn kết, lời nhắc đăng ký kênh, và những phần khó chịu khác trong các video Youtube. SponsorBlock là một tiện ích mở rộng cho trình duyệt, cho phép tất cả người dùng đăng thời điểm bắt đầu và kết thúc của những đoạn quảng cáo từ nhà tài trợ và các đoạn khác trong video Youtube. Sau khi một người đăng thông tin này lên, tất cả mọi người dùng tiện ích mở rộng này sẽ bỏ qua đoạn quảng cáo đó. Bạn cũng có thể bỏ qua phần không có nhạc trong những video âm nhạc.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -281,11 +287,8 @@
|
||||
"skip_category": {
|
||||
"message": "Bỏ qua {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Đã bỏ qua"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Tắt tự động bỏ qua quảng cáo"
|
||||
"message": "Tắt tự động bỏ qua"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Bật tự động bỏ qua quảng cáo"
|
||||
@@ -344,12 +347,6 @@
|
||||
"createdBy": {
|
||||
"message": "Được tạo bởi"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Tự động bỏ qua quảng cáo"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Hiển thị thông báo sau khi bỏ qua quảng cáo"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Phím đang được đặt:"
|
||||
},
|
||||
@@ -393,6 +390,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Đoạn quảng cáo ngắn hơn giá trị được đặt sẽ không bị bỏ qua hoặc hiển thị trong trình chạy video."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Thời gian tự động đóng bảng thông báo phân đoạn (giây):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Đặt thời gian hiển thị bảng thông báo phân đoạn. Nếu như bạn tự nhấn nút bỏ qua, nó sẽ hiện lâu hơn 1 chút."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Đoạn quảng cáo sau ngắn hơn tùy chọn độ dài ngắn nhất của bạn. Điều này có thể có nghĩa là nó đã được đăng rồi, và không được bỏ qua vì tùy chọn này. Bạn có chắc muốn đăng nó không?"
|
||||
},
|
||||
@@ -494,7 +497,7 @@
|
||||
"message": "Quảng cáo không trả công/Tự quảng cáo"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác với."
|
||||
"message": "Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác cùng."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Nhắc tương tác (Đăng ký)"
|
||||
@@ -541,8 +544,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Đọc tin nhắn"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Tắt"
|
||||
"autoSkip": {
|
||||
"message": "Tự động bỏ qua quảng cáo"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Bỏ qua thủ công"
|
||||
@@ -550,11 +553,21 @@
|
||||
"showOverlay": {
|
||||
"message": "Hiện ở thanh xem trước"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Tắt"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Tự động bỏ qua tất cả các phân đoạn nếu trong video có phân đoạn không phải nhạc"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Mã màu sai định dạng. Mã màu phải có 3 hoặc 6 ký tự hệ hex và có dấu thăng ở đầu."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Màu khi chưa được gửi đi",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Màu của thanh xem trước"
|
||||
"message": "Màu của thanh tìm kiếm"
|
||||
},
|
||||
"category": {
|
||||
"message": "Thể loại"
|
||||
@@ -597,6 +610,28 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "đã bị ẩn: quá ngắn"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "Không xác định được ID kênh. Nếu bạn đang xem video này trên 1 trang web thứ 3, hãy mở lại video này trên trang chủ Youtube rồi thử lại. Điều này cũng có thể do những thay đổi trong mã nguồn trang web YouTube, nếu bạn nghĩ vậy, hãy bình luận tại đây:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "SponsorBlock không thể truy vấn dữ liệu lịch sử phân đoạn video. Có thể do trình chặn quảng cáo của bạn. Bạn có thể tìm hiểu nguyên nhân và cách fix ở đây: https://github.com/ajayyy/SponsorBlock/issues/741."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Có vẻ như SponsorBlock không thể truy cập API YouTube. Để khắc phục điều này, hãy chấp nhận lời nhắc cấp quyền sẽ xuất hiện tiếp theo, đợi vài giây rồi tải lại trang."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Cho phép truy cập"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Đã có quyền truy cập!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Truy cập bị từ chối, bạn đã nhấp vào từ chối à?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Nếu bạn không thể giải quyết được vấn đề này, hãy vô hiệu hoá cài đặt 'Bỏ qua video không công khai/riêng tư', vì SponsorBlock không thể lấy được thông tin của video này"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Bắt buộc kiểm tra kênh trước khi bỏ qua"
|
||||
},
|
||||
@@ -634,7 +669,18 @@
|
||||
"help": {
|
||||
"message": "Trợ giúp"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Từ chối tham gia thử nghiệm trong tương lai",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Ẩn vĩnh viễn"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Bạn đã nhận được một cảnh báo (Warring) và tạm thời không thể gửi các phân đoạn. Bạn đã mắc lỗi trong việc tạo quá nhiều lần (có thể là chọn sai kiểu phân đoạn hoặc sai thời gian phân đoạn). Chúng tôi muốn bạn nhận ra điều đó để có thể giúp bạn khắc phục điều này trong tương lai, không mắc lỗi nữa. Bạn có thể gặp các VIP User tại đây: discord.gg/SponsorBlock hoặc matrix.to/#/+sponsor:ajay.app. Bọn họ sẽ giúp bạn gỡ cảnh báo sau khi bạn đã hiểu ra lỗi sai của bạn."
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Bỏ phiếu bị từ chối do có cảnh báo. Nhấp để mở cuộc trò chuyện để giải quyết hoặc quay lại sau.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -215,6 +215,9 @@
|
||||
"showNotice": {
|
||||
"message": "重新显示通知"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "在跳过片段后显示通知"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock 可帮您跳过 YouTube 视频中的赞助商广告、开场、结尾、订阅提醒和其他烦人片段。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 YouTube 视频的赞助商广告和其他片段的开始和结束时间。若有一人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。您也可以跳过音乐视频中的非音乐部分。",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -272,9 +275,6 @@
|
||||
"skip_category": {
|
||||
"message": "跳过{0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "跳过"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "禁用自动跳过"
|
||||
},
|
||||
@@ -335,12 +335,6 @@
|
||||
"createdBy": {
|
||||
"message": "创建者"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "自动跳过"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "在跳过片段后显示通知"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。目前被设定为:"
|
||||
},
|
||||
@@ -510,8 +504,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "阅读消息"
|
||||
},
|
||||
"disable": {
|
||||
"message": "禁用"
|
||||
"autoSkip": {
|
||||
"message": "自动跳过"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "手动跳过"
|
||||
@@ -519,6 +513,9 @@
|
||||
"showOverlay": {
|
||||
"message": "在搜索栏中显示"
|
||||
},
|
||||
"disable": {
|
||||
"message": "禁用"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "颜色格式错误。应为以“#”开头的 3 位或 6 位十六进制数字。"
|
||||
},
|
||||
@@ -605,5 +602,8 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "打开选项,跳过开头,结尾,商业等。"
|
||||
},
|
||||
"help": {
|
||||
"message": "帮助"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,6 +85,9 @@
|
||||
"noVideoID": {
|
||||
"message": "找不到 YouTube 影片。\n如果這是不正確的,重新整理此分頁"
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "重新載入片段"
|
||||
},
|
||||
"success": {
|
||||
"message": "成功!"
|
||||
},
|
||||
@@ -185,6 +188,9 @@
|
||||
"whatInfoButton": {
|
||||
"message": "這個按鈕可用來在 YouTube 頁面打開彈出視窗"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "自動隱藏資訊按鈕"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "在 YouTube 播放器上隱藏刪除按鈕"
|
||||
},
|
||||
@@ -218,6 +224,9 @@
|
||||
"showNotice": {
|
||||
"message": "再次顯示通知"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "在跳過片段後顯示通知"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock 讓您可以跳過贊助工商,開場動畫,結束動畫,訂閱提醒等煩人的 YouTube 影片片段。SponsorBlock 是個大眾外包的網頁瀏覽器擴充功能,能讓任何人提交贊助片段的始與末。當一個人提交這個片段後,所有使用這個擴充功能的人都可以跳過該片段。您也可以跳過在音樂中的非音樂片段",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -278,9 +287,6 @@
|
||||
"skip_category": {
|
||||
"message": "跳過 {0}?"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "已跳過"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "停用自動跳過"
|
||||
},
|
||||
@@ -341,12 +347,6 @@
|
||||
"createdBy": {
|
||||
"message": "創建者"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "自動跳過"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "在跳過片段後顯示通知"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。它目前被設定為:"
|
||||
},
|
||||
@@ -387,6 +387,12 @@
|
||||
"minDurationDescription": {
|
||||
"message": "小於設定值的片段不會被跳過或在播放器中顯示"
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "跳過通知持續顯示時間(秒):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "跳過片段提示的顯示時間將會以上列時間長度為準(單位:秒);手動跳過的時候會顯示較長於上面的時間"
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "以下的提交小於您的最小時間設定。這表是它們可能已經被提交,只是被該設定忽略了。您確定要提交嗎?"
|
||||
},
|
||||
@@ -517,9 +523,15 @@
|
||||
"category_preview": {
|
||||
"message": "預覽/摘要"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "係指影片的前情提要或內容預告等刻意編輯過的內容"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "音樂:非音樂部分"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "此功能僅供音樂影片使用。本功能僅應該用於音樂錄影帶中並未包含其他類別的段落。"
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "非音樂"
|
||||
},
|
||||
@@ -529,8 +541,8 @@
|
||||
"category_livestream_messages_short": {
|
||||
"message": "閱讀訊息"
|
||||
},
|
||||
"disable": {
|
||||
"message": "停用"
|
||||
"autoSkip": {
|
||||
"message": "自動跳過"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "手動跳過"
|
||||
@@ -538,6 +550,12 @@
|
||||
"showOverlay": {
|
||||
"message": "在時間條顯示"
|
||||
},
|
||||
"disable": {
|
||||
"message": "停用"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "自動跳過非音樂片段(如果有的話)"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "您設定的顏色無效。它應該是三或六位數的 hex 碼,且以井字號開頭。"
|
||||
},
|
||||
@@ -589,11 +607,15 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "隱藏:太短"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "未偵測到頻道ID,如果您正在使用嵌入式YouTube播放器,請移至YouTube網站上觀看本影片。此問題亦有可能是由於YouTube改變了系統架構,如果你認為這是造成此問題的原因,請留言告訴我們:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "似乎有東西在阻止 SponsorBlock 獲取影片資料。請查看 https://github.com/ajayyy/SponsorBlock/issues/741 以了解更多資訊。"
|
||||
"message": "似乎有東西在阻止 SponsorBlock 取得影片資料。請至 https://github.com/ajayyy/SponsorBlock/issues/741 以了解更多資訊。"
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "SponsorBlock 貌似無法存取 YouTube API。若要解決,請同意稍後出現的權限提示,等待幾秒鐘,然後重新載入頁面。"
|
||||
"message": "SponsorBlock 貌似無法存取 YouTube API。若要解決此問題,請同意稍後出現的權限提示,等待幾秒鐘,然後重新載入頁面。"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "允許權限"
|
||||
@@ -642,7 +664,7 @@
|
||||
"message": "開啟選項以跳過開場、結尾、工商等。"
|
||||
},
|
||||
"help": {
|
||||
"message": "幫助"
|
||||
"message": "說明"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "關閉所有未來的實驗性功能",
|
||||
|
||||
@@ -106,12 +106,10 @@
|
||||
|
||||
@keyframes fadeIn {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 1; }
|
||||
}
|
||||
|
||||
@keyframes fadeOut {
|
||||
from { opacity: 1; }
|
||||
to { opacity: 0; }
|
||||
to { opacity: 0; }
|
||||
}
|
||||
|
||||
.sponsorBlockSpacer {
|
||||
@@ -121,16 +119,28 @@
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.sponsorSkipNotice {
|
||||
min-width: 350px;
|
||||
background-color: rgba(28, 28, 28, 0.9);
|
||||
position: absolute;
|
||||
.sbChatNotice {
|
||||
min-width: 350px;
|
||||
height: 70%;
|
||||
|
||||
position: absolute;
|
||||
right: 5px;
|
||||
bottom: 100px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeParent {
|
||||
position: absolute;
|
||||
|
||||
bottom: 100px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeParent, .sponsorSkipNotice {
|
||||
min-width: 350px;
|
||||
max-width: 50%;
|
||||
|
||||
border-radius: 5px;
|
||||
|
||||
border-spacing: 5px 10px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
@@ -138,17 +148,34 @@
|
||||
border-collapse: unset;
|
||||
}
|
||||
|
||||
.sponsorSkipNotice {
|
||||
min-width: 350px;
|
||||
background-color: rgba(28, 28, 28, 0.9);
|
||||
|
||||
transition: all 0.1s ease-out;
|
||||
}
|
||||
|
||||
.sponsorSkipNotice .hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* For Cloudtube */
|
||||
.sponsorSkipNotice td, .sponsorSkipNotice table, .sponsorSkipNotice th {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeFadeIn {
|
||||
animation: fadeIn 0.5s;
|
||||
animation: fadeIn 0.5s ease-out;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeFaded {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeFadeOut {
|
||||
animation: fadeOut 3s cubic-bezier(0.55, 0.055, 0.675, 0.19);
|
||||
transition: opacity 3s cubic-bezier(0.55, 0.055, 0.675, 0.19);
|
||||
opacity: 0 !important;
|
||||
animation: none !important;
|
||||
}
|
||||
|
||||
.sponsorSkipNotice .sponsorSkipNoticeTimeLeft {
|
||||
@@ -158,14 +185,28 @@
|
||||
padding: 2px 5px;
|
||||
font-size: 12px;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
border: 1px solid #eeeeee;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeTimeLeft img {
|
||||
vertical-align: middle;
|
||||
height: 13px;
|
||||
|
||||
padding-top: 7.8%;
|
||||
padding-bottom: 7.8%;
|
||||
}
|
||||
|
||||
/* if two are very close to eachother */
|
||||
.secondSkipNotice {
|
||||
bottom: 250px;
|
||||
}
|
||||
|
||||
transition: bottom 0.2s;
|
||||
.noticeLeftIcon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.sponsorSkipNotice .sponsorSkipNoticeUnskipSection {
|
||||
@@ -209,7 +250,9 @@
|
||||
|
||||
float: right;
|
||||
|
||||
margin-right: 5px;
|
||||
margin-right: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeRightButton {
|
||||
@@ -232,7 +275,9 @@
|
||||
font-weight: bold;
|
||||
color: rgb(235, 235, 235);
|
||||
|
||||
margin-top: auto;
|
||||
display: inline-block;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.sponsorSkipInfo {
|
||||
@@ -445,4 +490,53 @@ input::-webkit-inner-spin-button {
|
||||
}
|
||||
.helpButton:hover {
|
||||
filter: brightness(80%);
|
||||
}
|
||||
|
||||
.sbChatNotice iframe {
|
||||
height: 32px;
|
||||
cursor: pointer;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.sbChatClose {
|
||||
height: 14px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.skipButtonControlBarContainer {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.skipButtonControlBarContainer.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#sbSkipIconControlBarImage {
|
||||
height: 60%;
|
||||
top: 0px;
|
||||
bottom: 0px;
|
||||
display: block;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.sponsorBlockTooltip {
|
||||
position: absolute;
|
||||
background-color: rgba(28, 28, 28, 0.7);
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
max-width: 300px;
|
||||
white-space: normal;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
.sponsorBlockTooltip::after {
|
||||
content: " ";
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 15%;
|
||||
margin-left: -15px;
|
||||
border-width: 15px;
|
||||
border-style: solid;
|
||||
border-color: rgba(28, 28, 28, 0.7) transparent transparent transparent;
|
||||
}
|
||||
BIN
public/help/images/popup.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
public/help/images/voting on notice.gif
Normal file
|
After Width: | Height: | Size: 95 KiB |
@@ -5,6 +5,9 @@
|
||||
<meta charset="utf-8">
|
||||
|
||||
<link href="styles.css" rel="stylesheet"/>
|
||||
|
||||
<script src="../js/vendor.js"></script>
|
||||
<script src="../js/help.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -14,102 +17,92 @@
|
||||
SponsorBlock
|
||||
</div>
|
||||
|
||||
<div class="container">
|
||||
<div class="container sponsorBlockPageBody">
|
||||
|
||||
<p class="createdBy">Created By <a href="https://ajay.app">Ajay Ramachandran</a> <img src="https://ajay.app/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
|
||||
|
||||
<p>
|
||||
Thanks for installing SponsorBlock. Here are some quick tips for getting started. Feel free to contact me if you have any questions. By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>.
|
||||
<p class="createdBy">
|
||||
<img src="https://ajay.app/newprofilepic.jpg" height="30" class="profilepiccircle"/>
|
||||
Created By <a href="https://ajay.app">Ajay Ramachandran</a>
|
||||
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">(Donate)</a>
|
||||
</p>
|
||||
|
||||
<p class="projectPreview">
|
||||
Come contribute, make some suggestions and help out in the Discord: <a href="https://discord.gg/QnmVMpU">https://discord.gg/QnmVMpU</a>
|
||||
<p>
|
||||
__MSG_helpPageThanksForInstalling__ By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>.
|
||||
</p>
|
||||
|
||||
<p style="margin-bottom: 0" class="bigText center">Please review the options below</p>
|
||||
|
||||
<p>
|
||||
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.
|
||||
Come contribute, make some suggestions and help out on <a href="https://discord.gg/QnmVMpU">Discord</a> or on <a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org">Matrix</a>.
|
||||
</p>
|
||||
|
||||
<p style="margin-bottom: 0; margin-top: 0" class="bigText center">__MSG_helpPageReviewOptions__</p>
|
||||
|
||||
<p class="smallText">
|
||||
__MSG_helpPageFeatureDisclaimer__
|
||||
</p>
|
||||
|
||||
<iframe src="../options/options.html#embed" width="100%" height="500px" style="border: none"></iframe>
|
||||
|
||||
<h1>How skipping works</h1>
|
||||
<h1>__MSG_helpPageHowSkippingWorks__</h1>
|
||||
|
||||
<p class="projectPreview">
|
||||
<span class="projectPreviewImageLarge">
|
||||
<img src="https://i.imgur.com/caf5Bju.png">
|
||||
<img src="images/popup.png">
|
||||
</span>
|
||||
|
||||
Video segments will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are.
|
||||
__MSG_helpPageHowSkippingWorks1__
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup.
|
||||
__MSG_helpPageHowSkippingWorks2__
|
||||
</p>
|
||||
|
||||
<div class="center"><img height="120px" src="https://user-images.githubusercontent.com/12688112/63067735-5a638700-bede-11e9-8147-f321b57527ec.gif"></div>
|
||||
<div class="center"><img height="120px" src="images/voting on notice.gif"></div>
|
||||
|
||||
<h1>Submitting</h1>
|
||||
<h1>__MSG_Submitting__</h1>
|
||||
|
||||
<p class="projectPreview">
|
||||
<span class="projectPreviewImageLargeRight">
|
||||
<img src="https://i.imgur.com/A1ilk6x.gif">
|
||||
</span>
|
||||
|
||||
Submitting can either be done in the popup by hitting the "Sponsorship Starts Now" button or in the video player with the buttons on the player.
|
||||
__MSG_helpPageSubmitting1__
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
Clicking the play button indicated the start of a sponsorship section and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete.
|
||||
__MSG_helpPageSubmitting2__
|
||||
</p>
|
||||
|
||||
<h1>Editing</h1>
|
||||
<h1>__MSG_Editing__</h1>
|
||||
|
||||
<p class="projectPreview">
|
||||
<span class="projectPreviewImageLarge">
|
||||
<img src="https://i.imgur.com/DZHqbsx.gif">
|
||||
<img src="https://wiki.sponsor.ajay.app/images/6/6a/Popup_only.png">
|
||||
</span>
|
||||
|
||||
If you messed up, you can edit or delete your sponsor times in the popup or in the info menu (by hitting the info icon).
|
||||
__MSG_helpPageEditing1__
|
||||
|
||||
</p>
|
||||
|
||||
<h1>This is too slow</h1>
|
||||
<h1>__MSG_helpPageTooSlow__</h1>
|
||||
|
||||
<p>
|
||||
There are hotkeys if you want to use them. You must be focused on the YouTube player to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit.
|
||||
These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding.
|
||||
__MSG_helpPageTooSlow1__
|
||||
</p>
|
||||
|
||||
<h1>I hate these buttons, they are so ugly</h1>
|
||||
<h1>__MSG_helpPageCopyOfDatabase__</h1>
|
||||
|
||||
<p>
|
||||
All player buttons can be hidden in the options.
|
||||
__MSG_helpPageCopyOfDatabase1__ <a href="https://sponsor.ajay.app/database">https://sponsor.ajay.app/database</a>. __MSG_helpPageCopyOfDatabase2__
|
||||
</p>
|
||||
|
||||
<h1>Can I get a copy of the Database? What happens if you disappear?</h1>
|
||||
|
||||
<p>
|
||||
The database is public and available at <a href="https://sponsor.ajay.app/database.db">https://sponsor.ajay.app/database.db</a>. The source code is freely available. So, even if something happens to me, your submissions are not lost.
|
||||
</p>
|
||||
|
||||
<h1>News and how it is made</h1>
|
||||
<h1>__MSG_helpPageNews__</h1>
|
||||
|
||||
<p>
|
||||
See <a href="https://sponsor.ajay.app/news">https://sponsor.ajay.app/news</a>.
|
||||
</p>
|
||||
|
||||
<h1>I want more features!</h1>
|
||||
|
||||
<p>
|
||||
Ask on Discord or make an Issue on GitHub. I am happy to hear suggestions or improvements you want. You may also contribute code or graphics if you would like.
|
||||
</p>
|
||||
|
||||
<h1>Where can I get the source code?</h1>
|
||||
<h1>__MSG_helpPageSourceCode__</h1>
|
||||
|
||||
<h4 style="display: inline">Client:</h4>
|
||||
<!-- Github logo -->
|
||||
@@ -119,7 +112,7 @@
|
||||
<!-- Github logo -->
|
||||
<a href="https://github.com/ajayyy/SponsorBlockServer"><svg aria-hidden="true" version="1.1" viewBox="0 0 16 16" height="58px" style="padding-left: 15px"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a>
|
||||
|
||||
<h1>Credits</h1>
|
||||
<h1>__MSG_Credits__</h1>
|
||||
|
||||
<p>
|
||||
Thanks to all <a href="https://github.com/ajayyy/SponsorBlock/graphs/contributors">SponsorBlock contributors</a>,
|
||||
@@ -1,3 +1,7 @@
|
||||
html {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
.bigText {
|
||||
font-size: 50px;
|
||||
}
|
||||
@@ -125,8 +129,11 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
p,li {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
p,li,a {
|
||||
font-size: 20px;
|
||||
color: #c4c4c4;
|
||||
}
|
||||
|
||||
@@ -176,4 +183,8 @@ h1,h2,h3,h4,h5,h6 {
|
||||
|
||||
svg {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#sbDonate {
|
||||
font-size: 10px;
|
||||
}
|
||||
@@ -41,12 +41,13 @@
|
||||
id="namedview18"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.83098592"
|
||||
inkscape:cx="-238.41697"
|
||||
inkscape:cy="258.22009"
|
||||
inkscape:cx="220.07455"
|
||||
inkscape:cy="308.76246"
|
||||
inkscape:window-x="477"
|
||||
inkscape:window-y="961"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg16" />
|
||||
inkscape:current-layer="svg16"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
|
||||
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.1 KiB |
59
public/icons/pause.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"
|
||||
height="24px"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
fill="#000000"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="pause.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="M6 19h4V5H6v14zm8-14v14h4V5h-4z"
|
||||
id="path4"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
71
public/icons/skipIcon.svg
Normal file
@@ -0,0 +1,71 @@
|
||||
<?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 565.15 568"
|
||||
version="1.1"
|
||||
id="svg16"
|
||||
sodipodi:docname="skipIcon.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||
inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png"
|
||||
inkscape:export-xdpi="43.436523"
|
||||
inkscape:export-ydpi="43.436523">
|
||||
<metadata
|
||||
id="metadata20">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>LogoSponsorBlocker2</dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1001"
|
||||
id="namedview18"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.6619718"
|
||||
inkscape:cx="316.31071"
|
||||
inkscape:cy="330.01409"
|
||||
inkscape:window-x="477"
|
||||
inkscape:window-y="961"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg16"
|
||||
inkscape:pagecheckerboard="true" />
|
||||
<defs
|
||||
id="defs4">
|
||||
<style
|
||||
id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style>
|
||||
</defs>
|
||||
<title
|
||||
id="title6">LogoSponsorBlocker2</title>
|
||||
<path
|
||||
class="cls-1"
|
||||
d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z"
|
||||
id="path8"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#ffffff" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 188.7168 140.07227 L 312.64844 264.00586 L 188.7168 387.9375 L 159.5918 358.8125 L 254.19336 264.00586 L 159.5918 169.19727 L 188.7168 140.07227 z M 305.625 140.07227 L 429.55859 264.00586 L 305.625 387.9375 L 276.50195 358.8125 L 371.10352 264.00586 L 276.50195 169.19727 L 305.625 140.07227 z "
|
||||
id="path10" />
|
||||
<g
|
||||
id="g825"
|
||||
transform="translate(-3.86549,36.564644)" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
59
public/icons/stop.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"
|
||||
height="24px"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
fill="#000000"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="stop.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="M6 6h12v12H6z"
|
||||
id="path4"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -1,4 +1,8 @@
|
||||
/* Options page CSS */
|
||||
html {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
@@ -339,10 +343,13 @@ svg {
|
||||
|
||||
.categoryTableElement > * {
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.categoryTableDescription > * {
|
||||
padding-bottom: 15px;
|
||||
}
|
||||
|
||||
.categoryOptionsSelector {
|
||||
.optionsSelector {
|
||||
background-color: #c00000;
|
||||
color: white;
|
||||
|
||||
@@ -357,4 +364,8 @@ svg {
|
||||
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#sbDonate {
|
||||
font-size: 10px;
|
||||
}
|
||||
@@ -19,7 +19,12 @@
|
||||
</div>
|
||||
|
||||
<div class="center">
|
||||
<p class="createdBy titleBar">__MSG_createdBy__ <a href="https://ajay.app">Ajay Ramachandran</a> <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
|
||||
<p class="createdBy titleBar">
|
||||
<img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/>
|
||||
__MSG_createdBy__
|
||||
<a href="https://ajay.app">Ajay Ramachandran</a>
|
||||
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">(__MSG_Donate__)</a>
|
||||
</p>
|
||||
|
||||
<h1>__MSG_Options__</h1>
|
||||
|
||||
@@ -29,6 +34,22 @@
|
||||
|
||||
</div>
|
||||
|
||||
<div option-type="toggle" sync-option="autoSkipOnMusicVideos">
|
||||
<label class="switch-container">
|
||||
<label class="switch">
|
||||
<input type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
<div class="switch-label">
|
||||
__MSG_autoSkipOnMusicVideos__
|
||||
</div>
|
||||
</label>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
@@ -194,9 +215,21 @@
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="selector" sync-option="noticeVisibilityMode">
|
||||
<select class="selector-element optionsSelector" >
|
||||
<option value="0">__MSG_noticeVisibilityMode0__</option>
|
||||
<option value="1">__MSG_noticeVisibilityMode1__</option>
|
||||
<option value="2">__MSG_noticeVisibilityMode2__</option>
|
||||
<option value="3">__MSG_noticeVisibilityMode3__</option>
|
||||
<option value="4">__MSG_noticeVisibilityMode4__</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
@@ -423,6 +456,24 @@
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="toggle" toggle-type="reverse" sync-option="showDonationLink" no-safari="true">
|
||||
<label class="switch-container">
|
||||
<label class="switch">
|
||||
<input type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
<div class="switch-label">
|
||||
__MSG_hideDonationLink__
|
||||
</div>
|
||||
</label>
|
||||
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
<br/>
|
||||
|
||||
<div option-type="private-text-change" sync-option="userID" confirm-message="userIDChangeWarning">
|
||||
<div class="option-button trigger-button">
|
||||
|
||||
@@ -1,4 +1,8 @@
|
||||
/* Options page CSS */
|
||||
html {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,10 @@
|
||||
--sb-green-bg: #077B27;
|
||||
}
|
||||
|
||||
#sponsorBlockPopupHTML {
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
#sponsorBlockPopupBody .hidden {
|
||||
display: none !important;
|
||||
}
|
||||
@@ -28,6 +32,8 @@
|
||||
margin: auto;
|
||||
width: 374px;
|
||||
background: var(--sb-main-bg-color);
|
||||
|
||||
color-scheme: dark;
|
||||
}
|
||||
|
||||
#sponsorblockPopup {
|
||||
@@ -312,6 +318,11 @@ label>p, #disableExtension>p, #usernameValue, #usernameElement > div > p,#sponso
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
from { transform: rotate(0deg); }
|
||||
to { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
.SBWhitelistIconContainer, button#optionsButton {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
@@ -1,152 +1,154 @@
|
||||
<head>
|
||||
<title>__MSG_openPopup__</title>
|
||||
<link id="sponsorBlockPopupFont" rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css">
|
||||
<link id="sponsorBlockStyleSheet" rel="stylesheet" type="text/css" href="popup.css">
|
||||
<html id="sponsorBlockPopupHTML">
|
||||
<head>
|
||||
<title>__MSG_openPopup__</title>
|
||||
<link id="sponsorBlockPopupFont" rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css">
|
||||
<link id="sponsorBlockStyleSheet" rel="stylesheet" type="text/css" href="popup.css">
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
<body id="sponsorBlockPopupBody">
|
||||
<div id="sponsorblockPopup" class="sponsorBlockPageBody preload">
|
||||
<div class="logoText bottomSpace">
|
||||
<img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo">
|
||||
<p>SponsorBlock</p>
|
||||
</div>
|
||||
<div id="videoInfo" class="bottomSpace">
|
||||
<div class="bottomSpace">
|
||||
<!-- Loading text -->
|
||||
<p id="loadingIndicator">__MSG_noVideoID__</p>
|
||||
<!-- If the video was found in the database -->
|
||||
<p id="videoFound"></p>
|
||||
<button class="sbSlimButton" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
|
||||
<img id="refreshSegments" src="/icons/refresh.svg"/>
|
||||
</button>
|
||||
<body id="sponsorBlockPopupBody">
|
||||
<div id="sponsorblockPopup" class="sponsorBlockPageBody preload">
|
||||
<div class="logoText bottomSpace">
|
||||
<img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo">
|
||||
<p>SponsorBlock</p>
|
||||
</div>
|
||||
<div id="issueReporterContainer">
|
||||
<div id="issueReporterTimeButtons"></div>
|
||||
<div id="videoInfo" class="bottomSpace">
|
||||
<div class="bottomSpace">
|
||||
<!-- Loading text -->
|
||||
<p id="loadingIndicator">__MSG_noVideoID__</p>
|
||||
<!-- If the video was found in the database -->
|
||||
<p id="videoFound"></p>
|
||||
<button class="sbSlimButton hidden" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
|
||||
<img id="refreshSegments" src="/icons/refresh.svg"/>
|
||||
</button>
|
||||
</div>
|
||||
<div id="issueReporterContainer">
|
||||
<div id="issueReporterTimeButtons"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="sidebyside">
|
||||
<div id="disableExtension">
|
||||
<!--github: mbledkowski/toggle-switch-->
|
||||
<label for="toggleSwitch" class="toggleSwitchContainer">
|
||||
<input type="checkbox" style="display:none;" id="toggleSwitch" checked>
|
||||
<span class="switchBg shadow"></span>
|
||||
<span class="switchBg white"></span>
|
||||
<span class="switchBg green"></span>
|
||||
<span class="switchDot"></span>
|
||||
</label>
|
||||
<p id="disableSkipping">__MSG_disableSkipping__</p>
|
||||
<p id="enableSkipping" style="display: none">__MSG_enableSkipping__</p>
|
||||
</div>
|
||||
<div id="additionalButtons">
|
||||
<!-- grayedOut until loading complete -->
|
||||
<div id="whitelistButton" class="hidden bottomSpace" title="__MSG_forceChannelCheckPopup__">
|
||||
<input type="checkbox" style="display:none;" id="whitelistToggle">
|
||||
<label for="whitelistToggle" class="whitelistToggleText">
|
||||
<div class="SBWhitelistIconContainer">
|
||||
<svg viewBox="0 0 24 24" width="16" height="16" class="SBWhitelistIcon">
|
||||
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p id="whitelistChannel">__MSG_whitelistChannel__</p>
|
||||
<p id="unwhitelistChannel" style="display: none">__MSG_removeFromWhitelist__</p>
|
||||
<div class="sidebyside">
|
||||
<div id="disableExtension">
|
||||
<!--github: mbledkowski/toggle-switch-->
|
||||
<label for="toggleSwitch" class="toggleSwitchContainer">
|
||||
<input type="checkbox" style="display:none;" id="toggleSwitch" checked>
|
||||
<span class="switchBg shadow"></span>
|
||||
<span class="switchBg white"></span>
|
||||
<span class="switchBg green"></span>
|
||||
<span class="switchDot"></span>
|
||||
</label>
|
||||
<p id="disableSkipping">__MSG_disableSkipping__</p>
|
||||
<p id="enableSkipping" style="display: none">__MSG_enableSkipping__</p>
|
||||
</div>
|
||||
<button id="optionsButton" title="__MSG_optionsInfo__">
|
||||
<img src="/icons/settings.svg" alt="Settings icon" width="16" height="16" id="sbPopupIconSettings">
|
||||
__MSG_Options__
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="whitelistForceCheck" class="hidden">
|
||||
__MSG_forceChannelCheckPopup__
|
||||
</div>
|
||||
|
||||
<div id="mainControls" style="display: none">
|
||||
<p class="sbHeader sbSubHeader">
|
||||
__MSG_recordTimesDescription__
|
||||
</p>
|
||||
<sub style="margin-bottom: 12px;">__MSG_popupHint__</sub>
|
||||
<div>
|
||||
<button id="sponsorStart" class="mediumButton">__MSG_sponsorStart__</button>
|
||||
</div>
|
||||
<div id="submissionSection" style="display: none">
|
||||
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
|
||||
<div id="submitTimesContainer" style="margin-top: 12px;">
|
||||
<button id="submitTimes" class="mediumButton">__MSG_submitTimesButton__</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h1 class="recordingSubtitle sbHeader sbSubHeader">__MSG_yourWork__</h1>
|
||||
<div class="sidebyside">
|
||||
<div id="usernameElement">
|
||||
<div>
|
||||
<p>__MSG_Username__:</p>
|
||||
<div id="setUsernameContainer">
|
||||
<p id="usernameValue"></p>
|
||||
<button id="setUsernameButton" title="__MSG_setUsername__">
|
||||
<img src="/icons/pencil.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconEdit">
|
||||
</button>
|
||||
<div id="additionalButtons">
|
||||
<!-- grayedOut until loading complete -->
|
||||
<div id="whitelistButton" class="hidden bottomSpace" title="__MSG_forceChannelCheckPopup__">
|
||||
<input type="checkbox" style="display:none;" id="whitelistToggle">
|
||||
<label for="whitelistToggle" class="whitelistToggleText">
|
||||
<div class="SBWhitelistIconContainer">
|
||||
<svg viewBox="0 0 24 24" width="16" height="16" class="SBWhitelistIcon">
|
||||
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
|
||||
</svg>
|
||||
</div>
|
||||
<p id="whitelistChannel">__MSG_whitelistChannel__</p>
|
||||
<p id="unwhitelistChannel" style="display: none">__MSG_removeFromWhitelist__</p>
|
||||
</label>
|
||||
</div>
|
||||
<div id="setUsername" style="display: none">
|
||||
<div id="setUsernameStatusContainer" style="display: none">
|
||||
<p id="setUsernameStatus"></p>
|
||||
<button id="optionsButton" title="__MSG_optionsInfo__">
|
||||
<img src="/icons/settings.svg" alt="Settings icon" width="16" height="16" id="sbPopupIconSettings">
|
||||
__MSG_Options__
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="whitelistForceCheck" class="hidden">
|
||||
__MSG_forceChannelCheckPopup__
|
||||
</div>
|
||||
|
||||
<div id="mainControls" style="display: none">
|
||||
<p class="sbHeader sbSubHeader">
|
||||
__MSG_recordTimesDescription__
|
||||
</p>
|
||||
<sub style="margin-bottom: 12px;">__MSG_popupHint__</sub>
|
||||
<div>
|
||||
<button id="sponsorStart" class="mediumButton">__MSG_sponsorStart__</button>
|
||||
</div>
|
||||
<div id="submissionSection" style="display: none">
|
||||
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
|
||||
<div id="submitTimesContainer" style="margin-top: 12px;">
|
||||
<button id="submitTimes" class="mediumButton">__MSG_submitTimesButton__</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h1 class="recordingSubtitle sbHeader sbSubHeader">__MSG_yourWork__</h1>
|
||||
<div class="sidebyside">
|
||||
<div id="usernameElement">
|
||||
<div>
|
||||
<p>__MSG_Username__:</p>
|
||||
<div id="setUsernameContainer">
|
||||
<p id="usernameValue"></p>
|
||||
<button id="setUsernameButton" title="__MSG_setUsername__">
|
||||
<img src="/icons/pencil.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconEdit">
|
||||
</button>
|
||||
</div>
|
||||
<input id="usernameInput" hint="Username"></input>
|
||||
<button id="submitUsername">
|
||||
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
|
||||
</button>
|
||||
<div id="setUsername" style="display: none">
|
||||
<div id="setUsernameStatusContainer" style="display: none">
|
||||
<p id="setUsernameStatus"></p>
|
||||
</div>
|
||||
<input id="usernameInput" hint="Username"></input>
|
||||
<button id="submitUsername">
|
||||
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="sponsorTimesContributionsContainer" class="hidden">
|
||||
<div>
|
||||
<p>__MSG_Submissions__:</p>
|
||||
<span id="sponsorTimesContributionsDisplay">
|
||||
0
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="sponsorTimesContributionsContainer" class="hidden">
|
||||
<div>
|
||||
<p>__MSG_Submissions__:</p>
|
||||
<span id="sponsorTimesContributionsDisplay">
|
||||
|
||||
<span id="sponsorTimesViewsContainer" style="display: none">
|
||||
__MSG_savedPeopleFrom__
|
||||
<b><span id="sponsorTimesViewsDisplay">
|
||||
0
|
||||
</span></b>
|
||||
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
|
||||
<br>
|
||||
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
|
||||
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
|
||||
<span>__MSG_youHaveSavedTimeEnd__</span>).
|
||||
</span>
|
||||
<div id="sponsorTimesSkipsDoneContainer" style="display: none">
|
||||
__MSG_youHaveSkipped__
|
||||
<b><span id="sponsorTimesSkipsDoneDisplay">
|
||||
0
|
||||
</span></b>
|
||||
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
|
||||
(<b><span id="sponsorTimeSavedDisplay">
|
||||
0
|
||||
</span>
|
||||
</div>
|
||||
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
|
||||
</div>
|
||||
</div>
|
||||
<footer id="sbFooter">
|
||||
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a> |
|
||||
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
|
||||
<br/>
|
||||
<a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> |
|
||||
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
|
||||
<a id="helpButton" style="cursor: pointer;">__MSG_help__</a> |
|
||||
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
|
||||
</footer>
|
||||
|
||||
<span id="sponsorTimesViewsContainer" style="display: none">
|
||||
__MSG_savedPeopleFrom__
|
||||
<b><span id="sponsorTimesViewsDisplay">
|
||||
0
|
||||
</span></b>
|
||||
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
|
||||
<br>
|
||||
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
|
||||
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
|
||||
<span>__MSG_youHaveSavedTimeEnd__</span>).
|
||||
</span>
|
||||
<div id="sponsorTimesSkipsDoneContainer" style="display: none">
|
||||
__MSG_youHaveSkipped__
|
||||
<b><span id="sponsorTimesSkipsDoneDisplay">
|
||||
0
|
||||
</span></b>
|
||||
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
|
||||
(<b><span id="sponsorTimeSavedDisplay">
|
||||
0
|
||||
</span>
|
||||
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
|
||||
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>
|
||||
</div>
|
||||
<footer id="sbFooter">
|
||||
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a> |
|
||||
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
|
||||
<br/>
|
||||
<a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> |
|
||||
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
|
||||
<a id="helpButton" style="cursor: pointer;">__MSG_help__</a> |
|
||||
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
|
||||
</footer>
|
||||
|
||||
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>
|
||||
</div>
|
||||
<!-- Scripts that need to load after the html -->
|
||||
<script src="./js/vendor.js" async></script>
|
||||
<script src="./js/popup.js" async></script>
|
||||
</body>
|
||||
<!-- Scripts that need to load after the html -->
|
||||
<script src="./js/vendor.js" async></script>
|
||||
<script src="./js/popup.js" async></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -32,10 +32,10 @@ chrome.tabs.onUpdated.addListener(function(tabId) {
|
||||
chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
switch(request.message) {
|
||||
case "openConfig":
|
||||
chrome.runtime.openOptionsPage();
|
||||
chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))});
|
||||
return;
|
||||
case "openHelp":
|
||||
chrome.tabs.create({url: chrome.runtime.getURL('help/index_en.html')});
|
||||
chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')});
|
||||
return;
|
||||
case "openPage":
|
||||
chrome.tabs.create({url: chrome.runtime.getURL(request.url)});
|
||||
@@ -74,12 +74,14 @@ chrome.runtime.onInstalled.addListener(function () {
|
||||
// If there is no userID, then it is the first install.
|
||||
if (!userID){
|
||||
//open up the install page
|
||||
chrome.tabs.create({url: chrome.extension.getURL("/help/index_en.html")});
|
||||
chrome.tabs.create({url: chrome.extension.getURL("/help/index.html")});
|
||||
|
||||
//generate a userID
|
||||
const newUserID = utils.generateUserID();
|
||||
//save this UUID
|
||||
Config.config.userID = newUserID;
|
||||
|
||||
Config.config.highlightCategoryUpdate = true;
|
||||
}
|
||||
}, 1500);
|
||||
});
|
||||
@@ -164,11 +166,7 @@ async function asyncRequestToServer(type: string, address: string, data = {}) {
|
||||
async function sendRequestToCustomServer(type: string, url: string, data = {}) {
|
||||
// If GET, convert JSON to parameters
|
||||
if (type.toLowerCase() === "get") {
|
||||
for (const key in data) {
|
||||
const seperator = url.includes("?") ? "&" : "?";
|
||||
const value = (typeof(data[key]) === "string") ? data[key]: JSON.stringify(data[key]);
|
||||
url += seperator + key + "=" + value;
|
||||
}
|
||||
url = utils.objectToURI(url, data, true);
|
||||
|
||||
data = null;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import * as React from "react";
|
||||
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import { Category } from "../types";
|
||||
import CategorySkipOptionsComponent from "./CategorySkipOptionsComponent";
|
||||
|
||||
export interface CategoryChooserProps {
|
||||
@@ -61,7 +62,7 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
|
||||
|
||||
for (const category of CompileConfig.categoryList) {
|
||||
elements.push(
|
||||
<CategorySkipOptionsComponent category={category}
|
||||
<CategorySkipOptionsComponent category={category as Category}
|
||||
key={category}>
|
||||
</CategorySkipOptionsComponent>
|
||||
);
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import * as React from "react";
|
||||
|
||||
import Config from "../config"
|
||||
import { CategorySkipOption } from "../types";
|
||||
import { Category, CategorySkipOption } from "../types";
|
||||
|
||||
import { getCategoryActionType } from "../utils/categoryUtils";
|
||||
|
||||
export interface CategorySkipOptionsProps {
|
||||
category: string;
|
||||
category: Category;
|
||||
defaultColor?: string;
|
||||
defaultPreviewColor?: string;
|
||||
}
|
||||
@@ -59,7 +61,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
<td id={this.props.category + "SkipOption"}
|
||||
className="skipOption">
|
||||
<select
|
||||
className="categoryOptionsSelector"
|
||||
className="optionsSelector"
|
||||
defaultValue={defaultOption}
|
||||
onChange={this.skipOptionSelected.bind(this)}>
|
||||
{this.getCategorySkipOptions()}
|
||||
@@ -87,7 +89,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
</tr>
|
||||
|
||||
<tr id={this.props.category + "DescriptionRow"}
|
||||
className="small-description">
|
||||
className="small-description categoryTableDescription">
|
||||
<td
|
||||
colSpan={2}>
|
||||
{chrome.i18n.getMessage("category_" + this.props.category + "_description")}
|
||||
@@ -152,7 +154,8 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
for (const optionName of optionNames) {
|
||||
elements.push(
|
||||
<option key={optionName} value={optionName}>
|
||||
{chrome.i18n.getMessage(optionName)}
|
||||
{chrome.i18n.getMessage(optionName !== "disable" ? optionName + getCategoryActionType(this.props.category)
|
||||
: optionName)}
|
||||
</option>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,20 +1,34 @@
|
||||
import * as React from "react";
|
||||
import Config from "../config";
|
||||
|
||||
enum CountdownMode {
|
||||
Timer,
|
||||
Paused,
|
||||
Stopped
|
||||
}
|
||||
|
||||
export interface NoticeProps {
|
||||
noticeTitle: string,
|
||||
|
||||
maxCountdownTime?: () => number,
|
||||
amountOfPreviousNotices?: number,
|
||||
showInSecondSlot?: boolean,
|
||||
timed?: boolean,
|
||||
idSuffix?: string,
|
||||
|
||||
videoSpeed?: () => number,
|
||||
|
||||
fadeIn?: boolean,
|
||||
startFaded?: boolean,
|
||||
firstColumn?: React.ReactElement,
|
||||
firstRow?: React.ReactElement,
|
||||
bottomRow?: React.ReactElement[],
|
||||
|
||||
smaller?: boolean,
|
||||
|
||||
// Callback for when this is closed
|
||||
closeListener: () => void,
|
||||
onMouseEnter?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void,
|
||||
|
||||
zIndex?: number,
|
||||
style?: React.CSSProperties
|
||||
@@ -26,8 +40,11 @@ export interface NoticeState {
|
||||
maxCountdownTime: () => number,
|
||||
|
||||
countdownTime: number,
|
||||
countdownText: string,
|
||||
countdownManuallyPaused: boolean,
|
||||
countdownMode: CountdownMode,
|
||||
|
||||
mouseHovering: boolean;
|
||||
|
||||
startFaded: boolean;
|
||||
}
|
||||
|
||||
class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
@@ -61,8 +78,10 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
//the countdown until this notice closes
|
||||
countdownTime: maxCountdownTime(),
|
||||
countdownText: null,
|
||||
countdownManuallyPaused: false
|
||||
countdownMode: CountdownMode.Timer,
|
||||
mouseHovering: false,
|
||||
|
||||
startFaded: this.props.startFaded ?? false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,80 +96,149 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
}
|
||||
|
||||
return (
|
||||
<table id={"sponsorSkipNotice" + this.idSuffix}
|
||||
className={"sponsorSkipObject sponsorSkipNotice"
|
||||
<div id={"sponsorSkipNotice" + this.idSuffix}
|
||||
className={"sponsorSkipObject sponsorSkipNoticeParent"
|
||||
+ (this.props.showInSecondSlot ? " secondSkipNotice" : "")}
|
||||
onMouseEnter={(e) => this.onMouseEnter(e) }
|
||||
onMouseLeave={() => this.timerMouseLeave()}
|
||||
style={noticeStyle} >
|
||||
<table className={"sponsorSkipObject sponsorSkipNotice"
|
||||
+ (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")
|
||||
+ (this.amountOfPreviousNotices > 0 ? " secondSkipNotice" : "")}
|
||||
style={noticeStyle}
|
||||
onMouseEnter={() => this.timerMouseEnter()}
|
||||
onMouseLeave={() => this.timerMouseLeave()}>
|
||||
<tbody>
|
||||
+ (this.state.startFaded ? " sponsorSkipNoticeFaded" : "") } >
|
||||
<tbody>
|
||||
|
||||
{/* First row */}
|
||||
<tr id={"sponsorSkipNoticeFirstRow" + this.idSuffix}>
|
||||
{/* Left column */}
|
||||
<td>
|
||||
{/* Logo */}
|
||||
<img id={"sponsorSkipLogo" + this.idSuffix}
|
||||
className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
</img>
|
||||
{/* First row */}
|
||||
<tr id={"sponsorSkipNoticeFirstRow" + this.idSuffix}>
|
||||
{/* Left column */}
|
||||
<td className="noticeLeftIcon">
|
||||
{/* Logo */}
|
||||
<img id={"sponsorSkipLogo" + this.idSuffix}
|
||||
className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
</img>
|
||||
|
||||
<span id={"sponsorSkipMessage" + this.idSuffix}
|
||||
style={{float: "left"}}
|
||||
className="sponsorSkipMessage sponsorSkipObject">
|
||||
|
||||
{this.state.noticeTitle}
|
||||
</span>
|
||||
</td>
|
||||
|
||||
{/* Right column */}
|
||||
<td className="sponsorSkipNoticeRightSection"
|
||||
style={{top: "11px"}}>
|
||||
|
||||
{/* Time left */}
|
||||
{this.props.timed ? (
|
||||
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
|
||||
onClick={() => this.toggleManualPause()}
|
||||
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
|
||||
|
||||
{this.state.countdownText || (this.state.countdownTime + "s")}
|
||||
<span id={"sponsorSkipMessage" + this.idSuffix}
|
||||
style={{float: "left"}}
|
||||
className="sponsorSkipMessage sponsorSkipObject">
|
||||
|
||||
{this.state.noticeTitle}
|
||||
</span>
|
||||
) : ""}
|
||||
|
||||
|
||||
{/* Close button */}
|
||||
<img src={chrome.extension.getURL("icons/close.png")}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"
|
||||
onClick={() => this.close()}>
|
||||
</img>
|
||||
</td>
|
||||
</tr>
|
||||
{this.props.firstColumn}
|
||||
</td>
|
||||
|
||||
{this.props.children}
|
||||
{this.props.firstRow}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
{/* Right column */}
|
||||
<td className="sponsorSkipNoticeRightSection"
|
||||
style={{top: "9.32px"}}>
|
||||
|
||||
{/* Time left */}
|
||||
{this.props.timed ? (
|
||||
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
|
||||
onClick={() => this.toggleManualPause()}
|
||||
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
|
||||
|
||||
{this.getCountdownElements()}
|
||||
|
||||
</span>
|
||||
) : ""}
|
||||
|
||||
|
||||
{/* Close button */}
|
||||
<img src={chrome.extension.getURL("icons/close.png")}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"
|
||||
onClick={() => this.close()}>
|
||||
</img>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
{this.props.children}
|
||||
|
||||
{!this.props.smaller && this.props.bottomRow ?
|
||||
this.props.bottomRow
|
||||
: null}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{/* Add as a hidden table to keep the height constant */}
|
||||
{this.props.smaller && this.props.bottomRow ?
|
||||
<table style={{visibility: "hidden", paddingTop: "14px"}}>
|
||||
<tbody>
|
||||
{this.props.bottomRow}
|
||||
</tbody>
|
||||
</table>
|
||||
: null}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
getCountdownElements(): React.ReactElement[] {
|
||||
return [(
|
||||
<span
|
||||
id={"skipNoticeTimerText" + this.idSuffix}
|
||||
key="skipNoticeTimerText"
|
||||
className={this.state.countdownMode !== CountdownMode.Timer ? "hidden" : ""} >
|
||||
{this.state.countdownTime + "s"}
|
||||
</span>
|
||||
),(
|
||||
<img
|
||||
id={"skipNoticeTimerPaused" + this.idSuffix}
|
||||
key="skipNoticeTimerPaused"
|
||||
className={this.state.countdownMode !== CountdownMode.Paused ? "hidden" : ""}
|
||||
src={chrome.runtime.getURL("icons/pause.svg")}
|
||||
alt={chrome.i18n.getMessage("paused")} />
|
||||
),(
|
||||
<img
|
||||
id={"skipNoticeTimerStopped" + this.idSuffix}
|
||||
key="skipNoticeTimerStopped"
|
||||
className={this.state.countdownMode !== CountdownMode.Stopped ? "hidden" : ""}
|
||||
src={chrome.runtime.getURL("icons/stop.svg")}
|
||||
alt={chrome.i18n.getMessage("manualPaused")} />
|
||||
)];
|
||||
}
|
||||
|
||||
onMouseEnter(event: React.MouseEvent<HTMLElement, MouseEvent>): void {
|
||||
if (this.props.onMouseEnter) this.props.onMouseEnter(event);
|
||||
|
||||
this.fadedMouseEnter();
|
||||
this.timerMouseEnter();
|
||||
}
|
||||
|
||||
fadedMouseEnter(): void {
|
||||
if (this.state.startFaded) {
|
||||
this.setState({
|
||||
startFaded: false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
timerMouseEnter(): void {
|
||||
if (this.state.countdownManuallyPaused) return;
|
||||
if (this.state.countdownMode === CountdownMode.Stopped) return;
|
||||
|
||||
this.pauseCountdown();
|
||||
|
||||
this.setState({
|
||||
mouseHovering: true
|
||||
});
|
||||
}
|
||||
|
||||
timerMouseLeave(): void {
|
||||
if (this.state.countdownManuallyPaused) return;
|
||||
if (this.state.countdownMode === CountdownMode.Stopped) return;
|
||||
|
||||
this.startCountdown();
|
||||
|
||||
this.setState({
|
||||
mouseHovering: false
|
||||
});
|
||||
}
|
||||
|
||||
toggleManualPause(): void {
|
||||
this.setState({
|
||||
countdownManuallyPaused: !this.state.countdownManuallyPaused
|
||||
countdownMode: this.state.countdownMode === CountdownMode.Stopped ? CountdownMode.Timer : CountdownMode.Stopped
|
||||
}, () => {
|
||||
if (this.state.countdownManuallyPaused) {
|
||||
if (this.state.countdownMode === CountdownMode.Stopped || this.state.mouseHovering) {
|
||||
this.pauseCountdown();
|
||||
} else {
|
||||
this.startCountdown();
|
||||
@@ -207,7 +295,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
//reset countdown and inform the user
|
||||
this.setState({
|
||||
countdownTime: this.state.maxCountdownTime(),
|
||||
countdownText: this.state.countdownManuallyPaused ? chrome.i18n.getMessage("manualPaused") : chrome.i18n.getMessage("paused")
|
||||
countdownMode: this.state.countdownMode === CountdownMode.Timer ? CountdownMode.Paused : this.state.countdownMode
|
||||
});
|
||||
|
||||
this.removeFadeAnimation();
|
||||
@@ -221,7 +309,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
this.setState({
|
||||
countdownTime: this.state.maxCountdownTime(),
|
||||
countdownText: null
|
||||
countdownMode: CountdownMode.Timer
|
||||
});
|
||||
|
||||
this.setupInterval();
|
||||
@@ -243,7 +331,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
this.setState({
|
||||
countdownTime: this.state.maxCountdownTime(),
|
||||
countdownText: null
|
||||
countdownMode: CountdownMode.Timer
|
||||
});
|
||||
|
||||
this.removeFadeAnimation();
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config"
|
||||
import { ContentContainer, SponsorHideType, SponsorTime } from "../types";
|
||||
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode } from "../types";
|
||||
import NoticeComponent from "./NoticeComponent";
|
||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||
|
||||
import { getCategoryActionType, getSkippingText } from "../utils/categoryUtils";
|
||||
|
||||
export enum SkipNoticeAction {
|
||||
None,
|
||||
Upvote,
|
||||
@@ -20,7 +22,11 @@ export interface SkipNoticeProps {
|
||||
// Contains functions and variables from the content script needed by the skip notice
|
||||
contentContainer: ContentContainer;
|
||||
|
||||
closeListener: () => void
|
||||
closeListener: () => void;
|
||||
showKeybindHint?: boolean;
|
||||
smaller: boolean;
|
||||
|
||||
unskipTime?: number;
|
||||
}
|
||||
|
||||
export interface SkipNoticeState {
|
||||
@@ -41,6 +47,10 @@ export interface SkipNoticeState {
|
||||
thanksForVotingText?: string; //null until the voting buttons should be hidden
|
||||
|
||||
actionState?: SkipNoticeAction;
|
||||
|
||||
showKeybindHint?: boolean;
|
||||
|
||||
smaller?: boolean;
|
||||
}
|
||||
|
||||
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
||||
@@ -50,6 +60,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
contentContainer: ContentContainer;
|
||||
|
||||
amountOfPreviousNotices: number;
|
||||
showInSecondSlot: boolean;
|
||||
audio: HTMLAudioElement;
|
||||
|
||||
idSuffix: string;
|
||||
@@ -70,15 +81,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.contentContainer = props.contentContainer;
|
||||
this.audio = null;
|
||||
|
||||
const 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("skip_category").replace("{0}", categoryName);
|
||||
}
|
||||
const noticeTitle = getSkippingText(this.segments, this.props.autoSkip);
|
||||
|
||||
//add notice
|
||||
this.amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
|
||||
const previousSkipNotices = document.getElementsByClassName("sponsorSkipNoticeParent");
|
||||
this.amountOfPreviousNotices = previousSkipNotices.length;
|
||||
// If there is at least one already in the first slot
|
||||
this.showInSecondSlot = previousSkipNotices.length > 0 && [...previousSkipNotices].some(notice => !notice.classList.contains("secondSkipNotice"));
|
||||
|
||||
// Sort segments
|
||||
if (this.segments.length > 1) {
|
||||
@@ -109,7 +117,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
choosingCategory: false,
|
||||
thanksForVotingText: null,
|
||||
|
||||
actionState: SkipNoticeAction.None
|
||||
actionState: SkipNoticeAction.None,
|
||||
|
||||
showKeybindHint: this.props.showKeybindHint ?? true,
|
||||
|
||||
smaller: this.props.smaller ?? false
|
||||
}
|
||||
|
||||
if (!this.autoSkip) {
|
||||
@@ -132,145 +144,173 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
noticeStyle.transform = "scale(0.8) translate(10%, 10%)";
|
||||
}
|
||||
|
||||
// If it started out as smaller, always keep the
|
||||
// skip button there
|
||||
const firstColumn = this.props.smaller ? (
|
||||
this.getSkipButton()
|
||||
) : null;
|
||||
|
||||
return (
|
||||
<NoticeComponent noticeTitle={this.state.noticeTitle}
|
||||
amountOfPreviousNotices={this.amountOfPreviousNotices}
|
||||
showInSecondSlot={this.showInSecondSlot}
|
||||
idSuffix={this.idSuffix}
|
||||
fadeIn={true}
|
||||
startFaded={Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAll
|
||||
|| (Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAutoSkip && this.autoSkip)}
|
||||
timed={true}
|
||||
maxCountdownTime={this.state.maxCountdownTime}
|
||||
videoSpeed={() => this.contentContainer().v?.playbackRate}
|
||||
style={noticeStyle}
|
||||
ref={this.noticeRef}
|
||||
closeListener={() => this.closeListener()}>
|
||||
closeListener={() => this.closeListener()}
|
||||
smaller={this.state.smaller}
|
||||
firstColumn={firstColumn}
|
||||
bottomRow={[...this.getMessageBoxes(), ...this.getBottomRow() ]}
|
||||
onMouseEnter={() => this.onMouseEnter() } >
|
||||
|
||||
{(Config.config.audioNotificationOnSkip) && <audio ref={(source) => { this.audio = source; }}>
|
||||
<source src={chrome.extension.getURL("icons/beep.ogg")} type="audio/ogg"></source>
|
||||
</audio>}
|
||||
</NoticeComponent>
|
||||
);
|
||||
}
|
||||
|
||||
{/* Text Boxes */}
|
||||
{this.getMessageBoxes()}
|
||||
|
||||
{/* Bottom Row */}
|
||||
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
|
||||
getBottomRow(): JSX.Element[] {
|
||||
return [
|
||||
/* Bottom Row */
|
||||
(<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}
|
||||
key={0}>
|
||||
|
||||
{/* Vote Button Container */}
|
||||
{!this.state.thanksForVotingText ?
|
||||
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorTimesVoteButtonsContainer">
|
||||
{/* Vote Button Container */}
|
||||
{!this.state.thanksForVotingText ?
|
||||
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorTimesVoteButtonsContainer">
|
||||
|
||||
{/* 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>
|
||||
{/* 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>
|
||||
|
||||
{/* 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/thumbs_down.svg")}
|
||||
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>
|
||||
}
|
||||
<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.prepAction(SkipNoticeAction.Unskip)}>
|
||||
{/* Unskip/Skip Button */}
|
||||
{!this.props.smaller ? this.getSkipButton() : null}
|
||||
|
||||
{this.state.unskipText + " (" + Config.config.skipKeybind + ")"}
|
||||
{/* Never show button if autoSkip is enabled */}
|
||||
{!this.autoSkip ? "" :
|
||||
<td className="sponsorSkipNoticeRightSection"
|
||||
key={1}>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={this.contentContainer().dontShowNoticeAgain}>
|
||||
|
||||
{chrome.i18n.getMessage("Hide")}
|
||||
</button>
|
||||
</td>
|
||||
}
|
||||
</tr>),
|
||||
|
||||
/* Downvote Options Row */
|
||||
(this.state.downvoting &&
|
||||
<tr id={"sponsorSkipNoticeDownvoteOptionsRow" + this.idSuffix}
|
||||
key={2}>
|
||||
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
|
||||
|
||||
{/* Normal downvote */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
|
||||
{chrome.i18n.getMessage("downvoteDescription")}
|
||||
</button>
|
||||
|
||||
{/* Category vote */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.openCategoryChooser()}>
|
||||
|
||||
{chrome.i18n.getMessage("incorrectCategory")}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
{/* Never show button if autoSkip is enabled */}
|
||||
{!this.autoSkip ? "" :
|
||||
<td className="sponsorSkipNoticeRightSection">
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={this.contentContainer().dontShowNoticeAgain}>
|
||||
|
||||
{chrome.i18n.getMessage("Hide")}
|
||||
</button>
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
),
|
||||
|
||||
{/* Downvote Options Row */}
|
||||
{this.state.downvoting &&
|
||||
<tr id={"sponsorSkipNoticeDownvoteOptionsRow" + this.idSuffix}>
|
||||
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
|
||||
/* Category Chooser Row */
|
||||
(this.state.choosingCategory &&
|
||||
<tr id={"sponsorSkipNoticeCategoryChooserRow" + this.idSuffix}
|
||||
key={3}>
|
||||
<td>
|
||||
{/* Category Selector */}
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
className="sponsorTimeCategories"
|
||||
defaultValue={this.segments[0].category} //Just default to the first segment, as we don't know which they'll choose
|
||||
ref={this.categoryOptionRef}>
|
||||
|
||||
{/* Normal downvote */}
|
||||
{this.getCategoryOptions()}
|
||||
</select>
|
||||
|
||||
{/* Submit Button */}
|
||||
{this.segments.length === 1 &&
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
|
||||
{chrome.i18n.getMessage("downvoteDescription")}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.CategoryVote)}>
|
||||
|
||||
{chrome.i18n.getMessage("submit")}
|
||||
</button>
|
||||
}
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
),
|
||||
|
||||
{/* Category vote */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.openCategoryChooser()}>
|
||||
/* Segment Chooser Row */
|
||||
(this.state.actionState !== SkipNoticeAction.None &&
|
||||
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}
|
||||
key={4}>
|
||||
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
|
||||
{this.getSubmissionChooser()}
|
||||
</td>
|
||||
</tr>
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
{chrome.i18n.getMessage("incorrectCategory")}
|
||||
</button>
|
||||
</td>
|
||||
getSkipButton(): JSX.Element {
|
||||
if (this.segments.length > 1
|
||||
|| getCategoryActionType(this.segments[0].category) !== CategoryActionType.POI
|
||||
|| this.props.unskipTime) {
|
||||
return (
|
||||
<span className="sponsorSkipNoticeUnskipSection">
|
||||
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={{marginLeft: "4px"}}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||
|
||||
</tr>
|
||||
}
|
||||
|
||||
{/* Category Chooser Row */}
|
||||
{this.state.choosingCategory &&
|
||||
<tr id={"sponsorSkipNoticeCategoryChooserRow" + this.idSuffix}>
|
||||
<td>
|
||||
{/* Category Selector */}
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
className="sponsorTimeCategories"
|
||||
defaultValue={this.segments[0].category} //Just default to the first segment, as we don't know which they'll choose
|
||||
ref={this.categoryOptionRef}>
|
||||
|
||||
{this.getCategoryOptions()}
|
||||
</select>
|
||||
|
||||
{/* Submit Button */}
|
||||
{this.segments.length === 1 &&
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.prepAction(SkipNoticeAction.CategoryVote)}>
|
||||
|
||||
{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>
|
||||
}
|
||||
|
||||
</NoticeComponent>
|
||||
);
|
||||
{this.state.unskipText + (this.state.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "")}
|
||||
</button>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
getSubmissionChooser(): JSX.Element[] {
|
||||
@@ -289,6 +329,14 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
return elements;
|
||||
}
|
||||
|
||||
onMouseEnter(): void {
|
||||
if (this.state.smaller) {
|
||||
this.setState({
|
||||
smaller: false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
prepAction(action: SkipNoticeAction): void {
|
||||
if (this.segments.length === 1) {
|
||||
this.performAction(0, action);
|
||||
@@ -299,25 +347,30 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
getMessageBoxes(): JSX.Element[] | JSX.Element {
|
||||
getMessageBoxes(): JSX.Element[] {
|
||||
if (this.state.messages.length === 0) {
|
||||
// Add a spacer if there is no text
|
||||
return (
|
||||
return [
|
||||
<tr id={"sponsorSkipNoticeSpacer" + this.idSuffix}
|
||||
className="sponsorBlockSpacer">
|
||||
className="sponsorBlockSpacer"
|
||||
key={"messageBoxSpacer"}>
|
||||
</tr>
|
||||
);
|
||||
];
|
||||
}
|
||||
|
||||
const elements: JSX.Element[] = [];
|
||||
|
||||
for (let i = 0; i < this.state.messages.length; i++) {
|
||||
elements.push(
|
||||
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
|
||||
text={this.state.messages[i]}
|
||||
onClick={this.state.messageOnClick}
|
||||
key={i}>
|
||||
</NoticeTextSelectionComponent>
|
||||
<tr>
|
||||
<td>
|
||||
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
|
||||
text={this.state.messages[i]}
|
||||
onClick={this.state.messageOnClick}
|
||||
key={i + "_messageBox"}>
|
||||
</NoticeTextSelectionComponent>
|
||||
</td>
|
||||
</tr>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -340,7 +393,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
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)
|
||||
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value as Category, this)
|
||||
break;
|
||||
case SkipNoticeAction.Unskip:
|
||||
this.state.unskipCallback(index);
|
||||
@@ -387,7 +440,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
getCategoryOptions(): React.ReactElement[] {
|
||||
const elements = [];
|
||||
|
||||
for (const category of CompileConfig.categoryList) {
|
||||
const categories = CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable));
|
||||
for (const category of categories) {
|
||||
elements.push(
|
||||
<option value={category}
|
||||
key={category}>
|
||||
@@ -400,7 +454,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
|
||||
unskip(index: number): void {
|
||||
this.contentContainer().unskipSponsorTime(this.segments[index]);
|
||||
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime);
|
||||
|
||||
this.unskippedMode(index, chrome.i18n.getMessage("reskip"));
|
||||
}
|
||||
@@ -414,12 +468,14 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
|
||||
getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
|
||||
const maxCountdownTime = () => {
|
||||
const changeCountdown = getCategoryActionType(this.segments[index].category) === CategoryActionType.Skippable;
|
||||
|
||||
const maxCountdownTime = changeCountdown ? () => {
|
||||
const sponsorTime = this.segments[index];
|
||||
const duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
|
||||
|
||||
return Math.max(duration, Config.config.skipNoticeDuration);
|
||||
};
|
||||
} : this.state.maxCountdownTime;
|
||||
|
||||
return {
|
||||
unskipText: buttonText,
|
||||
@@ -452,7 +508,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
});
|
||||
}
|
||||
|
||||
afterVote(segment: SponsorTime, type: number, category: string): void {
|
||||
afterVote(segment: SponsorTime, type: number, category: Category): void {
|
||||
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
||||
|
||||
if (type === 0) {
|
||||
|
||||
@@ -4,8 +4,9 @@ import Config from "../config";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
|
||||
import Utils from "../utils";
|
||||
import { ContentContainer, SponsorTime } from "../types";
|
||||
import { Category, CategoryActionType, ContentContainer, SponsorTime } from "../types";
|
||||
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
|
||||
import { getCategoryActionType } from "../utils/categoryUtils";
|
||||
const utils = new Utils();
|
||||
|
||||
export interface SponsorTimeEditProps {
|
||||
@@ -16,6 +17,7 @@ export interface SponsorTimeEditProps {
|
||||
contentContainer: ContentContainer,
|
||||
|
||||
submissionNotice: SubmissionNoticeComponent;
|
||||
categoryList?: Category[];
|
||||
}
|
||||
|
||||
export interface SponsorTimeEditState {
|
||||
@@ -106,43 +108,47 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
onChange={(e) => {
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
sponsorTimeEdits[0] = e.target.value;
|
||||
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = e.target.value;
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
|
||||
this.saveEditTimes();
|
||||
}}>
|
||||
</input>
|
||||
|
||||
<span>
|
||||
{" " + chrome.i18n.getMessage("to") + " "}
|
||||
</span>
|
||||
{getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable ? (
|
||||
<span>
|
||||
<span>
|
||||
{" " + chrome.i18n.getMessage("to") + " "}
|
||||
</span>
|
||||
|
||||
<input id={"submittingTime1" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditInput"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="text"
|
||||
value={this.state.sponsorTimeEdits[1]}
|
||||
onChange={(e) => {
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
sponsorTimeEdits[1] = e.target.value;
|
||||
<input id={"submittingTime1" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditInput"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="text"
|
||||
value={this.state.sponsorTimeEdits[1]}
|
||||
onChange={(e) => {
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
sponsorTimeEdits[1] = e.target.value;
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
this.setState({sponsorTimeEdits});
|
||||
|
||||
this.saveEditTimes();
|
||||
}}>
|
||||
</input>
|
||||
this.saveEditTimes();
|
||||
}}>
|
||||
</input>
|
||||
|
||||
<span id={"nowButton1" + this.idSuffix}
|
||||
className="sponsorNowButton"
|
||||
onClick={() => this.setTimeToNow(1)}>
|
||||
{chrome.i18n.getMessage("bracketNow")}
|
||||
</span>
|
||||
<span id={"nowButton1" + this.idSuffix}
|
||||
className="sponsorNowButton"
|
||||
onClick={() => this.setTimeToNow(1)}>
|
||||
{chrome.i18n.getMessage("bracketNow")}
|
||||
</span>
|
||||
|
||||
<span id={"endButton" + this.idSuffix}
|
||||
className="sponsorNowButton"
|
||||
onClick={() => this.setTimeToEnd()}>
|
||||
{chrome.i18n.getMessage("bracketEnd")}
|
||||
</span>
|
||||
<span id={"endButton" + this.idSuffix}
|
||||
className="sponsorNowButton"
|
||||
onClick={() => this.setTimeToEnd()}>
|
||||
{chrome.i18n.getMessage("bracketEnd")}
|
||||
</span>
|
||||
</span>
|
||||
): ""}
|
||||
</div>
|
||||
);
|
||||
} else {
|
||||
@@ -151,7 +157,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
className="sponsorTimeDisplay"
|
||||
onClick={this.toggleEditTime.bind(this)}>
|
||||
{utils.getFormattedTime(segment[0], true) +
|
||||
((!isNaN(segment[1])) ? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
|
||||
((!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable)
|
||||
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -171,13 +178,14 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
{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>
|
||||
{/* open in new tab */}
|
||||
<a href="https://wiki.sponsor.ajay.app/index.php/Segment_Categories"
|
||||
target="_blank" rel="noreferrer">
|
||||
<img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
|
||||
className="helpButton"
|
||||
src={chrome.extension.getURL("icons/help.svg")}
|
||||
title={chrome.i18n.getMessage("categoryGuidelines")} />
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
@@ -190,7 +198,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
{chrome.i18n.getMessage("delete")}
|
||||
</span>
|
||||
|
||||
{(!isNaN(segment[1])) ? (
|
||||
{(!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable) ? (
|
||||
<span id={"sponsorTimePreviewButton" + this.idSuffix}
|
||||
className="sponsorTimeEditButton"
|
||||
onClick={this.previewTime.bind(this)}>
|
||||
@@ -225,7 +233,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
</option>
|
||||
)];
|
||||
|
||||
for (const category of CompileConfig.categoryList) {
|
||||
for (const category of (this.props.categoryList ?? CompileConfig.categoryList)) {
|
||||
elements.push(
|
||||
<option value={category}
|
||||
key={category}>
|
||||
@@ -239,7 +247,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
|
||||
// See if show more categories was pressed
|
||||
if (!Config.config.categorySelections.some((category) => category.name === event.target.value)) {
|
||||
if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
|
||||
const chosenCategory = event.target.value;
|
||||
event.target.value = DEFAULT_CATEGORY;
|
||||
|
||||
@@ -247,11 +255,16 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
if (confirm(chrome.i18n.getMessage("enableThisCategoryFirst")
|
||||
.replace("{0}", chrome.i18n.getMessage("category_" + chosenCategory)))) {
|
||||
// Open options page
|
||||
chrome.runtime.sendMessage({"message": "openConfig"});
|
||||
chrome.runtime.sendMessage({message: "openConfig", hash: chosenCategory + "OptionsName"});
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (getCategoryActionType(event.target.value as Category) === CategoryActionType.POI) {
|
||||
this.setTimeTo(1, null);
|
||||
this.props.contentContainer().updateEditButtonsOnPlayer();
|
||||
}
|
||||
|
||||
this.saveEditTimes();
|
||||
}
|
||||
@@ -264,11 +277,16 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
this.setTimeTo(1, this.props.contentContainer().v.duration);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param index
|
||||
* @param time If null, will set time to the first index's time
|
||||
*/
|
||||
setTimeTo(index: number, time: number): void {
|
||||
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
|
||||
if (time === null) time = sponsorTime.segment[0];
|
||||
|
||||
sponsorTime.segment[index] =
|
||||
time;
|
||||
sponsorTime.segment[index] = time;
|
||||
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTime.segment[1] = time;
|
||||
|
||||
this.setState({
|
||||
sponsorTimeEdits: this.getFormattedSponsorTimesEdits(sponsorTime)
|
||||
@@ -312,7 +330,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
}
|
||||
|
||||
sponsorTimesSubmitting[this.props.index].category = this.categoryOptionRef.current.value;
|
||||
sponsorTimesSubmitting[this.props.index].category = this.categoryOptionRef.current.value as Category;
|
||||
|
||||
Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimesSubmitting);
|
||||
|
||||
@@ -334,7 +352,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
const skipTime = sponsorTimes[index].segment[0];
|
||||
|
||||
this.props.contentContainer().previewTime(skipTime + 0.000001, false);
|
||||
this.props.contentContainer().previewTime(skipTime + 0.0001, false);
|
||||
}
|
||||
|
||||
deleteTime(): void {
|
||||
@@ -369,4 +387,4 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
}
|
||||
|
||||
export default SponsorTimeEditComponent;
|
||||
export default SponsorTimeEditComponent;
|
||||
|
||||
@@ -12,7 +12,7 @@ export interface SubmissionNoticeProps {
|
||||
|
||||
callback: () => unknown;
|
||||
|
||||
closeListener: () => void
|
||||
closeListener: () => void;
|
||||
}
|
||||
|
||||
export interface SubmissionNoticeeState {
|
||||
@@ -95,7 +95,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
|
||||
{/* Guidelines button */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={() => window.open("https://github.com/ajayyy/SponsorBlock/wiki/Guidelines")}>
|
||||
onClick={() => window.open("https://wiki.sponsor.ajay.app/index.php/Guidelines")}>
|
||||
|
||||
{chrome.i18n.getMessage(Config.config.submissionCountSinceCategories > 3 ? "guidelines" : "readTheGuidelines")}
|
||||
</button>
|
||||
|
||||
158
src/config.ts
@@ -1,14 +1,11 @@
|
||||
import * as CompileConfig from "../config.json";
|
||||
import { CategorySelection, CategorySkipOption, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes } from "./types";
|
||||
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes } from "./types";
|
||||
|
||||
interface SBConfig {
|
||||
userID: string,
|
||||
/** Contains unsubmitted segments that the user has created. */
|
||||
segmentTimes: SBMap<string, SponsorTime[]>,
|
||||
defaultCategory: string,
|
||||
defaultCategory: Category,
|
||||
whitelistedChannels: string[],
|
||||
forceChannelCheck: boolean,
|
||||
skipKeybind: string,
|
||||
@@ -23,6 +20,7 @@ interface SBConfig {
|
||||
trackViewCount: boolean,
|
||||
trackViewCountInPrivate: boolean,
|
||||
dontShowNotice: boolean,
|
||||
noticeVisibilityMode: NoticeVisbilityMode,
|
||||
hideVideoPlayerControls: boolean,
|
||||
hideInfoButtonPlayerControls: boolean,
|
||||
hideDeleteButtonPlayerControls: boolean,
|
||||
@@ -39,9 +37,11 @@ interface SBConfig {
|
||||
testingServer: boolean,
|
||||
refetchWhenNotFound: boolean,
|
||||
ytInfoPermissionGranted: boolean,
|
||||
askAboutUnlistedVideos: boolean,
|
||||
allowExpirements: boolean,
|
||||
showDonationLink: boolean,
|
||||
autoHideInfoButton: boolean,
|
||||
autoSkipOnMusicVideos: boolean,
|
||||
highlightCategoryUpdate: boolean
|
||||
|
||||
// What categories should be skipped
|
||||
categorySelections: CategorySelection[],
|
||||
@@ -63,6 +63,8 @@ interface SBConfig {
|
||||
"preview-preview": PreviewBarOption,
|
||||
"music_offtopic": PreviewBarOption,
|
||||
"preview-music_offtopic": PreviewBarOption,
|
||||
"poi_highlight": PreviewBarOption,
|
||||
"preview-poi_highlight": PreviewBarOption,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,7 +150,7 @@ const Config: SBObject = {
|
||||
defaults: {
|
||||
userID: null,
|
||||
segmentTimes: new SBMap("segmentTimes"),
|
||||
defaultCategory: "chooseACategory",
|
||||
defaultCategory: "chooseACategory" as Category,
|
||||
whitelistedChannels: [],
|
||||
forceChannelCheck: false,
|
||||
skipKeybind: "Enter",
|
||||
@@ -163,6 +165,7 @@ const Config: SBObject = {
|
||||
trackViewCount: true,
|
||||
trackViewCountInPrivate: true,
|
||||
dontShowNotice: false,
|
||||
noticeVisibilityMode: NoticeVisbilityMode.FadedForAutoSkip,
|
||||
hideVideoPlayerControls: false,
|
||||
hideInfoButtonPlayerControls: false,
|
||||
hideDeleteButtonPlayerControls: false,
|
||||
@@ -179,12 +182,14 @@ const Config: SBObject = {
|
||||
testingServer: false,
|
||||
refetchWhenNotFound: true,
|
||||
ytInfoPermissionGranted: false,
|
||||
askAboutUnlistedVideos: true,
|
||||
allowExpirements: true,
|
||||
showDonationLink: true,
|
||||
autoHideInfoButton: true,
|
||||
autoSkipOnMusicVideos: false,
|
||||
highlightCategoryUpdate: false, // TODO: Remove this once update is done
|
||||
|
||||
categorySelections: [{
|
||||
name: "sponsor",
|
||||
name: "sponsor" as Category,
|
||||
option: CategorySkipOption.AutoSkip
|
||||
}],
|
||||
|
||||
@@ -249,6 +254,14 @@ const Config: SBObject = {
|
||||
"preview-music_offtopic": {
|
||||
color: "#a6634a",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"poi_highlight": {
|
||||
color: "#ff1684",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"preview-poi_highlight": {
|
||||
color: "#9b044c",
|
||||
opacity: "0.7"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -345,20 +358,29 @@ function fetchConfig(): Promise<void> {
|
||||
}
|
||||
|
||||
function migrateOldFormats(config: SBConfig) {
|
||||
// Adding preview category
|
||||
if (!config["previewCategoryUpdate"]) {
|
||||
config["previewCategoryUpdate"] = true;
|
||||
// Should eventually move into defaults
|
||||
if (!config["highlightCategoryAdded"] && !config.categorySelections.some((s) => s.name === "poi_highlight")) {
|
||||
config["highlightCategoryAdded"] = true;
|
||||
|
||||
config.categorySelections.push({
|
||||
name: "poi_highlight" as Category,
|
||||
option: CategorySkipOption.ManualSkip
|
||||
});
|
||||
|
||||
config.categorySelections = config.categorySelections;
|
||||
}
|
||||
|
||||
if (config["askAboutUnlistedVideos"]) {
|
||||
chrome.storage.sync.remove("askAboutUnlistedVideos");
|
||||
}
|
||||
|
||||
if (!config["autoSkipOnMusicVideosUpdate"]) {
|
||||
config["autoSkipOnMusicVideosUpdate"] = true;
|
||||
for (const selection of config.categorySelections) {
|
||||
if (selection.name === "intro"
|
||||
&& selection.option === CategorySkipOption.AutoSkip || selection.option === CategorySkipOption.ManualSkip) {
|
||||
if (selection.name === "music_offtopic"
|
||||
&& selection.option === CategorySkipOption.AutoSkip) {
|
||||
|
||||
// Add a default skip option for preview category
|
||||
config.categorySelections.push({
|
||||
name: "preview",
|
||||
option: CategorySkipOption.ManualSkip
|
||||
});
|
||||
// Ensure it gets updated
|
||||
config.categorySelections = config.categorySelections;
|
||||
config.autoSkipOnMusicVideos = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -374,100 +396,6 @@ function migrateOldFormats(config: SBConfig) {
|
||||
}
|
||||
}
|
||||
|
||||
// Auto vote removal
|
||||
if (config["autoUpvote"]) {
|
||||
chrome.storage.sync.remove("autoUpvote");
|
||||
}
|
||||
// mobileUpdateShowCount removal
|
||||
if (config["mobileUpdateShowCount"] !== undefined) {
|
||||
chrome.storage.sync.remove("mobileUpdateShowCount");
|
||||
}
|
||||
// categoryUpdateShowCount removal
|
||||
if (config["categoryUpdateShowCount"] !== undefined) {
|
||||
chrome.storage.sync.remove("categoryUpdateShowCount");
|
||||
}
|
||||
|
||||
// Channel URLS
|
||||
if (config.whitelistedChannels.length > 0 &&
|
||||
(config.whitelistedChannels[0] == null || config.whitelistedChannels[0].includes("/"))) {
|
||||
const channelURLFixer = async() => {
|
||||
const newChannelList: string[] = [];
|
||||
for (const item of config.whitelistedChannels) {
|
||||
if (item != null) {
|
||||
if (item.includes("/channel/")) {
|
||||
newChannelList.push(item.split("/")[2]);
|
||||
} else if (item.includes("/user/") && utils.isContentScript()) {
|
||||
|
||||
|
||||
// Replace channel URL with channelID
|
||||
const response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
|
||||
|
||||
if (response.ok) {
|
||||
newChannelList.push((JSON.parse(response.responseText)).authorId);
|
||||
} else {
|
||||
// Add it at the beginning so it gets converted later
|
||||
newChannelList.unshift(item);
|
||||
}
|
||||
} else if (item.includes("/user/")) {
|
||||
// Add it at the beginning so it gets converted later (The API can only be called in the content script due to CORS issues)
|
||||
newChannelList.unshift(item);
|
||||
} else {
|
||||
newChannelList.push(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
config.whitelistedChannels = newChannelList;
|
||||
}
|
||||
|
||||
channelURLFixer();
|
||||
}
|
||||
|
||||
// Check if off-topic category needs to be removed
|
||||
for (let i = 0; i < config.categorySelections.length; i++) {
|
||||
if (config.categorySelections[i].name === "offtopic") {
|
||||
config.categorySelections.splice(i, 1);
|
||||
// Call set listener
|
||||
config.categorySelections = config.categorySelections;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Migrate old "sponsorTimes"
|
||||
if (config["sponsorTimes"]) {
|
||||
let jsonData: unknown = config["sponsorTimes"];
|
||||
|
||||
// Check if data is stored in the old format for SBMap (a JSON string)
|
||||
if (typeof jsonData === "string") {
|
||||
try {
|
||||
jsonData = JSON.parse(jsonData);
|
||||
} catch(e) {
|
||||
// Continue normally (out of this if statement)
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise junk data
|
||||
if (Array.isArray(jsonData)) {
|
||||
const oldMap = new Map(jsonData);
|
||||
oldMap.forEach((sponsorTimes: [number, number][], key) => {
|
||||
const segmentTimes: SponsorTime[] = [];
|
||||
for (const segment of sponsorTimes) {
|
||||
segmentTimes.push({
|
||||
segment: segment,
|
||||
category: "sponsor",
|
||||
UUID: null
|
||||
});
|
||||
}
|
||||
|
||||
config.segmentTimes.rawSet(key, segmentTimes);
|
||||
});
|
||||
|
||||
config.segmentTimes.update();
|
||||
}
|
||||
|
||||
chrome.storage.sync.remove("sponsorTimes");
|
||||
}
|
||||
|
||||
// Remove some old unused options
|
||||
if (config["sponsorVideoID"] !== undefined) {
|
||||
chrome.storage.sync.remove("sponsorVideoID");
|
||||
|
||||
477
src/content.ts
@@ -1,6 +1,5 @@
|
||||
import Config from "./config";
|
||||
|
||||
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, FetchResponse, VideoInfo, StorageChangesObject, ChannelIDInfo, ChannelIDStatus, SponsorSourceType } from "./types";
|
||||
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, CategoryActionType, ChannelIDInfo, ChannelIDStatus, SponsorSourceType, SegmentUUID, Category, SkipToTimeParams, ToggleSkippable } from "./types";
|
||||
|
||||
import { ContentContainer } from "./types";
|
||||
import Utils from "./utils";
|
||||
@@ -13,7 +12,10 @@ import SkipNotice from "./render/SkipNotice";
|
||||
import SkipNoticeComponent from "./components/SkipNoticeComponent";
|
||||
import SubmissionNotice from "./render/SubmissionNotice";
|
||||
import { Message, MessageResponse } from "./messageTypes";
|
||||
import GenericNotice from "./render/GenericNotice";
|
||||
import * as Chat from "./js-components/chat";
|
||||
import { getCategoryActionType } from "./utils/categoryUtils";
|
||||
import { SkipButtonControlBar } from "./js-components/skipButtonControlBar";
|
||||
import { Tooltip } from "./render/Tooltip";
|
||||
|
||||
// Hack to get the CSS loaded on permission-based sites (Invidious)
|
||||
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
|
||||
@@ -26,6 +28,7 @@ let sponsorTimes: SponsorTime[] = null;
|
||||
let sponsorVideoID: VideoID = null;
|
||||
// List of open skip notices
|
||||
const skipNotices: SkipNotice[] = [];
|
||||
let activeSkipKeybindElement: ToggleSkippable = null;
|
||||
|
||||
// JSON video info
|
||||
let videoInfo: VideoInfo = null;
|
||||
@@ -69,6 +72,7 @@ let channelWhitelisted = false;
|
||||
|
||||
// create preview bar
|
||||
let previewBar: PreviewBar = null;
|
||||
let skipButtonControlBar: SkipButtonControlBar = null;
|
||||
|
||||
/** Element containing the player controls on the YouTube player. */
|
||||
let controls: HTMLElement | null = null;
|
||||
@@ -123,7 +127,7 @@ const manualSkipPercentCount = 0.5;
|
||||
//get messages from the background script and the popup
|
||||
chrome.runtime.onMessage.addListener(messageListener);
|
||||
|
||||
function messageListener(request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void {
|
||||
function messageListener(request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void | boolean {
|
||||
//messages from popup script
|
||||
switch(request.message){
|
||||
case "update":
|
||||
@@ -144,7 +148,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
sponsorTimes: sponsorTimes
|
||||
});
|
||||
|
||||
if (popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
if (!request.updating && popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
//the popup should be closed now that another is opening
|
||||
closeInfoMenu();
|
||||
}
|
||||
@@ -179,8 +183,12 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
submitSponsorTimes();
|
||||
break;
|
||||
case "refreshSegments":
|
||||
sponsorsLookup(sponsorVideoID, false);
|
||||
break;
|
||||
sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({
|
||||
found: sponsorDataFound,
|
||||
sponsorTimes: sponsorTimes
|
||||
}));
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,6 +248,12 @@ function resetValues() {
|
||||
|
||||
// Reset advert playing flag
|
||||
isAdPlaying = false;
|
||||
|
||||
for (let i = 0; i < skipNotices.length; i++) {
|
||||
skipNotices.pop().close();
|
||||
}
|
||||
|
||||
skipButtonControlBar?.disable();
|
||||
}
|
||||
|
||||
async function videoIDChange(id) {
|
||||
@@ -272,14 +286,11 @@ async function videoIDChange(id) {
|
||||
}
|
||||
|
||||
// Get new video info
|
||||
getVideoInfo();
|
||||
// getVideoInfo(); // Seems to have been replaced
|
||||
|
||||
// Update whitelist data when the video data is loaded
|
||||
whitelistCheck();
|
||||
|
||||
// Temporary expirement
|
||||
unlistedCheck();
|
||||
|
||||
//setup the preview bar
|
||||
if (previewBar === null) {
|
||||
if (onMobileYouTube) {
|
||||
@@ -425,7 +436,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
skippingSegments = [];
|
||||
|
||||
for (const segment of skipInfo.array) {
|
||||
if (utils.getCategorySelection(segment.category).option === CategorySkipOption.AutoSkip &&
|
||||
if (shouldAutoSkip(segment) &&
|
||||
segment.segment[0] >= skipTime[0] && segment.segment[1] <= skipTime[1]) {
|
||||
skippingSegments.push(segment);
|
||||
}
|
||||
@@ -433,8 +444,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
}
|
||||
|
||||
// Don't skip if this category should not be skipped
|
||||
if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ShowOverlay
|
||||
&& skipInfo.array !== sponsorTimesSubmitting) return;
|
||||
if (!shouldSkip(currentSkip) && skipInfo.array !== sponsorTimesSubmitting) return;
|
||||
|
||||
const skippingFunction = () => {
|
||||
let forcedSkipTime: number = null;
|
||||
@@ -444,7 +454,12 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
if (incorrectVideoCheck(videoID, currentSkip)) return;
|
||||
|
||||
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
|
||||
skipToTime(video, skipTime, skippingSegments, skipInfo.openNotice);
|
||||
skipToTime({
|
||||
v: video,
|
||||
skipTime,
|
||||
skippingSegments,
|
||||
openNotice: skipInfo.openNotice
|
||||
});
|
||||
|
||||
if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ManualSkip) {
|
||||
forcedSkipTime = skipTime[0] + 0.001;
|
||||
@@ -506,6 +521,7 @@ function refreshVideoAttachments() {
|
||||
videosWithEventListeners.push(video);
|
||||
|
||||
setupVideoListeners();
|
||||
setupSkipButtonControlBar();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -557,6 +573,22 @@ function setupVideoListeners() {
|
||||
|
||||
startSponsorSchedule();
|
||||
}
|
||||
|
||||
if (!Config.config.dontShowNotice) {
|
||||
const currentPoiSegment = sponsorTimes.find((segment) =>
|
||||
getCategoryActionType(segment.category) === CategoryActionType.POI &&
|
||||
video.currentTime - segment.segment[0] > 0 &&
|
||||
video.currentTime - segment.segment[0] < video.duration * 0.006); // Approximate size on preview bar
|
||||
if (currentPoiSegment && !skipNotices.some((notice) => notice.segments.some((s) => s.UUID === currentPoiSegment.UUID))) {
|
||||
skipToTime({
|
||||
v: video,
|
||||
skipTime: currentPoiSegment.segment,
|
||||
skippingSegments: [currentPoiSegment],
|
||||
openNotice: true,
|
||||
forceAutoSkip: true
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
video.addEventListener('ratechange', () => startSponsorSchedule());
|
||||
// Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740)
|
||||
@@ -573,6 +605,22 @@ function setupVideoListeners() {
|
||||
}
|
||||
}
|
||||
|
||||
function setupSkipButtonControlBar() {
|
||||
if (!skipButtonControlBar) {
|
||||
skipButtonControlBar = new SkipButtonControlBar({
|
||||
skip: (segment) => skipToTime({
|
||||
v: video,
|
||||
skipTime: segment.segment,
|
||||
skippingSegments: [segment],
|
||||
openNotice: true,
|
||||
forceAutoSkip: true
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
skipButtonControlBar.attachToPage();
|
||||
}
|
||||
|
||||
async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
if (!video) refreshVideoAttachments();
|
||||
//there is still no video here
|
||||
@@ -594,81 +642,83 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
|
||||
// Check for hashPrefix setting
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories
|
||||
}).then(async (response: FetchResponse) => {
|
||||
if (response?.ok) {
|
||||
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
|
||||
?.filter((video) => video.videoID === id)
|
||||
?.map((video) => video.segments)[0];
|
||||
if (!recievedSegments || !recievedSegments.length) {
|
||||
// return if no video found
|
||||
retryFetch();
|
||||
return;
|
||||
}
|
||||
|
||||
sponsorDataFound = true;
|
||||
|
||||
// Check if any old submissions should be kept
|
||||
if (sponsorTimes !== null && keepOldSubmissions) {
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
if (sponsorTimes[i].source === SponsorSourceType.Local) {
|
||||
// This is a user submission, keep it
|
||||
recievedSegments.push(sponsorTimes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const oldSegments = sponsorTimes || [];
|
||||
sponsorTimes = recievedSegments;
|
||||
|
||||
// Hide all submissions smaller than the minimum duration
|
||||
if (Config.config.minDuration !== 0) {
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration) {
|
||||
sponsorTimes[i].hidden = SponsorHideType.MinimumDuration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (keepOldSubmissions) {
|
||||
for (const segment of oldSegments) {
|
||||
const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID);
|
||||
if (otherSegment) {
|
||||
// If they downvoted it, or changed the category, keep it
|
||||
otherSegment.hidden = segment.hidden;
|
||||
otherSegment.category = segment.category;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startSkipScheduleCheckingForStartSponsors();
|
||||
|
||||
//update the preview bar
|
||||
//leave the type blank for now until categories are added
|
||||
if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(video.duration))) {
|
||||
//set it now
|
||||
//otherwise the listener can handle it
|
||||
updatePreviewBar();
|
||||
}
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
} else if (response?.status === 404) {
|
||||
retryFetch();
|
||||
} else if (sponsorLookupRetries < 15 && !recheckStarted) {
|
||||
recheckStarted = true;
|
||||
|
||||
//TODO lower when server becomes better (back to 1 second)
|
||||
//some error occurred, try again in a second
|
||||
setTimeout(() => {
|
||||
if (sponsorVideoID && sponsorTimes?.length === 0) {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
}
|
||||
}, 5000 + Math.random() * 15000 + 5000 * sponsorLookupRetries);
|
||||
|
||||
sponsorLookupRetries++;
|
||||
}
|
||||
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories,
|
||||
userAgent: `${chrome.runtime.id}`
|
||||
});
|
||||
|
||||
if (response?.ok) {
|
||||
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
|
||||
?.filter((video) => video.videoID === id)
|
||||
?.map((video) => video.segments)[0];
|
||||
if (!recievedSegments || !recievedSegments.length) {
|
||||
// return if no video found
|
||||
retryFetch();
|
||||
return;
|
||||
}
|
||||
|
||||
sponsorDataFound = true;
|
||||
|
||||
// Check if any old submissions should be kept
|
||||
if (sponsorTimes !== null && keepOldSubmissions) {
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
if (sponsorTimes[i].source === SponsorSourceType.Local) {
|
||||
// This is a user submission, keep it
|
||||
recievedSegments.push(sponsorTimes[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const oldSegments = sponsorTimes || [];
|
||||
sponsorTimes = recievedSegments;
|
||||
|
||||
// Hide all submissions smaller than the minimum duration
|
||||
if (Config.config.minDuration !== 0) {
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration
|
||||
&& getCategoryActionType(sponsorTimes[i].category) !== CategoryActionType.POI) {
|
||||
sponsorTimes[i].hidden = SponsorHideType.MinimumDuration;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (keepOldSubmissions) {
|
||||
for (const segment of oldSegments) {
|
||||
const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID);
|
||||
if (otherSegment) {
|
||||
// If they downvoted it, or changed the category, keep it
|
||||
otherSegment.hidden = segment.hidden;
|
||||
otherSegment.category = segment.category;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startSkipScheduleCheckingForStartSponsors();
|
||||
|
||||
//update the preview bar
|
||||
//leave the type blank for now until categories are added
|
||||
if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(video.duration))) {
|
||||
//set it now
|
||||
//otherwise the listener can handle it
|
||||
updatePreviewBar();
|
||||
}
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
} else if (response?.status === 404) {
|
||||
retryFetch();
|
||||
} else if (sponsorLookupRetries < 15 && !recheckStarted) {
|
||||
recheckStarted = true;
|
||||
|
||||
//TODO lower when server becomes better (back to 1 second)
|
||||
//some error occurred, try again in a second
|
||||
setTimeout(() => {
|
||||
if (sponsorVideoID && sponsorTimes?.length === 0) {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
}
|
||||
}, 5000 + Math.random() * 15000 + 5000 * sponsorLookupRetries);
|
||||
|
||||
sponsorLookupRetries++;
|
||||
}
|
||||
}
|
||||
|
||||
function retryFetch(): void {
|
||||
@@ -676,19 +726,11 @@ function retryFetch(): void {
|
||||
|
||||
sponsorDataFound = false;
|
||||
|
||||
//check if this video was uploaded recently
|
||||
utils.wait(() => !!videoInfo).then(() => {
|
||||
const dateUploaded = videoInfo?.microformat?.playerMicroformatRenderer?.uploadDate;
|
||||
|
||||
//if less than 3 days old
|
||||
if (Date.now() - new Date(dateUploaded).getTime() < 259200000) {
|
||||
setTimeout(() => {
|
||||
if (sponsorVideoID && sponsorTimes?.length === 0) {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
}
|
||||
}, 10000 + Math.random() * 30000);
|
||||
setTimeout(() => {
|
||||
if (sponsorVideoID && sponsorTimes?.length === 0) {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
}
|
||||
});
|
||||
}, 10000 + Math.random() * 30000);
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
}
|
||||
@@ -701,24 +743,47 @@ function retryFetch(): void {
|
||||
function startSkipScheduleCheckingForStartSponsors() {
|
||||
if (!switchingVideos) {
|
||||
// See if there are any starting sponsors
|
||||
let startingSponsor = -1;
|
||||
let startingSegmentTime = -1;
|
||||
let startingSegment: SponsorTime = null;
|
||||
for (const time of sponsorTimes) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSponsor && time.segment[1] > video.currentTime) {
|
||||
startingSponsor = time.segment[0];
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (startingSponsor === -1) {
|
||||
if (startingSegmentTime === -1) {
|
||||
for (const time of sponsorTimesSubmitting) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSponsor && time.segment[1] > video.currentTime) {
|
||||
startingSponsor = time.segment[0];
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (startingSponsor !== -1) {
|
||||
startSponsorSchedule(undefined, startingSponsor);
|
||||
// For highlight category
|
||||
const poiSegments = sponsorTimes
|
||||
.filter((time) => time.segment[1] > video.currentTime && getCategoryActionType(time.category) === CategoryActionType.POI)
|
||||
.sort((a, b) => b.segment[0] - a.segment[0]);
|
||||
for (const time of poiSegments) {
|
||||
const skipOption = utils.getCategorySelection(time.category)?.option;
|
||||
if (skipOption !== CategorySkipOption.ShowOverlay) {
|
||||
skipToTime({
|
||||
v: video,
|
||||
skipTime: time.segment,
|
||||
skippingSegments: [time],
|
||||
openNotice: true,
|
||||
unskipTime: video.currentTime
|
||||
});
|
||||
if (skipOption === CategorySkipOption.AutoSkip) break;
|
||||
}
|
||||
}
|
||||
|
||||
if (startingSegmentTime !== -1) {
|
||||
startSponsorSchedule(undefined, startingSegmentTime);
|
||||
} else {
|
||||
startSponsorSchedule();
|
||||
}
|
||||
@@ -727,6 +792,8 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
|
||||
/**
|
||||
* Get the video info for the current tab from YouTube
|
||||
*
|
||||
* TODO: Replace
|
||||
*/
|
||||
async function getVideoInfo(): Promise<void> {
|
||||
const result = await utils.asyncRequestToCustomServer("GET", "https://www.youtube.com/get_video_info?video_id=" + sponsorVideoID + "&html5=1&c=TVHTML5&cver=7.20190319");
|
||||
@@ -805,7 +872,6 @@ function updatePreviewBar(): void {
|
||||
if (video === null) return;
|
||||
|
||||
const previewBarSegments: PreviewBarSegment[] = [];
|
||||
|
||||
if (sponsorTimes) {
|
||||
sponsorTimes.forEach((segment) => {
|
||||
if (segment.hidden !== SponsorHideType.Visible) return;
|
||||
@@ -814,6 +880,7 @@ function updatePreviewBar(): void {
|
||||
segment: segment.segment as [number, number],
|
||||
category: segment.category,
|
||||
unsubmitted: false,
|
||||
showLarger: getCategoryActionType(segment.category) === CategoryActionType.POI
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -823,6 +890,7 @@ function updatePreviewBar(): void {
|
||||
segment: segment.segment as [number, number],
|
||||
category: segment.category,
|
||||
unsubmitted: true,
|
||||
showLarger: getCategoryActionType(segment.category) === CategoryActionType.POI
|
||||
});
|
||||
});
|
||||
|
||||
@@ -852,7 +920,7 @@ async function whitelistCheck() {
|
||||
|
||||
channelIDInfo = {
|
||||
status: ChannelIDStatus.Found,
|
||||
id: getChannelID()
|
||||
id: getChannelID().match(/^\/?([^\s/]+)/)[0]
|
||||
}
|
||||
} catch (e) {
|
||||
channelIDInfo = {
|
||||
@@ -864,7 +932,8 @@ async function whitelistCheck() {
|
||||
}
|
||||
|
||||
//see if this is a whitelisted channel
|
||||
if (whitelistedChannels != undefined && whitelistedChannels.includes(getChannelID())) {
|
||||
if (whitelistedChannels != undefined &&
|
||||
channelIDInfo.status === ChannelIDStatus.Found && whitelistedChannels.includes(channelIDInfo.id)) {
|
||||
channelWhitelisted = true;
|
||||
}
|
||||
|
||||
@@ -872,66 +941,6 @@ async function whitelistCheck() {
|
||||
if (Config.config.forceChannelCheck && sponsorTimes?.length > 0) startSkipScheduleCheckingForStartSponsors();
|
||||
}
|
||||
|
||||
async function unlistedCheck() {
|
||||
if (!Config.config.allowExpirements || !Config.config.askAboutUnlistedVideos) return;
|
||||
|
||||
try {
|
||||
await utils.wait(() => !!videoInfo && !!document.getElementById("info-text")
|
||||
&& !!document.querySelector(".ytd-video-primary-info-renderer > .badge > yt-icon > svg"), 6000, 1000);
|
||||
|
||||
const isUnlisted = document.querySelector(".ytd-video-primary-info-renderer > .badge > yt-icon > svg > g > path")
|
||||
?.getAttribute("d")?.includes("M3.9 12c0-1.71 1.39-3.1 3.1-3.1h"); // Icon of unlisted badge
|
||||
const yearMatches = document.querySelector("#info-text > #info-strings > yt-formatted-string")
|
||||
?.innerHTML?.match(/20[0-9]{2}/);
|
||||
const year = yearMatches ? parseInt(yearMatches[0]) : -1;
|
||||
const isOld = !isNaN(year) && year < 2017 && year > 2004;
|
||||
const views = parseInt(videoInfo?.videoDetails?.viewCount);
|
||||
const isHighViews = views > 15000;
|
||||
|
||||
if (isUnlisted && isOld && isHighViews && (!sponsorTimes || sponsorTimes.length <= 0)) {
|
||||
// Ask if they want to submit this videoID
|
||||
const notice = new GenericNotice(skipNoticeContentContainer, "unlistedWarning", {
|
||||
title: chrome.i18n.getMessage("experimentUnlistedTitle"),
|
||||
textBoxes: chrome.i18n.getMessage("experimentUnlistedText").split("\n"),
|
||||
buttons: [
|
||||
{
|
||||
name: chrome.i18n.getMessage("experiementOptOut"),
|
||||
listener: () => {
|
||||
Config.config.allowExpirements = false;
|
||||
|
||||
notice.close();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: chrome.i18n.getMessage("hideForever"),
|
||||
listener: () => {
|
||||
Config.config.askAboutUnlistedVideos = false;
|
||||
|
||||
notice.close();
|
||||
}
|
||||
},
|
||||
{
|
||||
name: "Submit",
|
||||
listener: () => {
|
||||
utils.asyncRequestToServer("POST", "/api/unlistedVideo", {
|
||||
videoID: sponsorVideoID,
|
||||
year,
|
||||
views,
|
||||
channelID: channelIDInfo.status === ChannelIDStatus.Found ? channelIDInfo.id : undefined
|
||||
});
|
||||
|
||||
notice.close();
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns info about the next upcoming sponsor skip
|
||||
*/
|
||||
@@ -953,14 +962,14 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
|
||||
if ((minUnsubmittedSponsorTimeIndex === -1 && minSponsorTimeIndex !== -1) ||
|
||||
sponsorStartTimes[minSponsorTimeIndex] < unsubmittedSponsorStartTimes[minUnsubmittedSponsorTimeIndex]) {
|
||||
return {
|
||||
array: sponsorTimes,
|
||||
array: sponsorTimes.filter((segment) => getCategoryActionType(segment.category) === CategoryActionType.Skippable),
|
||||
index: minSponsorTimeIndex,
|
||||
endIndex: endTimeIndex,
|
||||
openNotice: true
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
array: sponsorTimesSubmitting,
|
||||
array: sponsorTimesSubmitting.filter((segment) => getCategoryActionType(segment.category) === CategoryActionType.Skippable),
|
||||
index: minUnsubmittedSponsorTimeIndex,
|
||||
endIndex: previewEndTimeIndex,
|
||||
openNotice: false
|
||||
@@ -984,7 +993,7 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
|
||||
function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideHiddenSponsors = true): number {
|
||||
// Only combine segments for AutoSkip
|
||||
if (index == -1 ||
|
||||
utils.getCategorySelection(sponsorTimes[index].category)?.option !== CategorySkipOption.AutoSkip) return index;
|
||||
shouldAutoSkip(sponsorTimes[index])) return index;
|
||||
|
||||
// Default to the normal endTime
|
||||
let latestEndTimeIndex = index;
|
||||
@@ -995,7 +1004,7 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH
|
||||
|
||||
if (currentSegment[0] <= latestEndTime && currentSegment[1] > latestEndTime
|
||||
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)
|
||||
&& utils.getCategorySelection(sponsorTimes[i].category).option === CategorySkipOption.AutoSkip) {
|
||||
&& shouldAutoSkip(sponsorTimes[i])) {
|
||||
// Overlapping segment
|
||||
latestEndTimeIndex = i;
|
||||
}
|
||||
@@ -1029,8 +1038,9 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments:
|
||||
if ((minimum === undefined
|
||||
|| ((includeNonIntersectingSegments && sponsorTimes[i].segment[0] >= minimum)
|
||||
|| (includeIntersectingSegments && sponsorTimes[i].segment[0] < minimum && sponsorTimes[i].segment[1] > minimum)))
|
||||
&& (!onlySkippableSponsors || utils.getCategorySelection(sponsorTimes[i].category).option !== CategorySkipOption.ShowOverlay)
|
||||
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)) {
|
||||
&& (!onlySkippableSponsors || shouldSkip(sponsorTimes[i]))
|
||||
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)
|
||||
&& getCategoryActionType(sponsorTimes[i].category) === CategoryActionType.Skippable) {
|
||||
|
||||
startTimes.push(sponsorTimes[i].segment[0]);
|
||||
}
|
||||
@@ -1074,9 +1084,9 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
|
||||
}
|
||||
|
||||
//skip from the start time to the end time for a certain index sponsor time
|
||||
function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) {
|
||||
function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, unskipTime}: SkipToTimeParams): void {
|
||||
// There will only be one submission if it is manual skip
|
||||
const autoSkip: boolean = utils.getCategorySelection(skippingSegments[0].category)?.option === CategorySkipOption.AutoSkip;
|
||||
const autoSkip: boolean = forceAutoSkip || shouldAutoSkip(skippingSegments[0]);
|
||||
|
||||
if ((autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) && v.currentTime !== skipTime[1]) {
|
||||
// Fix for looped videos not working when skipping to the end #426
|
||||
@@ -1088,10 +1098,35 @@ function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: S
|
||||
}
|
||||
}
|
||||
|
||||
if (openNotice) {
|
||||
//send out the message saying that a sponsor message was skipped
|
||||
if (!Config.config.dontShowNotice || !autoSkip) {
|
||||
skipNotices.push(new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer));
|
||||
if (!autoSkip
|
||||
&& skippingSegments.length === 1
|
||||
&& getCategoryActionType(skippingSegments[0].category) === CategoryActionType.POI) {
|
||||
skipButtonControlBar.enable(skippingSegments[0], !Config.config.highlightCategoryUpdate ? 15 : 0);
|
||||
|
||||
if (!Config.config.highlightCategoryUpdate) {
|
||||
new Tooltip({
|
||||
text: chrome.i18n.getMessage("highlightNewFeature"),
|
||||
link: "https://blog.ajay.app/highlight-sponsorblock",
|
||||
referenceNode: skipButtonControlBar.getElement().parentElement,
|
||||
prependElement: skipButtonControlBar.getElement(),
|
||||
timeout: 15
|
||||
});
|
||||
|
||||
Config.config.highlightCategoryUpdate = true;
|
||||
}
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
activeSkipKeybindElement = skipButtonControlBar;
|
||||
} else {
|
||||
if (openNotice) {
|
||||
//send out the message saying that a sponsor message was skipped
|
||||
if (!Config.config.dontShowNotice || !autoSkip) {
|
||||
const newSkipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer, unskipTime);
|
||||
skipNotices.push(newSkipNotice);
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
activeSkipKeybindElement = newSkipNotice;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1099,11 +1134,10 @@ function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: S
|
||||
if (autoSkip) sendTelemetryAndCount(skippingSegments, skipTime[1] - skipTime[0], true);
|
||||
}
|
||||
|
||||
function unskipSponsorTime(segment: SponsorTime) {
|
||||
if (sponsorTimes != null) {
|
||||
//add a tiny bit of time to make sure it is not skipped again
|
||||
video.currentTime = segment.segment[0] + 0.001;
|
||||
}
|
||||
function unskipSponsorTime(segment: SponsorTime, unskipTime: number = null) {
|
||||
//add a tiny bit of time to make sure it is not skipped again
|
||||
console.log(unskipTime)
|
||||
video.currentTime = unskipTime ?? segment.segment[0] + 0.001;
|
||||
}
|
||||
|
||||
function reskipSponsorTime(segment: SponsorTime) {
|
||||
@@ -1154,6 +1188,17 @@ function createButton(baseID: string, title: string, callback: () => void, image
|
||||
return newButton;
|
||||
}
|
||||
|
||||
function shouldAutoSkip(segment: SponsorTime): boolean {
|
||||
return utils.getCategorySelection(segment.category)?.option === CategorySkipOption.AutoSkip ||
|
||||
(Config.config.autoSkipOnMusicVideos && sponsorTimes.some((s) => s.category === "music_offtopic")
|
||||
&& getCategoryActionType(segment.category) === CategoryActionType.Skippable);
|
||||
}
|
||||
|
||||
function shouldSkip(segment: SponsorTime): boolean {
|
||||
return utils.getCategorySelection(segment.category)?.option !== CategorySkipOption.ShowOverlay ||
|
||||
(Config.config.autoSkipOnMusicVideos && sponsorTimes.some((s) => s.category === "music_offtopic"));
|
||||
}
|
||||
|
||||
function getControls(): HTMLElement | false {
|
||||
const controlsSelectors = [
|
||||
// YouTube
|
||||
@@ -1237,7 +1282,7 @@ function updateEditButtonsOnPlayer(): void {
|
||||
creatingSegment = isSegmentCreationInProgress();
|
||||
|
||||
// Show only if there are any segments to submit
|
||||
submitButtonVisible = sponsorTimesSubmitting.length > 1 || (sponsorTimesSubmitting.length > 0 && !creatingSegment);
|
||||
submitButtonVisible = sponsorTimesSubmitting.length > 0;
|
||||
|
||||
// Show only if there are any segments to delete
|
||||
deleteButtonVisible = sponsorTimesSubmitting.length > 1 || (sponsorTimesSubmitting.length > 0 && !creatingSegment);
|
||||
@@ -1375,9 +1420,11 @@ function openInfoMenu() {
|
||||
let htmlData = xmlhttp.responseText;
|
||||
// Hack to replace head data (title, favicon)
|
||||
htmlData = htmlData.replace(/<head>[\S\s]*<\/head>/gi, "");
|
||||
// Hack to replace body tag with div
|
||||
// Hack to replace body and html tag with div
|
||||
htmlData = htmlData.replace(/<body/gi, "<div");
|
||||
htmlData = htmlData.replace(/<\/body/gi, "</div");
|
||||
htmlData = htmlData.replace(/<html/gi, "<div");
|
||||
htmlData = htmlData.replace(/<\/html/gi, "</div");
|
||||
|
||||
popup.innerHTML = htmlData;
|
||||
|
||||
@@ -1473,7 +1520,7 @@ function clearSponsorTimes() {
|
||||
}
|
||||
|
||||
//if skipNotice is null, it will not affect the UI
|
||||
function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNoticeComponent) {
|
||||
function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent) {
|
||||
if (skipNotice !== null && skipNotice !== undefined) {
|
||||
//add loading info
|
||||
skipNotice.addVoteButtonInfo.bind(skipNotice)(chrome.i18n.getMessage("Loading"))
|
||||
@@ -1513,7 +1560,15 @@ function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNo
|
||||
//success (treat rate limits as a success)
|
||||
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
|
||||
} else if (response.successType == -1) {
|
||||
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode, response.responseText))
|
||||
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a warning from a moderator.")) {
|
||||
skipNotice.setNoticeInfoMessageWithOnClick.bind(skipNotice)(() => {
|
||||
Chat.openWarningChat(response.responseText);
|
||||
skipNotice.closeListener.call(skipNotice);
|
||||
}, chrome.i18n.getMessage("voteRejectedWarning"));
|
||||
} else {
|
||||
skipNotice.setNoticeInfoMessage.bind(skipNotice)(utils.getErrorMessage(response.statusCode, response.responseText))
|
||||
}
|
||||
|
||||
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
|
||||
}
|
||||
}
|
||||
@@ -1556,7 +1611,7 @@ function submitSponsorTimes() {
|
||||
async function sendSubmitMessage() {
|
||||
// Add loading animation
|
||||
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker.svg");
|
||||
playerButtons.submit.button.style.animation = "rotate 1s 0s infinite";
|
||||
const stopAnimation = utils.applyLoadingAnimation(playerButtons.submit.button, 1, () => updateEditButtonsOnPlayer());
|
||||
|
||||
//check if a sponsor exceeds the duration of the video
|
||||
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
|
||||
@@ -1571,7 +1626,8 @@ async function sendSubmitMessage() {
|
||||
// Check to see if any of the submissions are below the minimum duration set
|
||||
if (Config.config.minDuration > 0) {
|
||||
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
|
||||
if (sponsorTimesSubmitting[i].segment[1] - sponsorTimesSubmitting[i].segment[0] < Config.config.minDuration) {
|
||||
if (sponsorTimesSubmitting[i].segment[1] - sponsorTimesSubmitting[i].segment[0] < Config.config.minDuration
|
||||
&& getCategoryActionType(sponsorTimesSubmitting[i].category) !== CategoryActionType.POI) {
|
||||
const confirmShort = chrome.i18n.getMessage("shortCheck") + "\n\n" +
|
||||
getSegmentsMessage(sponsorTimesSubmitting);
|
||||
|
||||
@@ -1584,26 +1640,12 @@ async function sendSubmitMessage() {
|
||||
videoID: sponsorVideoID,
|
||||
userID: Config.config.userID,
|
||||
segments: sponsorTimesSubmitting,
|
||||
videoDuration: video?.duration
|
||||
videoDuration: video?.duration,
|
||||
userAgent: `${chrome.runtime.id}/v${chrome.runtime.getManifest().version}`
|
||||
});
|
||||
|
||||
if (response.status === 200) {
|
||||
// Handle submission success
|
||||
const submitButton = playerButtons.submit.button;
|
||||
|
||||
// Make the animation finite
|
||||
submitButton.style.animation = "rotate 1s";
|
||||
|
||||
// When the animation is over, hide the button
|
||||
const animationEndListener = () => {
|
||||
updateEditButtonsOnPlayer();
|
||||
|
||||
submitButton.style.animation = "none";
|
||||
|
||||
submitButton.removeEventListener("animationend", animationEndListener);
|
||||
};
|
||||
|
||||
submitButton.addEventListener("animationend", animationEndListener);
|
||||
stopAnimation();
|
||||
|
||||
// Remove segments from storage since they've already been submitted
|
||||
Config.config.segmentTimes.delete(sponsorVideoID);
|
||||
@@ -1637,7 +1679,11 @@ async function sendSubmitMessage() {
|
||||
playerButtons.submit.button.style.animation = "unset";
|
||||
playerButtons.submit.image.src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg");
|
||||
|
||||
alert(utils.getErrorMessage(response.status, response.responseText));
|
||||
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a warning from a moderator.")) {
|
||||
Chat.openWarningChat(response.responseText);
|
||||
} else {
|
||||
alert(utils.getErrorMessage(response.status, response.responseText));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1679,9 +1725,8 @@ function hotkeyListener(e: KeyboardEvent): void {
|
||||
|
||||
switch (key) {
|
||||
case skipKey:
|
||||
if (skipNotices.length > 0) {
|
||||
const latestSkipNotice = skipNotices[skipNotices.length - 1];
|
||||
latestSkipNotice.toggleSkip.call(latestSkipNotice);
|
||||
if (activeSkipKeybindElement) {
|
||||
activeSkipKeybindElement.toggleSkip.call(activeSkipKeybindElement);
|
||||
}
|
||||
break;
|
||||
case startSponsorKey:
|
||||
|
||||
17
src/help.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import Config from "./config";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
|
||||
await utils.wait(() => Config.config !== null);
|
||||
|
||||
if (!showDonationLink()) {
|
||||
document.getElementById("sbDonate").style.display = "none";
|
||||
}
|
||||
}
|
||||
45
src/js-components/chat.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
import Config from "../config";
|
||||
import Utils from "../utils";
|
||||
const utils = new Utils();
|
||||
|
||||
export interface ChatConfig {
|
||||
displayName: string,
|
||||
composerInitialValue?: string,
|
||||
customDescription?: string
|
||||
}
|
||||
|
||||
export function openChat(config: ChatConfig): void {
|
||||
const chat = document.createElement("div");
|
||||
chat.classList.add("sbChatNotice");
|
||||
chat.style.zIndex = "2000";
|
||||
|
||||
const iframe= document.createElement("iframe");
|
||||
iframe.src = "https://chat.sponsor.ajay.app/#" + utils.objectToURI("", config, false);
|
||||
chat.appendChild(iframe);
|
||||
|
||||
const closeButton = document.createElement("img");
|
||||
closeButton.classList.add("sbChatClose");
|
||||
closeButton.src = chrome.extension.getURL("icons/close.png");
|
||||
closeButton.addEventListener("click", () => {
|
||||
chat.remove();
|
||||
closeButton.remove();
|
||||
});
|
||||
chat.appendChild(closeButton);
|
||||
|
||||
const referenceNode = utils.findReferenceNode();
|
||||
referenceNode.prepend(chat);
|
||||
}
|
||||
|
||||
export async function openWarningChat(warningMessage: string): Promise<void> {
|
||||
const userNameData = await utils.asyncRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID);
|
||||
const userName = userNameData.ok ? JSON.parse(userNameData.responseText).userName : "";
|
||||
const publicUserID = await utils.getHash(Config.config.userID);
|
||||
const warningReasonMatch = warningMessage.match(/Warning reason: '(.+)'/);
|
||||
|
||||
openChat({
|
||||
displayName: `${userName ? userName : ``}${userName !== publicUserID ? ` | ${publicUserID}` : ``}`,
|
||||
composerInitialValue: `I got a warning and want to know what I need to do to improve.` +
|
||||
warningReasonMatch ? ` Warning reason: ${warningReasonMatch[1]}` : ``,
|
||||
customDescription: chrome.i18n.getMessage("warningChatInfo")
|
||||
});
|
||||
}
|
||||
@@ -15,6 +15,7 @@ export interface PreviewBarSegment {
|
||||
segment: [number, number];
|
||||
category: string;
|
||||
unsubmitted: boolean;
|
||||
showLarger: boolean;
|
||||
}
|
||||
|
||||
class PreviewBar {
|
||||
@@ -102,9 +103,10 @@ class PreviewBar {
|
||||
let currentSegmentLength = Infinity;
|
||||
|
||||
for (const seg of this.segments) {
|
||||
if (seg.segment[0] <= timeInSeconds && seg.segment[1] > timeInSeconds) {
|
||||
const segmentLength = seg.segment[1] - seg.segment[0];
|
||||
|
||||
const segmentLength = seg.segment[1] - seg.segment[0];
|
||||
const startTime = segmentLength !== 0 ? seg.segment[0] : Math.floor(seg.segment[0]);
|
||||
const endTime = segmentLength !== 0 ? seg.segment[1] : Math.ceil(seg.segment[1]);
|
||||
if (startTime <= timeInSeconds && endTime >= timeInSeconds) {
|
||||
if (segmentLength < currentSegmentLength) {
|
||||
currentSegmentLength = segmentLength;
|
||||
segment = seg;
|
||||
@@ -181,10 +183,10 @@ class PreviewBar {
|
||||
});
|
||||
}
|
||||
|
||||
createBar({category, unsubmitted, segment}: PreviewBarSegment): HTMLLIElement {
|
||||
createBar({category, unsubmitted, segment, showLarger}: PreviewBarSegment): HTMLLIElement {
|
||||
const bar = document.createElement('li');
|
||||
bar.classList.add('previewbar');
|
||||
bar.innerHTML = ' ';
|
||||
bar.innerHTML = showLarger ? ' ' : ' ';
|
||||
|
||||
const fullCategoryName = (unsubmitted ? 'preview-' : '') + category;
|
||||
bar.setAttribute('sponsorblock-category', fullCategoryName);
|
||||
@@ -193,7 +195,7 @@ class PreviewBar {
|
||||
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[fullCategoryName]?.opacity;
|
||||
|
||||
bar.style.position = "absolute";
|
||||
bar.style.width = this.timeToPercentage(segment[1] - segment[0]);
|
||||
if (segment[1] - segment[0] > 0) bar.style.width = this.timeToPercentage(segment[1] - segment[0]);
|
||||
bar.style.left = this.timeToPercentage(segment[0]);
|
||||
|
||||
return bar;
|
||||
|
||||
100
src/js-components/skipButtonControlBar.ts
Normal file
@@ -0,0 +1,100 @@
|
||||
import Config from "../config";
|
||||
import { SponsorTime } from "../types";
|
||||
import { getSkippingText } from "../utils/categoryUtils";
|
||||
|
||||
|
||||
export interface SkipButtonControlBarProps {
|
||||
skip: (segment: SponsorTime) => void;
|
||||
}
|
||||
|
||||
export class SkipButtonControlBar {
|
||||
|
||||
container: HTMLElement;
|
||||
skipIcon: HTMLImageElement;
|
||||
textContainer: HTMLElement;
|
||||
chapterText: HTMLElement;
|
||||
segment: SponsorTime;
|
||||
|
||||
showKeybindHint = true;
|
||||
|
||||
timeout: NodeJS.Timeout;
|
||||
duration = 0;
|
||||
|
||||
skip: (segment: SponsorTime) => void;
|
||||
|
||||
constructor(props: SkipButtonControlBarProps) {
|
||||
this.skip = props.skip;
|
||||
|
||||
this.container = document.createElement("div");
|
||||
this.container.classList.add("skipButtonControlBarContainer");
|
||||
this.container.classList.add("hidden");
|
||||
|
||||
this.skipIcon = document.createElement("img");
|
||||
this.skipIcon.src = chrome.runtime.getURL("icons/skipIcon.svg");
|
||||
this.skipIcon.classList.add("ytp-button");
|
||||
this.skipIcon.id = "sbSkipIconControlBarImage";
|
||||
|
||||
this.textContainer = document.createElement("div");
|
||||
|
||||
this.container.appendChild(this.skipIcon);
|
||||
this.container.appendChild(this.textContainer);
|
||||
this.container.addEventListener("click", () => this.toggleSkip());
|
||||
this.container.addEventListener("mouseenter", () => this.stopTimer());
|
||||
this.container.addEventListener("mouseleave", () => this.startTimer());
|
||||
}
|
||||
|
||||
getElement(): HTMLElement {
|
||||
return this.container;
|
||||
}
|
||||
|
||||
attachToPage(): void {
|
||||
const leftControlsContainer = document.querySelector(".ytp-left-controls");
|
||||
this.chapterText = document.querySelector(".ytp-chapter-container");
|
||||
|
||||
if (leftControlsContainer && !leftControlsContainer.contains(this.container)) {
|
||||
leftControlsContainer.insertBefore(this.container, this.chapterText);
|
||||
}
|
||||
}
|
||||
|
||||
enable(segment: SponsorTime, duration?: number): void {
|
||||
if (duration) this.duration = duration;
|
||||
this.segment = segment;
|
||||
this.refreshText();
|
||||
|
||||
this.startTimer();
|
||||
}
|
||||
|
||||
refreshText(): void {
|
||||
if (this.segment) {
|
||||
this.chapterText?.classList?.add("hidden");
|
||||
this.container.classList.remove("hidden");
|
||||
this.textContainer.innerText = getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "");
|
||||
}
|
||||
}
|
||||
|
||||
setShowKeybindHint(show: boolean): void {
|
||||
this.showKeybindHint = show;
|
||||
|
||||
this.refreshText();
|
||||
}
|
||||
|
||||
stopTimer(): void {
|
||||
if (this.timeout) clearTimeout(this.timeout);
|
||||
}
|
||||
|
||||
startTimer(): void {
|
||||
this.stopTimer();
|
||||
this.timeout = setTimeout(() => this.disable(), Math.max(Config.config.skipNoticeDuration, this.duration) * 1000);
|
||||
}
|
||||
|
||||
disable(): void {
|
||||
this.container.classList.add("hidden");
|
||||
this.chapterText?.classList?.remove("hidden");
|
||||
}
|
||||
|
||||
toggleSkip(): void {
|
||||
this.skip(this.segment);
|
||||
this.disable();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ interface DefaultMessage {
|
||||
message:
|
||||
"update"
|
||||
| "sponsorStart"
|
||||
| "isInfoFound"
|
||||
| "getVideoID"
|
||||
| "getChannelID"
|
||||
| "isChannelWhitelisted"
|
||||
@@ -25,7 +24,12 @@ interface BoolValueMessage {
|
||||
value: boolean;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage);
|
||||
interface IsInfoFoundMessage {
|
||||
message: "isInfoFound";
|
||||
updating: boolean;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage);
|
||||
|
||||
interface IsInfoFoundMessageResponse {
|
||||
found: boolean;
|
||||
@@ -53,5 +57,6 @@ export type MessageResponse =
|
||||
| GetVideoIdResponse
|
||||
| GetChannelIDResponse
|
||||
| SponsorStartResponse
|
||||
| IsChannelWhitelistedResponse;
|
||||
| IsChannelWhitelistedResponse
|
||||
| Record<string, never>;
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ window.SB = Config;
|
||||
|
||||
import Utils from "./utils";
|
||||
import CategoryChooser from "./render/CategoryChooser";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
const utils = new Utils();
|
||||
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
@@ -28,6 +29,10 @@ async function init() {
|
||||
|
||||
await utils.wait(() => Config.config !== null);
|
||||
|
||||
if (!showDonationLink()) {
|
||||
document.getElementById("sbDonate").style.visibility = "hidden";
|
||||
}
|
||||
|
||||
// Set all of the toggle options to the correct option
|
||||
const optionsContainer = document.getElementById("options");
|
||||
const optionsElements = optionsContainer.querySelectorAll("*");
|
||||
@@ -40,9 +45,10 @@ async function init() {
|
||||
continue;
|
||||
}
|
||||
|
||||
const option = optionsElements[i].getAttribute("sync-option");
|
||||
|
||||
switch (optionsElements[i].getAttribute("option-type")) {
|
||||
case "toggle": {
|
||||
const option = optionsElements[i].getAttribute("sync-option");
|
||||
const optionResult = Config.config[option];
|
||||
|
||||
const checkbox = optionsElements[i].querySelector("input");
|
||||
@@ -95,16 +101,15 @@ async function init() {
|
||||
break;
|
||||
}
|
||||
case "text-change": {
|
||||
const textChangeOption = optionsElements[i].getAttribute("sync-option");
|
||||
const textChangeInput = <HTMLInputElement> optionsElements[i].querySelector(".option-text-box");
|
||||
|
||||
const textChangeSetButton = <HTMLElement> optionsElements[i].querySelector(".text-change-set");
|
||||
|
||||
textChangeInput.value = Config.config[textChangeOption];
|
||||
textChangeInput.value = Config.config[option];
|
||||
|
||||
textChangeSetButton.addEventListener("click", async () => {
|
||||
// See if anything extra must be done
|
||||
switch (textChangeOption) {
|
||||
switch (option) {
|
||||
case "serverAddress": {
|
||||
const result = validateServerAddress(textChangeInput.value);
|
||||
|
||||
@@ -130,7 +135,7 @@ async function init() {
|
||||
}
|
||||
}
|
||||
|
||||
Config.config[textChangeOption] = textChangeInput.value;
|
||||
Config.config[option] = textChangeInput.value;
|
||||
});
|
||||
|
||||
// Reset to the default if needed
|
||||
@@ -138,9 +143,9 @@ async function init() {
|
||||
textChangeResetButton.addEventListener("click", () => {
|
||||
if (!confirm(chrome.i18n.getMessage("areYouSureReset"))) return;
|
||||
|
||||
Config.config[textChangeOption] = Config.defaults[textChangeOption];
|
||||
Config.config[option] = Config.defaults[option];
|
||||
|
||||
textChangeInput.value = Config.config[textChangeOption];
|
||||
textChangeInput.value = Config.config[option];
|
||||
});
|
||||
|
||||
break;
|
||||
@@ -175,30 +180,42 @@ async function init() {
|
||||
|
||||
break;
|
||||
}
|
||||
case "display":{
|
||||
case "display": {
|
||||
updateDisplayElement(<HTMLElement> optionsElements[i])
|
||||
break;
|
||||
}
|
||||
case "number-change": {
|
||||
const numberChangeOption = optionsElements[i].getAttribute("sync-option");
|
||||
const configValue = Config.config[numberChangeOption];
|
||||
const configValue = Config.config[option];
|
||||
const numberInput = optionsElements[i].querySelector("input");
|
||||
|
||||
if (isNaN(configValue) || configValue < 0) {
|
||||
numberInput.value = Config.defaults[numberChangeOption];
|
||||
numberInput.value = Config.defaults[option];
|
||||
} else {
|
||||
numberInput.value = configValue;
|
||||
}
|
||||
|
||||
numberInput.addEventListener("input", () => {
|
||||
Config.config[numberChangeOption] = numberInput.value;
|
||||
Config.config[option] = numberInput.value;
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
case "selector": {
|
||||
const configValue = Config.config[option];
|
||||
const selectorElement = optionsElements[i].querySelector(".selector-element") as HTMLSelectElement;
|
||||
selectorElement.value = configValue;
|
||||
|
||||
selectorElement.addEventListener("change", () => {
|
||||
let value: string | number = selectorElement.value;
|
||||
if (!isNaN(Number(value))) value = Number(value);
|
||||
|
||||
Config.config[option] = value;
|
||||
});
|
||||
break;
|
||||
}
|
||||
case "react-CategoryChooserComponent":
|
||||
new CategoryChooser(optionsElements[i]);
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -492,6 +509,22 @@ function activatePrivateTextChange(element: HTMLElement) {
|
||||
}
|
||||
});
|
||||
|
||||
// See if anything extra must be done
|
||||
switch (option) {
|
||||
case "userID":
|
||||
utils.asyncRequestToServer("GET", "/api/userInfo", {
|
||||
userID: Config.config[option],
|
||||
values: ["warnings", "banned"]
|
||||
}).then((result) => {
|
||||
const userInfo = JSON.parse(result.responseText);
|
||||
if (userInfo.warnings > 0 || userInfo.banned) {
|
||||
setButton.classList.add("hidden");
|
||||
}
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
element.querySelector(".option-hidden-section").classList.remove("hidden");
|
||||
}
|
||||
|
||||
|
||||
201
src/popup.ts
@@ -3,6 +3,7 @@ import Config from "./config";
|
||||
import Utils from "./utils";
|
||||
import { SponsorTime, SponsorHideType } from "./types";
|
||||
import { Message, MessageResponse } from "./messageTypes";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
const utils = new Utils();
|
||||
|
||||
interface MessageListener {
|
||||
@@ -12,7 +13,7 @@ interface MessageListener {
|
||||
class MessageHandler {
|
||||
messageListener: MessageListener;
|
||||
|
||||
constructor (messageListener?: MessageListener) {
|
||||
constructor(messageListener?: MessageListener) {
|
||||
this.messageListener = messageListener;
|
||||
}
|
||||
|
||||
@@ -107,14 +108,14 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
"sbDonate"
|
||||
].forEach(id => PageElements[id] = document.getElementById(id));
|
||||
|
||||
// Hide donate button on safari
|
||||
if (navigator.vendor === "Apple Computer, Inc.") {
|
||||
// Hide donate button if wanted (Safari, or user choice)
|
||||
if (!showDonationLink()) {
|
||||
PageElements.sbDonate.style.display = "none";
|
||||
}
|
||||
|
||||
//setup click listeners
|
||||
PageElements.sponsorStart.addEventListener("click", sendSponsorStartMessage);
|
||||
PageElements.whitelistToggle.addEventListener("change", function() {
|
||||
PageElements.whitelistToggle.addEventListener("change", function () {
|
||||
if (this.checked) {
|
||||
whitelistChannel();
|
||||
} else {
|
||||
@@ -122,7 +123,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}
|
||||
});
|
||||
PageElements.whitelistForceCheck.addEventListener("click", openOptions);
|
||||
PageElements.toggleSwitch.addEventListener("change", function() {
|
||||
PageElements.toggleSwitch.addEventListener("change", function () {
|
||||
toggleSkipping(!this.checked);
|
||||
});
|
||||
PageElements.submitTimes.addEventListener("click", submitTimes);
|
||||
@@ -174,7 +175,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
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(response) {
|
||||
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function (response) {
|
||||
if (response.status == 200) {
|
||||
const viewCount = JSON.parse(response.responseText).viewCount;
|
||||
if (viewCount != 0) {
|
||||
@@ -191,7 +192,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
});
|
||||
|
||||
//get this time in minutes
|
||||
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(response) {
|
||||
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function (response) {
|
||||
if (response.status == 200) {
|
||||
const minutesSaved = JSON.parse(response.responseText).timeSaved;
|
||||
if (minutesSaved != 0) {
|
||||
@@ -234,18 +235,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
// Must be delayed so it only happens once loaded
|
||||
setTimeout(() => PageElements.sponsorblockPopup.classList.remove("preload"), 250);
|
||||
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, onTabs);
|
||||
getSegmentsFromContentScript(false);
|
||||
|
||||
function onTabs(tabs) {
|
||||
messageHandler.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
|
||||
function onTabs(tabs, updating: boolean): void {
|
||||
messageHandler.sendMessage(tabs[0].id, { message: 'getVideoID' }, function (result) {
|
||||
if (result !== undefined && result.videoID) {
|
||||
currentVideoID = result.videoID;
|
||||
creatingSegment = result.creatingSegment;
|
||||
|
||||
loadTabData(tabs);
|
||||
loadTabData(tabs, updating);
|
||||
} else if (result === undefined && chrome.runtime.lastError) {
|
||||
//this isn't a YouTube video then, or at least the content script is not loaded
|
||||
displayNoVideo();
|
||||
@@ -253,31 +251,32 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
});
|
||||
}
|
||||
|
||||
function loadTabData(tabs) {
|
||||
function loadTabData(tabs, updating: boolean): void {
|
||||
if (!currentVideoID) {
|
||||
//this isn't a YouTube video then
|
||||
displayNoVideo();
|
||||
return;
|
||||
}
|
||||
|
||||
//load video times for this video
|
||||
const sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
|
||||
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
|
||||
sponsorTimes = sponsorTimesStorage;
|
||||
}
|
||||
|
||||
sponsorTimes = Config.config.segmentTimes.get(currentVideoID) ?? [];
|
||||
updateSegmentEditingUI();
|
||||
|
||||
//check if this video's sponsors are known
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: 'isInfoFound'},
|
||||
{ message: 'isInfoFound', updating },
|
||||
infoFound
|
||||
);
|
||||
}
|
||||
|
||||
function infoFound(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
|
||||
if(chrome.runtime.lastError) {
|
||||
function getSegmentsFromContentScript(updating: boolean): void {
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, (tabs) => onTabs(tabs, updating));
|
||||
}
|
||||
|
||||
function infoFound(request: { found: boolean, sponsorTimes: SponsorTime[] }) {
|
||||
if (chrome.runtime.lastError) {
|
||||
//This page doesn't have the injected content script, or at least not yet
|
||||
displayNoVideo();
|
||||
return;
|
||||
@@ -292,10 +291,12 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
if (request.found) {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
|
||||
PageElements.refreshSegmentsButton.classList.remove("hidden");
|
||||
|
||||
displayDownloadedSponsorTimes(request);
|
||||
} else {
|
||||
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
|
||||
PageElements.refreshSegmentsButton.classList.add("hidden");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,8 +307,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: 'isChannelWhitelisted'},
|
||||
function(response) {
|
||||
{ message: 'isChannelWhitelisted' },
|
||||
function (response) {
|
||||
if (response.value) {
|
||||
PageElements.whitelistChannel.style.display = "none";
|
||||
PageElements.unwhitelistChannel.style.display = "unset";
|
||||
@@ -315,7 +316,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -327,7 +328,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, (tabs) => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{from: 'popup', message: 'sponsorStart'},
|
||||
{ from: 'popup', message: 'sponsorStart' },
|
||||
async (response) => {
|
||||
startSponsorCallback(response);
|
||||
|
||||
@@ -351,7 +352,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
});
|
||||
}
|
||||
|
||||
function startSponsorCallback(response: {creatingSegment: boolean}) {
|
||||
function startSponsorCallback(response: { creatingSegment: boolean }) {
|
||||
creatingSegment = response.creatingSegment;
|
||||
|
||||
// Only update the segments after a segment was created
|
||||
@@ -364,16 +365,19 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}
|
||||
|
||||
//display the video times from the array at the top, in a different section
|
||||
function displayDownloadedSponsorTimes(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
|
||||
function displayDownloadedSponsorTimes(request: { found: boolean, sponsorTimes: SponsorTime[] }) {
|
||||
if (request.sponsorTimes != undefined) {
|
||||
|
||||
// Sort list by start time
|
||||
const segmentTimes = request.sponsorTimes
|
||||
.sort((a, b) => a.segment[1] - b.segment[1])
|
||||
.sort((a, b) => a.segment[0] - b.segment[0]);
|
||||
.sort((a, b) => a.segment[1] - b.segment[1])
|
||||
.sort((a, b) => a.segment[0] - b.segment[0]);
|
||||
|
||||
//add them as buttons to the issue reporting container
|
||||
const container = document.getElementById("issueReporterTimeButtons");
|
||||
while (container.firstChild) {
|
||||
container.removeChild(container.firstChild);
|
||||
}
|
||||
|
||||
for (let i = 0; i < segmentTimes.length; i++) {
|
||||
const UUID = segmentTimes[i].UUID;
|
||||
|
||||
@@ -385,7 +389,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
categoryColorCircle.style.backgroundColor = Config.config.barTypes[segmentTimes[i].category]?.color;
|
||||
categoryColorCircle.classList.add("dot");
|
||||
categoryColorCircle.classList.add("sponsorTimesCategoryColorCircle");
|
||||
|
||||
|
||||
let extraInfo = "";
|
||||
if (segmentTimes[i].hidden === SponsorHideType.Downvoted) {
|
||||
//this one is downvoted
|
||||
@@ -394,7 +398,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//this one is too short
|
||||
extraInfo = " (" + chrome.i18n.getMessage("hiddenDueToDuration") + ")";
|
||||
}
|
||||
|
||||
|
||||
const textNode = document.createTextNode(utils.shortCategoryName(segmentTimes[i].category) + extraInfo);
|
||||
const segmentTimeFromToNode = document.createElement("div");
|
||||
segmentTimeFromToNode.innerText = utils.getFormattedTime(segmentTimes[i].segment[0], true) + " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true);
|
||||
@@ -416,13 +420,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
const upvoteButton = document.createElement("img");
|
||||
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
|
||||
upvoteButton.className = "voteButton";
|
||||
upvoteButton.src = chrome.extension.getURL("icons/thumbs_up.svg");
|
||||
upvoteButton.src = chrome.runtime.getURL("icons/thumbs_up.svg");
|
||||
upvoteButton.addEventListener("click", () => vote(1, UUID));
|
||||
|
||||
const downvoteButton = document.createElement("img");
|
||||
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
|
||||
downvoteButton.className = "voteButton";
|
||||
downvoteButton.src = chrome.extension.getURL("icons/thumbs_down.svg");
|
||||
downvoteButton.src = chrome.runtime.getURL("icons/thumbs_down.svg");
|
||||
downvoteButton.addEventListener("click", () => vote(0, UUID));
|
||||
|
||||
//uuid button
|
||||
@@ -430,8 +434,12 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
const uuidButton = document.createElement("img");
|
||||
uuidButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
|
||||
uuidButton.className = "voteButton";
|
||||
uuidButton.src = chrome.extension.getURL("icons/clipboard.svg");
|
||||
uuidButton.addEventListener("click", () => navigator.clipboard.writeText(UUID));
|
||||
uuidButton.src = chrome.runtime.getURL("icons/clipboard.svg");
|
||||
uuidButton.addEventListener("click", () => {
|
||||
navigator.clipboard.writeText(UUID);
|
||||
const stopAnimation = utils.applyLoadingAnimation(uuidButton, 0.3);
|
||||
stopAnimation();
|
||||
});
|
||||
|
||||
//add thumbs up, thumbs down and uuid copy buttons to the container
|
||||
voteButtonsContainer.appendChild(upvoteButton);
|
||||
@@ -439,7 +447,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
voteButtonsContainer.appendChild(uuidButton);
|
||||
|
||||
//add click listener to open up vote panel
|
||||
sponsorTimeButton.addEventListener("click", function() {
|
||||
sponsorTimeButton.addEventListener("click", function () {
|
||||
voteButtonsContainer.classList.toggle("voteButtonsContainer--hide");
|
||||
});
|
||||
|
||||
@@ -471,15 +479,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: 'submitTimes'},
|
||||
{ message: 'submitTimes' },
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function showNoticeAgain() {
|
||||
Config.config.dontShowNotice = false;
|
||||
|
||||
|
||||
PageElements.showNoticeAgain.style.display = "none";
|
||||
}
|
||||
|
||||
@@ -492,11 +500,11 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
//make the options div visible
|
||||
function openOptions() {
|
||||
chrome.runtime.sendMessage({"message": "openConfig"});
|
||||
chrome.runtime.sendMessage({ "message": "openConfig" });
|
||||
}
|
||||
|
||||
function openHelp() {
|
||||
chrome.runtime.sendMessage({"message": "openHelp"});
|
||||
chrome.runtime.sendMessage({ "message": "openHelp" });
|
||||
}
|
||||
|
||||
//make the options username setting option visible
|
||||
@@ -509,7 +517,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.setUsernameContainer.style.display = "none";
|
||||
PageElements.setUsername.style.display = "flex";
|
||||
PageElements.setUsername.classList.add("SBExpanded");
|
||||
|
||||
|
||||
PageElements.setUsernameStatusContainer.style.display = "none";
|
||||
|
||||
PageElements.sponsorTimesContributionsContainer.classList.add("hidden");
|
||||
@@ -548,18 +556,18 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
function displayNoVideo() {
|
||||
document.getElementById("loadingIndicator").innerText = chrome.i18n.getMessage("noVideoID");
|
||||
}
|
||||
|
||||
|
||||
function addVoteMessage(message, UUID) {
|
||||
const voteButtonsContainer = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
|
||||
voteButtonsContainer.style.display = "none";
|
||||
|
||||
const voteStatusContainer = document.getElementById("sponsorTimesVoteStatusContainer" + UUID);
|
||||
voteStatusContainer.style.removeProperty("display");
|
||||
|
||||
|
||||
const thanksForVotingText = document.getElementById("sponsorTimesThanksForVotingText" + UUID);
|
||||
thanksForVotingText.innerText = message;
|
||||
}
|
||||
|
||||
|
||||
function vote(type, UUID) {
|
||||
//add loading info
|
||||
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
|
||||
@@ -590,8 +598,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: 'getChannelID'},
|
||||
function(response) {
|
||||
{ message: 'getChannelID' },
|
||||
function (response) {
|
||||
if (!response.channelID) {
|
||||
alert(chrome.i18n.getMessage("channelDataNotFound") + " https://github.com/ajayyy/SponsorBlock/issues/753");
|
||||
return;
|
||||
@@ -623,10 +631,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id, {
|
||||
message: 'whitelistChange',
|
||||
value: true
|
||||
});
|
||||
}
|
||||
message: 'whitelistChange',
|
||||
value: true
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
@@ -641,52 +649,59 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: 'getChannelID'},
|
||||
function(response) {
|
||||
{ message: 'getChannelID' },
|
||||
function (response) {
|
||||
//get whitelisted channels
|
||||
let whitelistedChannels = Config.config.whitelistedChannels;
|
||||
if (whitelistedChannels == undefined) {
|
||||
whitelistedChannels = [];
|
||||
}
|
||||
let whitelistedChannels = Config.config.whitelistedChannels;
|
||||
if (whitelistedChannels == undefined) {
|
||||
whitelistedChannels = [];
|
||||
}
|
||||
|
||||
//remove this channel
|
||||
const index = whitelistedChannels.indexOf(response.channelID);
|
||||
whitelistedChannels.splice(index, 1);
|
||||
//remove this channel
|
||||
const index = whitelistedChannels.indexOf(response.channelID);
|
||||
whitelistedChannels.splice(index, 1);
|
||||
|
||||
//change button
|
||||
PageElements.whitelistChannel.style.display = "unset";
|
||||
PageElements.unwhitelistChannel.style.display = "none";
|
||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
|
||||
//change button
|
||||
PageElements.whitelistChannel.style.display = "unset";
|
||||
PageElements.unwhitelistChannel.style.display = "none";
|
||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
|
||||
|
||||
//save this
|
||||
Config.config.whitelistedChannels = whitelistedChannels;
|
||||
//save this
|
||||
Config.config.whitelistedChannels = whitelistedChannels;
|
||||
|
||||
//send a message to the client
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id, {
|
||||
message: 'whitelistChange',
|
||||
value: false
|
||||
});
|
||||
}
|
||||
);
|
||||
//send a message to the client
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id, {
|
||||
message: 'whitelistChange',
|
||||
value: false
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
function refreshSegments() {
|
||||
const stopAnimation = utils.applyLoadingAnimation(PageElements.refreshSegmentsButton, 0.3);
|
||||
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{message: 'refreshSegments'}
|
||||
)}
|
||||
{ message: 'refreshSegments' },
|
||||
(response) => {
|
||||
infoFound(response);
|
||||
stopAnimation();
|
||||
}
|
||||
)
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -694,7 +709,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
* Should skipping be disabled (visuals stay)
|
||||
*/
|
||||
function toggleSkipping(disabled) {
|
||||
Config.config.disableSkipping = disabled;
|
||||
Config.config.disableSkipping = disabled;
|
||||
|
||||
let hiddenButton = PageElements.disableSkipping;
|
||||
let shownButton = PageElements.enableSkipping;
|
||||
@@ -715,13 +730,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
* @param {float} seconds
|
||||
* @returns {string}
|
||||
*/
|
||||
function getFormattedHours(minutes) {
|
||||
minutes = Math.round(minutes * 10) / 10
|
||||
const hours = Math.floor(minutes / 60);
|
||||
return (hours > 0 ? hours + "h " : "") + (minutes % 60).toFixed(1);
|
||||
}
|
||||
|
||||
//end of function
|
||||
function getFormattedHours(minutes) {
|
||||
minutes = Math.round(minutes * 10) / 10
|
||||
const hours = Math.floor(minutes / 60);
|
||||
return (hours > 0 ? hours + "h " : "") + (minutes % 60).toFixed(1);
|
||||
}
|
||||
|
||||
//end of function
|
||||
}
|
||||
|
||||
if (chrome.tabs != undefined) {
|
||||
|
||||
@@ -5,7 +5,8 @@ import Utils from "../utils";
|
||||
const utils = new Utils();
|
||||
|
||||
import SkipNoticeComponent, { SkipNoticeAction } from "../components/SkipNoticeComponent";
|
||||
import { SponsorTime, ContentContainer } from "../types";
|
||||
import { SponsorTime, ContentContainer, NoticeVisbilityMode } from "../types";
|
||||
import Config from "../config";
|
||||
|
||||
class SkipNotice {
|
||||
segments: SponsorTime[];
|
||||
@@ -17,7 +18,7 @@ class SkipNotice {
|
||||
|
||||
skipNoticeRef: React.MutableRefObject<SkipNoticeComponent>;
|
||||
|
||||
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer) {
|
||||
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer, unskipTime: number = null) {
|
||||
this.skipNoticeRef = React.createRef();
|
||||
|
||||
this.segments = segments;
|
||||
@@ -44,11 +45,20 @@ class SkipNotice {
|
||||
autoSkip={autoSkip}
|
||||
contentContainer={contentContainer}
|
||||
ref={this.skipNoticeRef}
|
||||
closeListener={() => this.close()} />,
|
||||
closeListener={() => this.close()}
|
||||
smaller={Config.config.noticeVisibilityMode >= NoticeVisbilityMode.MiniForAll
|
||||
|| (Config.config.noticeVisibilityMode >= NoticeVisbilityMode.MiniForAutoSkip && autoSkip)}
|
||||
unskipTime={unskipTime} />,
|
||||
this.noticeElement
|
||||
);
|
||||
}
|
||||
|
||||
setShowKeybindHint(value: boolean): void {
|
||||
this.skipNoticeRef?.current?.setState({
|
||||
showKeybindHint: value
|
||||
});
|
||||
}
|
||||
|
||||
close(): void {
|
||||
ReactDOM.unmountComponentAtNode(this.noticeElement);
|
||||
|
||||
@@ -59,7 +69,7 @@ class SkipNotice {
|
||||
}
|
||||
|
||||
toggleSkip(): void {
|
||||
this.skipNoticeRef.current.prepAction(SkipNoticeAction.Unskip);
|
||||
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
73
src/render/Tooltip.tsx
Normal file
@@ -0,0 +1,73 @@
|
||||
import * as React from "react";
|
||||
import * as ReactDOM from "react-dom";
|
||||
|
||||
export interface TooltipProps {
|
||||
text: string,
|
||||
link?: string,
|
||||
referenceNode: HTMLElement,
|
||||
prependElement?: HTMLElement, // Element to append before
|
||||
bottomOffset?: string
|
||||
timeout?: number;
|
||||
}
|
||||
|
||||
export class Tooltip {
|
||||
text: string;
|
||||
container: HTMLDivElement;
|
||||
|
||||
timer: NodeJS.Timeout;
|
||||
|
||||
constructor(props: TooltipProps) {
|
||||
props.bottomOffset ??= "70px";
|
||||
this.text = props.text;
|
||||
|
||||
this.container = document.createElement('div');
|
||||
this.container.id = "sponsorTooltip" + props.text;
|
||||
this.container.style.display = "relative";
|
||||
|
||||
if (props.prependElement) {
|
||||
props.referenceNode.insertBefore(this.container, props.prependElement);
|
||||
} else {
|
||||
props.referenceNode.appendChild(this.container);
|
||||
}
|
||||
|
||||
if (props.timeout) {
|
||||
this.timer = setTimeout(() => this.close(), props.timeout * 1000);
|
||||
}
|
||||
|
||||
ReactDOM.render(
|
||||
<div style={{bottom: props.bottomOffset}}
|
||||
className="sponsorBlockTooltip" >
|
||||
<div>
|
||||
<img className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
</img>
|
||||
<span className="sponsorSkipObject">
|
||||
{this.text + (props.link ? ". " : "")}
|
||||
{props.link ?
|
||||
<a style={{textDecoration: "underline"}}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href={props.link}>
|
||||
{chrome.i18n.getMessage("LearnMore")}
|
||||
</a>
|
||||
: null}
|
||||
</span>
|
||||
</div>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style ={{float: "right" }}
|
||||
onClick={() => this.close()}>
|
||||
|
||||
{chrome.i18n.getMessage("GotIt")}
|
||||
</button>
|
||||
</div>,
|
||||
this.container
|
||||
)
|
||||
}
|
||||
|
||||
close(): void {
|
||||
ReactDOM.unmountComponentAtNode(this.container);
|
||||
this.container.remove();
|
||||
|
||||
if (this.timer) clearTimeout(this.timer);
|
||||
}
|
||||
}
|
||||
42
src/types.ts
@@ -4,9 +4,9 @@ import SkipNotice from "./render/SkipNotice";
|
||||
|
||||
export interface ContentContainer {
|
||||
(): {
|
||||
vote: (type: number, UUID: string, category?: string, skipNotice?: SkipNoticeComponent) => void,
|
||||
vote: (type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent) => void,
|
||||
dontShowNoticeAgain: () => void,
|
||||
unskipSponsorTime: (segment: SponsorTime) => void,
|
||||
unskipSponsorTime: (segment: SponsorTime, unskipTime: number) => void,
|
||||
sponsorTimes: SponsorTime[],
|
||||
sponsorTimesSubmitting: SponsorTime[],
|
||||
skipNotices: SkipNotice[],
|
||||
@@ -41,7 +41,7 @@ export enum CategorySkipOption {
|
||||
}
|
||||
|
||||
export interface CategorySelection {
|
||||
name: string;
|
||||
name: Category;
|
||||
option: CategorySkipOption
|
||||
}
|
||||
|
||||
@@ -51,6 +51,14 @@ export enum SponsorHideType {
|
||||
MinimumDuration
|
||||
}
|
||||
|
||||
export enum CategoryActionType {
|
||||
Skippable = "", // Strings are used to find proper language configs
|
||||
POI = "_POI"
|
||||
}
|
||||
|
||||
export type SegmentUUID = string & { __segmentUUIDBrand: unknown };
|
||||
export type Category = string & { __categoryBrand: unknown };
|
||||
|
||||
export enum SponsorSourceType {
|
||||
Server = undefined,
|
||||
Local = 1
|
||||
@@ -58,9 +66,9 @@ export enum SponsorSourceType {
|
||||
|
||||
export interface SponsorTime {
|
||||
segment: [number] | [number, number];
|
||||
UUID: string;
|
||||
UUID: SegmentUUID;
|
||||
|
||||
category: string;
|
||||
category: Category;
|
||||
|
||||
hidden?: SponsorHideType;
|
||||
source?: SponsorSourceType;
|
||||
@@ -151,7 +159,7 @@ export interface VideoInfo {
|
||||
isUnlisted: boolean,
|
||||
hasYpcMetadata: boolean,
|
||||
viewCount: string,
|
||||
category: string,
|
||||
category: Category,
|
||||
publishDate: string,
|
||||
ownerChannelName: string,
|
||||
uploadDate: string,
|
||||
@@ -177,4 +185,26 @@ export enum ChannelIDStatus {
|
||||
export interface ChannelIDInfo {
|
||||
id: string,
|
||||
status: ChannelIDStatus
|
||||
}
|
||||
|
||||
export interface SkipToTimeParams {
|
||||
v: HTMLVideoElement,
|
||||
skipTime: number[],
|
||||
skippingSegments: SponsorTime[],
|
||||
openNotice: boolean,
|
||||
forceAutoSkip?: boolean,
|
||||
unskipTime?: number
|
||||
}
|
||||
|
||||
export interface ToggleSkippable {
|
||||
toggleSkip: () => void;
|
||||
setShowKeybindHint: (show: boolean) => void;
|
||||
}
|
||||
|
||||
export enum NoticeVisbilityMode {
|
||||
FullSize = 0,
|
||||
MiniForAutoSkip = 1,
|
||||
MiniForAll = 2,
|
||||
FadedForAutoSkip = 3,
|
||||
FadedForAll = 4
|
||||
}
|
||||
57
src/utils.ts
@@ -158,6 +158,31 @@ export default class Utils {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a spinning animation and returns a function to be called when it should be stopped
|
||||
* The callback will be called when the animation is finished
|
||||
* It waits until a full rotation is complete
|
||||
*/
|
||||
applyLoadingAnimation(element: HTMLElement, time: number, callback?: () => void): () => void {
|
||||
element.style.animation = `rotate ${time}s 0s infinite`;
|
||||
|
||||
return () => {
|
||||
// Make the animation finite
|
||||
element.style.animation = `rotate ${time}s`;
|
||||
|
||||
// When the animation is over, hide the button
|
||||
const animationEndListener = () => {
|
||||
if (callback) callback();
|
||||
|
||||
element.style.animation = "none";
|
||||
|
||||
element.removeEventListener("animationend", animationEndListener);
|
||||
};
|
||||
|
||||
element.addEventListener("animationend", animationEndListener);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges any overlapping timestamp ranges into single segments and returns them as a new array.
|
||||
*/
|
||||
@@ -236,7 +261,6 @@ export default class Utils {
|
||||
const objects = document.getElementsByClassName("sponsorBlockPageBody")[0].children;
|
||||
for (let j = 0; j < objects.length; j++) {
|
||||
const obj = objects[j];
|
||||
|
||||
const localizedMessage = this.getLocalizedMessage(obj.innerHTML.toString());
|
||||
if (localizedMessage) obj.innerHTML = localizedMessage;
|
||||
}
|
||||
@@ -244,7 +268,8 @@ export default class Utils {
|
||||
|
||||
getLocalizedMessage(text: string): string | false {
|
||||
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
|
||||
return v1 ? chrome.i18n.getMessage(v1).replace("\n", "<br/>") : "";
|
||||
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "<")
|
||||
.replace(/"/g, """).replace(/\n/g, "<br/>") : "";
|
||||
});
|
||||
|
||||
if(valNewH != text) {
|
||||
@@ -330,7 +355,7 @@ export default class Utils {
|
||||
}, (response) => {
|
||||
resolve(response);
|
||||
});
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -389,7 +414,22 @@ export default class Utils {
|
||||
return referenceNode;
|
||||
}
|
||||
|
||||
objectToURI<T>(url: string, data: T, includeQuestionMark: boolean): string {
|
||||
let counter = 0;
|
||||
for (const key in data) {
|
||||
const seperator = (url.includes("?") || counter > 0) ? "&" : (includeQuestionMark ? "?" : "");
|
||||
const value = (typeof(data[key]) === "string") ? data[key] as unknown as string : JSON.stringify(data[key]);
|
||||
url += seperator + encodeURIComponent(key) + "=" + encodeURIComponent(value);
|
||||
|
||||
counter++;
|
||||
}
|
||||
|
||||
return url;
|
||||
}
|
||||
|
||||
getFormattedTime(seconds: number, precise?: boolean): string {
|
||||
seconds = Math.max(seconds, 0);
|
||||
|
||||
const hours = Math.floor(seconds / 60 / 60);
|
||||
const minutes = Math.floor(seconds / 60) % 60;
|
||||
let minutesDisplay = String(minutes);
|
||||
@@ -453,14 +493,13 @@ export default class Utils {
|
||||
async getHash(value: string, times = 5000): Promise<string> {
|
||||
if (times <= 0) return "";
|
||||
|
||||
let hashBuffer = new TextEncoder().encode(value).buffer;
|
||||
|
||||
let hashHex = value;
|
||||
for (let i = 0; i < times; i++) {
|
||||
hashBuffer = await crypto.subtle.digest('SHA-256', hashBuffer);
|
||||
}
|
||||
const hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(hashHex).buffer);
|
||||
|
||||
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
||||
hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
}
|
||||
|
||||
return hashHex;
|
||||
}
|
||||
|
||||
23
src/utils/categoryUtils.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { Category, CategoryActionType, SponsorTime } from "../types";
|
||||
|
||||
export function getSkippingText(segments: SponsorTime[], autoSkip: boolean): string {
|
||||
const categoryName = chrome.i18n.getMessage(segments.length > 1 ? "multipleSegments"
|
||||
: "category_" + segments[0].category + "_short") || chrome.i18n.getMessage("category_" + segments[0].category);
|
||||
if (autoSkip) {
|
||||
const messageId = getCategoryActionType(segments[0].category) === CategoryActionType.Skippable
|
||||
? "skipped" : "skipped_to_category";
|
||||
return chrome.i18n.getMessage(messageId).replace("{0}", categoryName);
|
||||
} else {
|
||||
const messageId = getCategoryActionType(segments[0].category) === CategoryActionType.Skippable
|
||||
? "skip_category" : "skip_to_category";
|
||||
return chrome.i18n.getMessage(messageId).replace("{0}", categoryName);
|
||||
}
|
||||
}
|
||||
|
||||
export function getCategoryActionType(category: Category): CategoryActionType {
|
||||
if (category.startsWith("poi_")) {
|
||||
return CategoryActionType.POI;
|
||||
} else {
|
||||
return CategoryActionType.Skippable;
|
||||
}
|
||||
}
|
||||
5
src/utils/configUtils.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import Config from "../config";
|
||||
|
||||
export function showDonationLink(): boolean {
|
||||
return navigator.vendor !== "Apple Computer, Inc." && Config.config.showDonationLink;
|
||||
}
|
||||
@@ -10,6 +10,7 @@ module.exports = env => ({
|
||||
background: path.join(__dirname, srcDir + 'background.ts'),
|
||||
content: path.join(__dirname, srcDir + 'content.ts'),
|
||||
options: path.join(__dirname, srcDir + 'options.ts'),
|
||||
help: path.join(__dirname, srcDir + 'help.ts'),
|
||||
permissions: path.join(__dirname, srcDir + 'permissions.ts')
|
||||
},
|
||||
output: {
|
||||
|
||||