Compare commits

..

76 Commits

Author SHA1 Message Date
Ajay Ramachandran
df58e3670e Merge pull request #431 from ajayyy/react
General fixes
2020-08-06 22:35:32 -04:00
Ajay Ramachandran
f18d0762b3 New Crowdin updates (#417)
* New translations messages.json (Romanian)

* New translations messages.json (Turkish)

* New translations messages.json (Ukrainian)

* New translations messages.json (Chinese Simplified)

* New translations messages.json (Russian)

* New translations messages.json (German)

* New translations messages.json (French)

* New translations messages.json (Dutch)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (Finnish)

* New translations messages.json (Swedish)

* New translations messages.json (Bulgarian)

* New translations messages.json (Spanish)

* New translations messages.json (Portuguese)

* New translations messages.json (Italian)

* New translations messages.json (Polish)

* New translations messages.json (German)

* New translations messages.json (Polish)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (Polish)

* New translations messages.json (French)

* New translations messages.json (German)

* New translations messages.json (French)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Italian)

* New translations messages.json (Polish)

* New translations messages.json (Italian)

* New translations messages.json (Italian)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (French)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (German)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Polish)

* New translations messages.json (Polish)
2020-08-06 22:33:19 -04:00
Ajay Ramachandran
0dd7a41d85 Update version number 2020-08-06 22:32:25 -04:00
Ajay Ramachandran
834f6194ed Change call to use undefined to use default 2020-08-06 22:25:39 -04:00
Ajay Ramachandran
283342afb3 Fixed pausing and restarting the video not skipping 2020-08-06 22:21:09 -04:00
Ajay Ramachandran
87c9489c0e Fix popup appearing twice when there is a manual skip directly after a skip. 2020-08-05 22:42:43 -04:00
Ajay Ramachandran
24bb04e1ed Renamed instances of sponsor to segment or skip segment 2020-08-02 18:41:55 -04:00
Ajay Ramachandran
721faa7032 Fix issue with double notices sometimes appearing 2020-08-02 16:57:43 -04:00
Ajay Ramachandran
e349ac8e33 Don't show NaN as formatted time 2020-08-02 14:38:50 -04:00
Ajay Ramachandran
f4e8909a8d Merge pull request #428 from ajayyy/dependabot/npm_and_yarn/elliptic-6.5.3
Bump elliptic from 6.5.2 to 6.5.3
2020-08-01 11:13:50 -04:00
dependabot[bot]
506c4461e2 Bump elliptic from 6.5.2 to 6.5.3
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.2 to 6.5.3.
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.5.2...v6.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2020-08-01 12:45:27 +00:00
Ajay Ramachandran
3a49eda47f Added comma to description 2020-07-31 21:52:08 -04:00
Ajay Ramachandran
017e22e977 Clarified outro description. 2020-07-28 20:36:25 -04:00
Ajay Ramachandran
8de57309ea Merge pull request #416 from ajayyy/dependabot/npm_and_yarn/lodash-4.17.19
Bump lodash from 4.17.15 to 4.17.19
2020-07-19 12:54:12 -04:00
dependabot[bot]
fbb6963073 Bump lodash from 4.17.15 to 4.17.19
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-19 04:44:43 +00:00
Ajay Ramachandran
bf55b0f233 Merge pull request #415 from ajayyy/react
Fixed minutes not displaying zero when hours are displayed
2020-07-18 22:23:46 -04:00
Ajay Ramachandran
df1d3b401c Update version number 2020-07-18 22:19:47 -04:00
Ajay Ramachandran
4d55a71619 Fixed minutes not displaying zero when hours are displayed 2020-07-18 22:19:13 -04:00
Ajay Ramachandran
29e6ebab29 Merge pull request #414 from ajayyy/react
Improvements
2020-07-18 22:11:44 -04:00
Ajay Ramachandran
97e80c6f4e New Crowdin updates (#407)
* New translations messages.json (Romanian)

* New translations messages.json (German)

* New translations messages.json (French)

* New translations messages.json (Swedish)

* New translations messages.json (Japanese)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (French)

* New translations messages.json (German)
2020-07-18 21:22:23 -04:00
Ajay Ramachandran
3ac730c053 Fix errors when response fails 2020-07-18 21:21:53 -04:00
Ajay Ramachandran
d25951f313 Update version number 2020-07-18 21:20:36 -04:00
Ajay Ramachandran
886e134010 Made all preview segments auto skip 2020-07-18 21:20:18 -04:00
Ajay Ramachandran
cde50b0cb5 Update README.md 2020-07-18 17:52:47 -04:00
Ajay Ramachandran
19ac01a17c Updated description 2020-07-18 15:24:31 -04:00
Ajay Ramachandran
e9e53d1d43 Merge pull request #401 from ajayyy/react
Improvements
2020-07-12 23:09:43 -04:00
Ajay Ramachandran
07ab99a8d0 New Crowdin updates (#400)
* New translations messages.json (Romanian)

* New translations messages.json (German)

* New translations messages.json (Portuguese)

* New translations messages.json (Polish)

* New translations messages.json (Italian)

* New translations messages.json (French)

* New translations messages.json (Finnish)

* New translations messages.json (Spanish)

* New translations messages.json (Russian)

* New translations messages.json (Chinese Simplified)

* New translations messages.json (Ukrainian)

* New translations messages.json (Turkish)

* New translations messages.json (Swedish)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (German)
2020-07-12 23:08:04 -04:00
Ajay Ramachandran
896120d311 Update version number 2020-07-12 23:07:55 -04:00
Ajay Ramachandran
3dc6563048 Default to blank category when submitting 2020-07-12 20:59:35 -04:00
Ajay Ramachandran
2d74ce2093 Added hours to time with skips 2020-07-12 18:52:36 -04:00
Ajay Ramachandran
eac4ca4d71 Add edge 2020-07-08 21:43:26 -04:00
Ajay Ramachandran
399a5af990 Update README.md 2020-07-07 17:48:36 -04:00
Ajay Ramachandran
48861439b7 Don't run time without skips on mobile or invidious 2020-07-05 00:21:26 -04:00
Ajay Ramachandran
bd60875c66 Fix invidious css issues 2020-07-05 00:17:54 -04:00
Ajay Ramachandran
fe8f25fe23 Hide submit button on invidious 2020-07-05 00:11:29 -04:00
Ajay Ramachandran
87f3cf3881 Fixed invidious preview bar 2020-07-05 00:09:18 -04:00
Ajay Ramachandran
0b9df8a45c Remove submitting on mobile 2020-07-05 00:07:10 -04:00
Ajay Ramachandran
59c5b7eefe Remove unused function 2020-07-05 00:05:36 -04:00
Ajay Ramachandran
dea9dac20a Fix crashing on mobile youtube 2020-07-05 00:03:52 -04:00
Ajay Ramachandran
684cd676e5 Delete empty unsubmitted submissions when delete is called 2020-07-04 15:34:29 -04:00
Ajay Ramachandran
929e3396cd New Crowdin updates (#386)
* New translations messages.json (Romanian)

* New translations messages.json (German)

* New translations messages.json (Turkish)

* New translations messages.json (Ukrainian)

* New translations messages.json (Chinese Simplified)

* New translations messages.json (Slovak)

* New translations messages.json (Russian)

* New translations messages.json (French)

* New translations messages.json (Dutch)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (Finnish)

* New translations messages.json (Hungarian)

* New translations messages.json (Swedish)

* New translations messages.json (Bulgarian)

* New translations messages.json (Spanish)

* New translations messages.json (Gujarati)

* New translations messages.json (Polish)

* New translations messages.json (German)

* New translations messages.json (French)

* New translations messages.json (German)

* New translations messages.json (Swedish)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (German)

* New translations messages.json (Russian)

* New translations messages.json (Chinese Simplified)
2020-07-03 21:25:13 -04:00
Ajay Ramachandran
fad3284c4f Merge pull request #399 from ajayyy/react
Save category in preview submissions and other fixes
2020-07-03 21:20:53 -04:00
Ajay Ramachandran
c69047c7f9 Show short names when hovering the preview bar 2020-07-03 21:16:38 -04:00
Ajay Ramachandran
4fc7a69dd5 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into react 2020-07-03 20:58:15 -04:00
Ajay Ramachandran
dd4c903c6a Merge pull request #395 from NDevTK/patch-1
Added config option for excluding skipped content from the video duration
2020-07-03 20:58:01 -04:00
Ajay Ramachandran
c9a2edaf3d Remove unused function 2020-07-03 20:56:45 -04:00
Ajay Ramachandran
8d41af073d Added option to options page 2020-07-03 20:55:58 -04:00
Ajay Ramachandran
bfafcd07cc Fix font issue, NaN issue and remove hide real time 2020-07-03 19:56:08 -04:00
Ajay Ramachandran
77abc1d031 Reuse existing functions 2020-07-03 19:44:15 -04:00
Ajay Ramachandran
809de0e0fd Increased version number 2020-07-03 19:31:18 -04:00
Ajay Ramachandran
e55d1f5115 Removed intermission category and renamed intro to intermission. 2020-07-03 19:31:00 -04:00
Ajay Ramachandran
037bd511b0 Remove keybind restriction.
Closes https://github.com/ajayyy/SponsorBlock/issues/379
2020-07-03 19:07:05 -04:00
Ajay Ramachandran
1265eeb941 Save category with the preview submissions. 2020-07-02 23:34:13 -04:00
Ajay Ramachandran
b3a94142c3 Allow colon on invidious options 2020-07-02 21:39:00 -04:00
Ajay Ramachandran
367657e44e Added intermission category 2020-07-02 21:37:38 -04:00
Ajay Ramachandran
955ee32b46 Remove category update message 2020-07-02 21:13:07 -04:00
Ajay Ramachandran
cd0b1f4a31 Wait for permissions before reloading 2020-07-02 20:56:41 -04:00
Ajay Ramachandran
5c4f0c960c Reload after importing options 2020-07-02 20:50:06 -04:00
Ajay Ramachandran
5ac6dd1a7f Update description 2020-07-02 20:48:39 -04:00
NDevTK
8d53e776b8 Do not show if skipDuration is 0 2020-06-29 19:35:11 +01:00
NDevTK
ec2950786f Skip if skipDuration is 0 2020-06-29 17:52:28 +01:00
Ajay Ramachandran
f33fa2f621 Moved Android to official 2020-06-27 11:38:49 -04:00
NDevTK
fd77748b15 Updated config 2020-06-27 15:20:00 +01:00
NDevTK
3b59389cab Added different ui option 2020-06-27 15:16:36 +01:00
Ajay Ramachandran
e6f53a3ef9 Update README.md 2020-06-27 00:49:55 -04:00
Ajay Ramachandran
b2f1a737f5 Remove port without pre-built release 2020-06-27 00:44:38 -04:00
Ajay Ramachandran
e2c7f4d16f Merge pull request #397 from daniel11420/patch-2
Add more unofficial ports to the Unofficial Ports section in the README
2020-06-27 00:44:00 -04:00
Ajay Ramachandran
4a89dfaac5 Merge pull request #396 from daniel11420/patch-1
Fix typo in README
2020-06-27 00:42:50 -04:00
daniel11420
e47330a79c Add more unofficial ports to the Unofficial Ports section in the README 2020-06-27 06:38:29 +02:00
daniel11420
72fc3620bc Fix typo in README 2020-06-27 06:32:21 +02:00
NDevTK
0ebd7f4f8d Added duration override 2020-06-26 19:33:19 +01:00
NDevTK
beea8181a1 Added config option 2020-06-26 19:19:51 +01:00
Ajay Ramachandran
f0716e8bbb Merge pull request #389 from kittenparry/patch-1
Fix typo in Chrome Users badge
2020-06-22 18:51:02 -04:00
Edvin Boul
783ea5cf5b Fix typo in Chrome Users badge
Chome -> Chrome
2020-06-22 18:29:08 +03:00
Ajay Ramachandran
42a813d325 Merge pull request #388 from ajayyy/react
Another hotfix for name string issue
2020-06-21 15:54:25 -04:00
Ajay Ramachandran
e6dfb5041e Another hotfix for name string issue 2020-06-21 15:53:26 -04:00
37 changed files with 1118 additions and 624 deletions

View File

@@ -11,28 +11,32 @@
<b>Download:</b> <b>Download:</b>
<a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone">Chrome/Chromium</a> | <a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone">Chrome/Chromium</a> |
<a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github">Firefox</a> | <a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github">Firefox</a> |
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Android">Android</a> |
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Edge">Edge</a> |
<a href="https://sponsor.ajay.app">Website</a> | <a href="https://sponsor.ajay.app">Website</a> |
<a href="https://sponsor.ajay.app/stats">Stats</a> <a href="https://sponsor.ajay.app/stats">Stats</a>
</p> </p>
<p align="center"> <p align="center">
<b>Unofficial Ports:</b> <b>Unofficial Ports:</b>
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#mpv-media-player">MPV</a> <a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#mpv-media-player">MPV</a> |
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#kodi">Kodi</a> |
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Unofficial-Ports#ios">iOS</a>
</p> </p>
<p align="center"> <p align="center">
<a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github"><img src="https://img.shields.io/amo/users/sponsorblock?label=Firefox%20Users" alt="Badge"></img></a> <a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github"><img src="https://img.shields.io/amo/users/sponsorblock?label=Firefox%20Users" alt="Badge"></img></a>
<a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone"><img src="https://img.shields.io/chrome-web-store/users/mnjggcdmjocbbbhaepdhchncahnbgone?label=Chome%20Users" alt="Badge"></img></a> <a href="https://chrome.google.com/webstore/detail/mnjggcdmjocbbbhaepdhchncahnbgone"><img src="https://img.shields.io/chrome-web-store/users/mnjggcdmjocbbbhaepdhchncahnbgone?label=Chrome%20Users" alt="Badge"></img></a>
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Sponsors%20Submitted&query=totalSubmissions&suffix=%20sponsors&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkred" alt="Badge"></img></a> <a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Submissions&query=totalSubmissions&suffix=%20segments&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkred" alt="Badge"></img></a>
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Contributing%20Users&query=userCount&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkblue" alt="Badge"></img></a> <a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Contributing%20Users&query=userCount&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetTotalStats&color=darkblue" alt="Badge"></img></a>
<a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Time%20Saved%20From%20Skips&query=daysSaved&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetDaysSavedFormatted&color=darkgreen&suffix=%20days" alt="Badge"></img></a> <a href="https://sponsor.ajay.app/stats"><img src="https://img.shields.io/badge/dynamic/json?label=Time%20Saved%20From%20Skips&query=daysSaved&url=http%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgetDaysSavedFormatted&color=darkgreen&suffix=%20days" alt="Badge"></img></a>
</p> </p>
SponsorBlock is an extension that will skip over sponsored segments of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. SponsorBlock is an open-source crowdsourced browser extension to skip sponsor segments in YouTube videos. Users submit when a sponsor happens from the extension, and the extension automatically skips sponsors it knows about. It also supports skipping other categories, such as intros, outros and reminders to subscribe.
Also support Invidio.us. It also supports Invidio.us.
**Translate:** [![Crowdin](https://badges.crowdin.net/sponsorblock/localized.svg)](https://crowdin.com/project/sponsorblock) **Translate:** [![Crowdin](https://badges.crowdin.net/sponsorblock/localized.svg)](https://crowdin.com/project/sponsorblock)

View File

@@ -1,7 +1,7 @@
{ {
"name": "__MSG_fullName__", "name": "__MSG_fullName__",
"short_name": "SponsorBlock", "short_name": "SponsorBlock",
"version": "2.0.2.1", "version": "2.0.5",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_Description__", "description": "__MSG_Description__",
"content_scripts": [{ "content_scripts": [{
@@ -50,7 +50,7 @@
"*://*/*" "*://*/*"
], ],
"browser_action": { "browser_action": {
"default_title": "__MSG_Name__", "default_title": "SponsorBlock",
"default_popup": "popup.html" "default_popup": "popup.html"
}, },
"background": { "background": {

12
package-lock.json generated
View File

@@ -4915,9 +4915,9 @@
"integrity": "sha512-RE1pv2sjQiDRRN1nI0fJ0eQHZ9le4oobu16OArnwEUV5ycAU5SNjFyvzjZ1gPUAqBa2Ud1XagtW8j3ZXfHuQHA==" "integrity": "sha512-RE1pv2sjQiDRRN1nI0fJ0eQHZ9le4oobu16OArnwEUV5ycAU5SNjFyvzjZ1gPUAqBa2Ud1XagtW8j3ZXfHuQHA=="
}, },
"elliptic": { "elliptic": {
"version": "6.5.2", "version": "6.5.3",
"resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz",
"integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.4.0", "bn.js": "^4.4.0",
@@ -9056,9 +9056,9 @@
} }
}, },
"lodash": { "lodash": {
"version": "4.17.15", "version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
}, },
"lodash.includes": { "lodash.includes": {
"version": "4.3.0", "version": "4.3.0",

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock за YouTube - пропускай спонсорства", "message": "SponsorBlock за YouTube - пропускай спонсорства",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Пропускай спонсорствата в YouTube клипове. Докладвай за спонсорства в клиповете които гледате, за да спестите време на други хора.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Сървърът каза, че тази заявка е невалидна" "message": "Сървърът каза, че тази заявка е невалидна"
}, },

View File

@@ -1,27 +1,23 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock für YouTube - Überspringe Sponsor Anzeigen", "message": "SponsorBlock für YouTube - Überspringe Sponsoren",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": { "Description": {
"message": "Überspringe die gesponserten Inhalte in YouTube-Videos. Melde gesponsorte Inhalte in den von dir angesehenen Videos und erspare anderen die Zeit.", "message": "Überspringe Sponsoren, betteln um Abonnenten und mehr in YouTube Videos. Melde Sponsoren in Videos, die du guckst, um anderen Zeit zu sparen.",
"description": "Description of the extension." "description": "Description of the extension."
}, },
"400": { "400": {
"message": "Ungültige Anforderung" "message": "Der Server meldet, dass diese Anfrage ungültig war"
}, },
"429": { "429": {
"message": "Du hast zu viele Segmente in diesem Video eingereicht. Bist du dir sicher?" "message": "Du hast zu viele Segmente für dieses Video eingereicht. Sind es wirklich so viele?"
}, },
"409": { "409": {
"message": "Dieser Inhalt wurde bereits eingereicht." "message": "Dieser Inhalt wurde bereits eingereicht"
}, },
"channelWhitelisted": { "channelWhitelisted": {
"message": "Kanal auf Whitelist gesetzt!" "message": "Der Kanal wurde auf die Whitelist gesetzt!"
}, },
"Sponsor": { "Sponsor": {
"message": "Sponsor" "message": "Sponsor"
@@ -33,10 +29,10 @@
"message": "gesponsorter Inhalt" "message": "gesponsorter Inhalt"
}, },
"Segments": { "Segments": {
"message": "gesponserten Inhalten" "message": "gesponserte Segmente"
}, },
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Diesen Beitrag aufwerten" "message": "Diese Einreichung positiv bewerten"
}, },
"reportButtonTitle": { "reportButtonTitle": {
"message": "Melden" "message": "Melden"
@@ -60,13 +56,13 @@
"message": "Verstecken" "message": "Verstecken"
}, },
"hitGoBack": { "hitGoBack": {
"message": "Klicke Zurück um die Aktion rückgängig zu machen." "message": "Klicke Nicht Überspringen um die Aktion rückgängig zu machen."
}, },
"unskip": { "unskip": {
"message": "Zurück" "message": "Nicht Überspringen"
}, },
"reskip": { "reskip": {
"message": "Vorwärts" "message": "Nochmal Überspringen"
}, },
"paused": { "paused": {
"message": "Pausiert" "message": "Pausiert"
@@ -75,7 +71,7 @@
"message": "Timer angehalten" "message": "Timer angehalten"
}, },
"confirmMSG": { "confirmMSG": {
"message": "\n\nUm einzelne Werte zu löschen oder zu ändern, klicke auf den Info-Button, oder öffne die Erweiterungs-Übersicht, indem du das Erweiterungssymbol in der rechten oberen Ecke anklickst." "message": "Um einzelne Werte zu löschen oder zu ändern, klicke auf den Info-Button, oder öffne die Erweiterungs-Übersicht, indem du das Erweiterungssymbol in der rechten oberen Ecke anklickst."
}, },
"clearThis": { "clearThis": {
"message": "Bist du sicher, dass du Folgendes löschen möchtest?\n\n" "message": "Bist du sicher, dass du Folgendes löschen möchtest?\n\n"
@@ -84,7 +80,7 @@
"message": "Deine Segmente konnten nicht gesendet werden, bitte versuche es später erneut." "message": "Deine Segmente konnten nicht gesendet werden, bitte versuche es später erneut."
}, },
"sponsorFound": { "sponsorFound": {
"message": "Die gesponsorten Inhalte dieses Videos befinden sich bereits in der Datenbank!" "message": "Die gesponserten Inhalte dieses Videos befinden sich bereits in der Datenbank!"
}, },
"sponsor404": { "sponsor404": {
"message": "Keine Sponsoren gefunden" "message": "Keine Sponsoren gefunden"
@@ -111,7 +107,7 @@
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: " "message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
}, },
"wantToSubmit": { "wantToSubmit": {
"message": "Möchtest du die Segmente für die Video ID senden?" "message": "Möchtest du die Segmente für die Video Id senden"
}, },
"leftTimes": { "leftTimes": {
"message": "Scheinbar hast du einige Segmente noch nicht gesendet. Kehre zur Seite zurück um sie zu senden (sie sind noch gespeichert)." "message": "Scheinbar hast du einige Segmente noch nicht gesendet. Kehre zur Seite zurück um sie zu senden (sie sind noch gespeichert)."
@@ -123,28 +119,28 @@
"message": "Öffne SponsorBlock-Popup" "message": "Öffne SponsorBlock-Popup"
}, },
"SubmitTimes": { "SubmitTimes": {
"message": "Sende Auswahl" "message": "Diese Zeiten einreichen"
}, },
"submitCheck": { "submitCheck": {
"message": "Bist du sicher, dass die Auswahl abgeschickt werden soll?" "message": "Bist du sicher, dass die Auswahl abgeschickt werden soll?"
}, },
"whitelistChannel": { "whitelistChannel": {
"message": "Kanal auf Whitelist setzen " "message": "Kanal auf Whitelist setzen"
}, },
"removeFromWhitelist": { "removeFromWhitelist": {
"message": "Kanal von Whitelist entfernen" "message": "Kanal von der Whitelist entfernen"
}, },
"voteOnTime": { "voteOnTime": {
"message": "Stimme für Zeiten ab" "message": "Stimme für Zeiten ab"
}, },
"recordTimes": { "recordTimes": {
"message": "Lege das Zeitfenster eines gesponsorten Inhalts fest" "message": "Lege das Zeitfenster eines gesponserten Inhalts fest"
}, },
"soFarUHSubmited": { "soFarUHSubmited": {
"message": "Gemeldet wurden von dir bisher" "message": "Gemeldet wurden von dir bisher"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Du hast andere Benutzer bewahrt vor" "message": "Du hast andere Benutzer bewahrt vor "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "Siehe Rangliste" "message": "Siehe Rangliste"
@@ -153,10 +149,10 @@
"message": "hier" "message": "hier"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Klicke den Knopf unten, wenn der gesponsorte Inhalt beginnt und endet, um aufzunehmen und\n einzusenden" "message": "Klicke den Knopf unten, wenn der gesponsorte Inhalt beginnt und endet, um aufzunehmen und\n einzusenden."
}, },
"popupHint": { "popupHint": {
"message": "Hinweis: In den Optionen lässt sich eine Taste für das Festlegen von Anfang/Ende des gesponsorten Inhalts, sowie für das Einsenden festlegen" "message": "Hinweis: In den Optionen lässt sich eine Taste für das Festlegen von Anfang/Ende des gesponserten Inhalts, sowie für das Einsenden festlegen"
}, },
"lastTimes": { "lastTimes": {
"message": "Letzte ausgewählte Zeitabschnitte" "message": "Letzte ausgewählte Zeitabschnitte"
@@ -174,7 +170,7 @@
"message": "Alias festlegen" "message": "Alias festlegen"
}, },
"discordAdvert": { "discordAdvert": {
"message": "Tritt dem offiziellen Discord-Kanal bei und teile Anregungen und Feedback!" "message": "Tritt dem offiziellen Discord Server bei und teile Anregungen und Feedback!"
}, },
"hideThis": { "hideThis": {
"message": "Verstecken" "message": "Verstecken"
@@ -201,13 +197,13 @@
"message": "Dieser Knopf öffnet ein Pop-up auf der Youtube-Seite." "message": "Dieser Knopf öffnet ein Pop-up auf der Youtube-Seite."
}, },
"hideDeleteButton": { "hideDeleteButton": {
"message": "Verstecke Löschen-Knopf in Youtube Leiste" "message": "Verstecke Löschen-Knopf in Youtube-Leiste"
}, },
"showDeleteButton": { "showDeleteButton": {
"message": "Zeige Löschen-Knopf in Youtube Leiste" "message": "Zeige Löschen-Knopf in Youtube-Leiste"
}, },
"whatDeleteButton": { "whatDeleteButton": {
"message": "Dieser Knopf entfernt sämtlich Segmente in der Youtube-Zeitleiste." "message": "Dierser Button im YouTube-Player löscht alle nicht übermittelten Segmente für das aktuelle Video."
}, },
"disableViewTracking": { "disableViewTracking": {
"message": "Deaktiviere das Mitzählen übersprungener Sponsoren" "message": "Deaktiviere das Mitzählen übersprungener Sponsoren"
@@ -216,13 +212,13 @@
"message": "Aktiviere das Mitzählen übersprungener Sponsoren" "message": "Aktiviere das Mitzählen übersprungener Sponsoren"
}, },
"whatViewTracking": { "whatViewTracking": {
"message": "Diese Funktion hält fest, welche Sponsoren von dir übersprungen wurden und hilft anderen zu erfahren, was ihre Einsendungen bewirkt haben.\n Außerdem dienen die Werte zusammen mit positiven Rückmeldungen als Anti-Spam-Schutz. \n Wenn ein gesponsorter Inhalt übersprungen wird, sendet die Erweiterung eine Nachricht an den Server. \n Hoffentlich wird diese Funktion auch weiterhin genutzt, damit der Algorithmus funktioniert. :)" "message": "Diese Funktion hält fest, welche Sponsoren von dir übersprungen wurden und hilft anderen zu erfahren, was ihre Einsendungen bewirkt haben.\n Außerdem dienen die Werte zusammen mit positiven Rückmeldungen als Anti-Spam-Schutz. \n Wenn ein gesponserter Inhalt übersprungen wird, sendet die Erweiterung eine Nachricht an den Server. \n Hoffentlich wird diese Funktion auch weiterhin genutzt, damit der Algorithmus funktioniert. :)"
}, },
"showNotice": { "showNotice": {
"message": "Benachrichtigung wieder zeigen" "message": "Benachrichtigung wieder zeigen"
}, },
"longDescription": { "longDescription": {
"message": "SponsorBlock ist eine Erweiterung, die gesponsorte Segmente in YouTube-Videos überspringt. SponsorBlock ist ein Benutzernetzwerk, bei dem jeder Anfang und Ende eines Werbeblocks einreichen kann. Sobald die Information von einem Nutzer eingereicht wurde, überspringen die Erweiterungen der anderen dieses Segment automatisch.", "message": "SponsorBlock ermöglicht es Ihnen, Sponsoren, Intros, Abonnement-Erinnerungen und andere nervige Teile von YouTube-Videos zu überspringen. SponsorBlock ist eine Crowdsourcing-basierte Browser-Erweiterung, in der jeder Start- und Endzeit von gesponserten und anderen Segmenten von YouTube-Videos einreichen kann. Sobald eine Person diese Informationen einreicht, überspringen alle anderen mit dieser Erweiterung das gesponserte Segment. Sie können auch Nicht-Musik-Abschnitte von Musikvideos überspringen.",
"description": "Full description of the extension on the store pages." "description": "Full description of the extension on the store pages."
}, },
"website": { "website": {
@@ -282,10 +278,10 @@
"message": "Auto-Überspringen deaktivieren" "message": "Auto-Überspringen deaktivieren"
}, },
"enableAutoSkip": { "enableAutoSkip": {
"message": "Auto-Überspringen aktivieren" "message": "Automatisches Überspringen aktivieren"
}, },
"autoSkipDescription": { "autoSkipDescription": {
"message": "Auto-Überspringen überspringt gesponsorte Inhalte für dich. Wenn deaktiviert, fragt die Benachrichtigung, ob übersprungen werden soll." "message": "Auto-Überspringen überspringt gesponserte Inhalte für dich. Wenn deaktiviert, fragt die Benachrichtigung, ob übersprungen werden soll."
}, },
"audioNotification": { "audioNotification": {
"message": "Audio-Benachrichtigung beim Überspringen" "message": "Audio-Benachrichtigung beim Überspringen"
@@ -293,6 +289,12 @@
"audioNotificationDescription": { "audioNotificationDescription": {
"message": "Audio-Benachrichtigung beim Überspringen wird einen Ton abspielen, wenn ein Sponsor übersprungen wird. Wenn deaktiviert (oder wenn Automatisches-Überspringen deaktiviert ist), wird kein Ton abgespielt." "message": "Audio-Benachrichtigung beim Überspringen wird einen Ton abspielen, wenn ein Sponsor übersprungen wird. Wenn deaktiviert (oder wenn Automatisches-Überspringen deaktiviert ist), wird kein Ton abgespielt."
}, },
"showTimeWithSkips": {
"message": "Zeit ohne übersprungenen Inhalt anzeigen"
},
"showTimeWithSkipsDescription": {
"message": "Diese Zeit wird in Klammern neben der aktuellen Zeit in der Suchleiste angezeigt. Diese Zeit die gesamte Dauer des Videos ohne jeglicher Segmente. Dies inkludiert auch Segmente, die als \"In Suchleiste anzeigen\" markiert sind."
},
"youHaveSkipped": { "youHaveSkipped": {
"message": "Du übersprangst " "message": "Du übersprangst "
}, },
@@ -321,7 +323,7 @@
"message": "- Stellen Sie sicher, dass Ihr Segment nur kostenpflichtige Werbeaktionen enthält, nichts anderes.\n- Stellen Sie sicher, dass das Überspringen dieses Segments wertvolle Inhalte nicht abschneiden wird\n- Wenn das ganze Video ein Sponsor ist, bitte nicht melden. Ein vollständiges Video-Reporting-System wird bald herauskommen.\n- Bitte melde keine Haftungsausschlüsse, die Voreingenommenheit zeigen könnten (falls ein Bewertungsvideo gesponsert wird, überspringen Sie nicht, wenn sie dies erwähnen)." "message": "- Stellen Sie sicher, dass Ihr Segment nur kostenpflichtige Werbeaktionen enthält, nichts anderes.\n- Stellen Sie sicher, dass das Überspringen dieses Segments wertvolle Inhalte nicht abschneiden wird\n- Wenn das ganze Video ein Sponsor ist, bitte nicht melden. Ein vollständiges Video-Reporting-System wird bald herauskommen.\n- Bitte melde keine Haftungsausschlüsse, die Voreingenommenheit zeigen könnten (falls ein Bewertungsvideo gesponsert wird, überspringen Sie nicht, wenn sie dies erwähnen)."
}, },
"statusReminder": { "statusReminder": {
"message": "Überprüfen Sie status.sponsor.ajay.app für den Serverstatus." "message": "Überprüfe status.sponsor.ajay.app für den Serverstatus."
}, },
"changeUserID": { "changeUserID": {
"message": "Benutzer ID importieren/exportieren" "message": "Benutzer ID importieren/exportieren"
@@ -366,7 +368,7 @@
"message": "Hinzufügen" "message": "Hinzufügen"
}, },
"addInvidiousInstanceError": { "addInvidiousInstanceError": {
"message": "Dies ist eine ungültige Domain. Dies sollte NUR den Domain-Teil beinhalten. Beispiel: invidious.ajay.app" "message": "Dies ist eine ungültige Domain. Dies soll NUR den Domain-Teil beinhalten. Beispiel: invidious.ajay.app"
}, },
"resetInvidiousInstance": { "resetInvidiousInstance": {
"message": "Invidious Instanzliste zurücksetzen" "message": "Invidious Instanzliste zurücksetzen"
@@ -470,9 +472,6 @@
"theKey": { "theKey": {
"message": "Die Taste" "message": "Die Taste"
}, },
"keyAlreadyUsedByYouTube": {
"message": "wird bereits von Youtube verwendet. Bitte wählen Sie eine andere Taste."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "an eine andere Aktion gebunden. Bitte wählen Sie eine andere Taste." "message": "an eine andere Aktion gebunden. Bitte wählen Sie eine andere Taste."
}, },
@@ -484,16 +483,16 @@
"message": "Sponsor" "message": "Sponsor"
}, },
"category_sponsor_description": { "category_sponsor_description": {
"message": "Bezahlte Promotion, bezahlte Empfehlungen und direkte Werbung. Nicht für Selbstpromotion oder kostenlose Shoutouts an Ursachen/Webseiten/Produkte, die sie mögen." "message": "Bezahlte Promotion, bezahlte Empfehlungen und direkte Werbung. Nicht für Selbstpromotion oder kostenlose Shoutouts an Webseiten/Produkte, die sie mögen."
}, },
"category_intro": { "category_intro": {
"message": "Intro Animation" "message": "Unterbrechung/Intro Animation"
}, },
"category_intro_description": { "category_intro_description": {
"message": "Intro Animationen, die in der Serie wiederholt werden oder keinen direkten Wert haben. Dies sollte nicht für Musikvideos verwendet werden." "message": "Ein Intervall ohne relevanten Inhalt. Beispiele dafür wären eine Pause, ein statisches Bild oder sich wiederholende Animationen. Dies sollte nicht für Übergänge benutzt werden, die Informationen erhalten oder für Musikvideos."
}, },
"category_intro_short": { "category_intro_short": {
"message": "Intro" "message": "Unterbrechung"
}, },
"category_outro": { "category_outro": {
"message": "Endkarten/Credits" "message": "Endkarten/Credits"
@@ -538,7 +537,7 @@
"message": "Manuelles Überspringen" "message": "Manuelles Überspringen"
}, },
"showOverlay": { "showOverlay": {
"message": "Vor-/Rücklaufleiste anzeigen" "message": "In Zeitleiste anzeigen"
}, },
"colorFormatIncorrect": { "colorFormatIncorrect": {
"message": "Ihre Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einem Zahlenzeichen am Anfang sein." "message": "Ihre Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einem Zahlenzeichen am Anfang sein."
@@ -558,7 +557,7 @@
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)" "description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
}, },
"enableTestingServer": { "enableTestingServer": {
"message": "Beta-Testing Server aktivieren" "message": "Betatest Server aktivieren"
}, },
"whatEnableTestingServer": { "whatEnableTestingServer": {
"message": "Deine Einreichungen und Stimmen werden NICHT für den Hauptserver geltend. Benutze dies nur für Tests." "message": "Deine Einreichungen und Stimmen werden NICHT für den Hauptserver geltend. Benutze dies nur für Tests."
@@ -572,11 +571,17 @@
"moreCategories": { "moreCategories": {
"message": "Weitere Kategorien" "message": "Weitere Kategorien"
}, },
"chooseACategory": {
"message": "Wähle eine Kategorie"
},
"youMustSelectACategory": {
"message": "Sie müssen eine Kategorie für alle Segmente auswählen, die Sie abschicken!"
},
"bracketEnd": { "bracketEnd": {
"message": "(Ende)" "message": "(Ende)"
}, },
"hiddenDueToDownvote": { "hiddenDueToDownvote": {
"message": "versteckt: downvote" "message": "verborgen: negativ bewertet"
}, },
"hiddenDueToDuration": { "hiddenDueToDuration": {
"message": "verborgen: zu kurz" "message": "verborgen: zu kurz"
@@ -585,7 +590,7 @@
"message": "Kanal-ID wurde noch nicht geladen." "message": "Kanal-ID wurde noch nicht geladen."
}, },
"adblockerIssue": { "adblockerIssue": {
"message": "Irgendetwas hält SponsorBlock davon ab, die Videodaten abzurufen. Möglicherweise ist es dein Werbeblocker. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests" "message": "Irgendwas hält SponsorBlock davon ab, die Videodaten abzurufen. Möglicherweise ist das dein Werbeblocker. Mehr Infos: https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
}, },
"itCouldBeAdblockerIssue": { "itCouldBeAdblockerIssue": {
"message": "Falls dies weiterhin geschieht, könnte dies durch Ihren Werbeblocker verursacht werden. Bitte überprüfen Sie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests" "message": "Falls dies weiterhin geschieht, könnte dies durch Ihren Werbeblocker verursacht werden. Bitte überprüfen Sie https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
@@ -625,9 +630,9 @@
"message": "Öffnen Sie die Optionen um Intros, Outros, Merch usw. zu überspringen." "message": "Öffnen Sie die Optionen um Intros, Outros, Merch usw. zu überspringen."
}, },
"unsubmittedWarning": { "unsubmittedWarning": {
"message": "Nicht eingereichte Segment-Benachrichtigung" "message": "Benachrichtigung für nicht eingereichte Segmente"
}, },
"unsubmittedWarningDescription": { "unsubmittedWarningDescription": {
"message": "Senden Sie eine Benachrichtigung, wenn Sie ein Video mit nicht hochgeladenen Segmenten verlassen" "message": "Zeige eine Benachrichtigung an, wenn Sie ein Video mit nicht hochgeladenen Segmenten verlassen"
} }
} }

View File

@@ -4,7 +4,7 @@
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": { "Description": {
"message": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "message": "Skip sponsorships, subscription begging and more on YouTube videos. Report sponsors on videos you watch to save others' time.",
"description": "Description of the extension." "description": "Description of the extension."
}, },
"400": { "400": {
@@ -20,16 +20,16 @@
"message": "Channel Whitelisted!" "message": "Channel Whitelisted!"
}, },
"Sponsor": { "Sponsor": {
"message": "sponsor" "message": "segment"
}, },
"Sponsors": { "Sponsors": {
"message": "sponsors" "message": "segments"
}, },
"Segment": { "Segment": {
"message": "sponsor segment" "message": "segment"
}, },
"Segments": { "Segments": {
"message": "sponsor segments" "message": "segments"
}, },
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Upvote this submission" "message": "Upvote this submission"
@@ -80,16 +80,16 @@
"message": "There was an error submitting your sponsor times, please try again later." "message": "There was an error submitting your sponsor times, please try again later."
}, },
"sponsorFound": { "sponsorFound": {
"message": "This video's sponsors are in the database!" "message": "This video has segments in the database!"
}, },
"sponsor404": { "sponsor404": {
"message": "No sponsors found" "message": "No segments found"
}, },
"sponsorStart": { "sponsorStart": {
"message": "Sponsorship Starts Now" "message": "Segment Starts Now"
}, },
"sponsorEnd": { "sponsorEnd": {
"message": "Sponsorship Ends Now" "message": "Segment Ends Now"
}, },
"noVideoID": { "noVideoID": {
"message": "No YouTube video found at this tab. If you know this is a YouTube tab, close this popup and open it again. If that does not work, try reloading the tab." "message": "No YouTube video found at this tab. If you know this is a YouTube tab, close this popup and open it again. If that does not work, try reloading the tab."
@@ -107,19 +107,19 @@
"message": "A connection error has occured. Error code: " "message": "A connection error has occured. Error code: "
}, },
"wantToSubmit": { "wantToSubmit": {
"message": "Do you want to submit the sponsor times for video id" "message": "Do you want to submit for video id"
}, },
"leftTimes": { "leftTimes": {
"message": "You seem to have left some sponsor times unsubmitted. Go back to that page to submit them (they are not deleted)." "message": "You seem to have left some segments unsubmitted. Go back to that page to submit them (they are not deleted)."
}, },
"clearTimes": { "clearTimes": {
"message": "Clear Sponsor Times" "message": "Clear Segments"
}, },
"openPopup": { "openPopup": {
"message": "Open SponsorBlock Popup" "message": "Open SponsorBlock Popup"
}, },
"SubmitTimes": { "SubmitTimes": {
"message": "Submit Sponsor Times" "message": "Submit Segments"
}, },
"submitCheck": { "submitCheck": {
"message": "Are you sure you want to submit this?" "message": "Are you sure you want to submit this?"
@@ -131,10 +131,7 @@
"message": "Remove Channel From Whitelist" "message": "Remove Channel From Whitelist"
}, },
"voteOnTime": { "voteOnTime": {
"message": "Vote On A Sponsor Time" "message": "Vote On A Segment"
},
"recordTimes": {
"message": "Record the times of a sponsorship"
}, },
"soFarUHSubmited": { "soFarUHSubmited": {
"message": "So far, you've submitted" "message": "So far, you've submitted"
@@ -149,13 +146,10 @@
"message": "here" "message": "here"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Click the button below when the sponsorship starts and ends to record and\nsubmit it to the database." "message": "Click the button below when the segment starts and ends to record and submit it to the database."
}, },
"popupHint": { "popupHint": {
"message": "Hint: Press the semicolon key while focused on a video to report the start/end of a sponsor and quote to submit. (This can be changed in the options)" "message": "Hint: Press the semicolon key while focused on a video to report the start/end of a segment and quote to submit. (This can be changed in the options)"
},
"lastTimes": {
"message": "Latest Sponsor Message Times Chosen"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": "Clear Times" "message": "Clear Times"
@@ -205,20 +199,17 @@
"whatDeleteButton": { "whatDeleteButton": {
"message": "This is the button on the YouTube player that will clear all your un-submitted segments for the current video." "message": "This is the button on the YouTube player that will clear all your un-submitted segments for the current video."
}, },
"disableViewTracking": {
"message": "Disable Sponsor Skip Count Tracking"
},
"enableViewTracking": { "enableViewTracking": {
"message": "Enable Sponsor Skip Count Tracking" "message": "Enable Skip Count Tracking"
}, },
"whatViewTracking": { "whatViewTracking": {
"message": "This feature tracks which sponsors you have skipped to let users know how much their submission has helped others and\nused as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message\nto the server each time you skip a sponsor. Hopefully most people don't change this setting so that the view numbers are accurate. :)" "message": "This feature tracks which segments you have skipped to let users know how much their submission has helped others and used as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message to the server each time you skip a segment. Hopefully most people don't change this setting so that the view numbers are accurate. :)"
}, },
"showNotice": { "showNotice": {
"message": "Show Notice Again" "message": "Show Notice Again"
}, },
"longDescription": { "longDescription": {
"message": "SponsorBlock is an extension that will skip over sponsored segments of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment.", "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." "description": "Full description of the extension on the store pages."
}, },
"website": { "website": {
@@ -238,7 +229,7 @@
"description": "The second line of the message displayed after the notice was upgraded." "description": "The second line of the message displayed after the notice was upgraded."
}, },
"setStartSponsorShortcut": { "setStartSponsorShortcut": {
"message": "Set key for start sponsor keybind" "message": "Set key for start segment keybind"
}, },
"setSubmitKeybind": { "setSubmitKeybind": {
"message": "Set key for submission keybind" "message": "Set key for submission keybind"
@@ -280,14 +271,17 @@
"enableAutoSkip": { "enableAutoSkip": {
"message": "Enable Auto Skip" "message": "Enable Auto Skip"
}, },
"autoSkipDescription": {
"message": "Auto skip will skip sponsors for you. If disabled, a notice will appear asking if you'd like to skip."
},
"audioNotification": { "audioNotification": {
"message": "Audio Notification On Skip" "message": "Audio Notification On Skip"
}, },
"audioNotificationDescription": { "audioNotificationDescription": {
"message": "Audio notification on skip will play a sound whenever a sponsor is skipped. If disabled (or auto skip is disabled), no sound will be played." "message": "Audio notification on skip will play a sound whenever a segment is skipped. If disabled (or auto skip is disabled), no sound will be played."
},
"showTimeWithSkips": {
"message": "Show Time With Skips Removed"
},
"showTimeWithSkipsDescription": {
"message": "This time appears in brackets next to the current time on below the seekbar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seekbar\"."
}, },
"youHaveSkipped": { "youHaveSkipped": {
"message": "You have skipped " "message": "You have skipped "
@@ -313,9 +307,6 @@
"youHaveSavedTimeEnd": { "youHaveSavedTimeEnd": {
"message": " of their lives." "message": " of their lives."
}, },
"guildlinesSummary": {
"message": "- Make sure your segment only contains paid promotion segment, nothing else.\n- Make sure skipping this segment will not skip valuable content\n- If the whole video is a sponsor, please do not report it. A full video reporting system will come out soon.\n- Please do not report disclaimers that could show bias (if a review video is sponsored, don't skip when they mention that)."
},
"statusReminder": { "statusReminder": {
"message": "Check status.sponsor.ajay.app for server status." "message": "Check status.sponsor.ajay.app for server status."
}, },
@@ -338,7 +329,7 @@
"message": "Auto Skip" "message": "Auto Skip"
}, },
"showSkipNotice": { "showSkipNotice": {
"message": "Show Notice After A Sponsor Is Skipped" "message": "Show Notice After A Segment Is Skipped"
}, },
"keybindCurrentlySet": { "keybindCurrentlySet": {
"message": ". It is currently set to:" "message": ". It is currently set to:"
@@ -377,7 +368,7 @@
"message": "Minimum duration (seconds):" "message": "Minimum duration (seconds):"
}, },
"minDurationDescription": { "minDurationDescription": {
"message": "Sponsor segments shorter than the set value will not be skipped or show in the player." "message": "Segments shorter than the set value will not be skipped or show in the player."
}, },
"shortCheck": { "shortCheck": {
"message": "The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?" "message": "The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?"
@@ -407,13 +398,13 @@
"message": "Are you sure you would like to reset this?" "message": "Are you sure you would like to reset this?"
}, },
"confirmPrivacy": { "confirmPrivacy": {
"message": "The video has been detected as unlisted. Click cancel if you do not want to check for sponsors." "message": "The video has been detected as unlisted. Click cancel if you do not want to check for skip segments."
}, },
"unlistedCheck": { "unlistedCheck": {
"message": "Ignore Unlisted/Private Videos" "message": "Ignore Unlisted/Private Videos"
}, },
"whatUnlistedCheck": { "whatUnlistedCheck": {
"message": "This setting will slightly slow down SponsorBlock. Sponsor lookups require sending the video ID to the server. If you are concerned about unlisted video IDs being sent over the internet, enable this option." "message": "This setting will slightly slow down SponsorBlock. Skip segment lookups require sending the video ID to the server. If you are concerned about unlisted video IDs being sent over the internet, enable this option."
}, },
"mobileUpdateInfo": { "mobileUpdateInfo": {
"message": "m.youtube.com is now supported" "message": "m.youtube.com is now supported"
@@ -466,15 +457,12 @@
"theKey": { "theKey": {
"message": "The key" "message": "The key"
}, },
"keyAlreadyUsedByYouTube": {
"message": "is already used by youtube. Please select another key."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "is bound to another action. Please select another key." "message": "is bound to another action. Please select another key."
}, },
"to": { "to": {
"message": "to", "message": "to",
"description": "Used between sponsor times. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
}, },
"category_sponsor": { "category_sponsor": {
"message": "Sponsor" "message": "Sponsor"
@@ -483,19 +471,19 @@
"message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like." "message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like."
}, },
"category_intro": { "category_intro": {
"message": "Intro Animation" "message": "Intermission/Intro Animation"
}, },
"category_intro_description": { "category_intro_description": {
"message": "Intro animations that are recurring in the series or provide no direct value. This should not be used on music videos." "message": "An interval without actual content. Could be a pause, static frame, repeating animation. This should not be used for transitions containing information or be used on music videos."
}, },
"category_intro_short": { "category_intro_short": {
"message": "Intro" "message": "Intermission"
}, },
"category_outro": { "category_outro": {
"message": "Endcards/Credits" "message": "Endcards/Credits"
}, },
"category_outro_description": { "category_outro_description": {
"message": "Credits or when the YouTube endcards appear. Not for spoken conclusions. This should not include useful content. This should not be used on music videos." "message": "Credits or when the YouTube endcards appear. Not for conclusions with information. This should not be used on music videos."
}, },
"category_interaction": { "category_interaction": {
"message": "Interaction Reminder (Subscribe)" "message": "Interaction Reminder (Subscribe)"
@@ -568,6 +556,12 @@
"moreCategories": { "moreCategories": {
"message": "More Categories" "message": "More Categories"
}, },
"chooseACategory": {
"message": "Choose a Category"
},
"youMustSelectACategory": {
"message": "You must select a category for all segments you are submitting!"
},
"bracketEnd": { "bracketEnd": {
"message": "(End)" "message": "(End)"
}, },
@@ -587,13 +581,13 @@
"message": "If this keeps occuring, it could be caused by your ad blocker. Please check https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests" "message": "If this keeps occuring, it could be caused by your ad blocker. Please check https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
}, },
"forceChannelCheck": { "forceChannelCheck": {
"message": "Force Channel Check Before Skipping Sponsors" "message": "Force Channel Check Before Skipping"
}, },
"whatForceChannelCheck": { "whatForceChannelCheck": {
"message": "By default, it will skip sponsors right away before it even knows what the channel is. By default, some zero second sponsors might be skipped on whitelisted channels. Enabling this option will prevent this but making all skipping have a slight delay as getting the channelID can take some time. This delay might be unnoticeable if you have fast internet." "message": "By default, it will skip segments right away before it even knows what the channel is. By default, some segments at the start of the video might be skipped on whitelisted channels. Enabling this option will prevent this but making all skipping have a slight delay as getting the channelID can take some time. This delay might be unnoticeable if you have fast internet."
}, },
"forceChannelCheckPopup": { "forceChannelCheckPopup": {
"message": "Consider Enabling Force Channel Check Before Skipping Sponsors" "message": "Consider Enabling \"Force Channel Check Before Skipping\""
}, },
"downvoteDescription": { "downvoteDescription": {
"message": "Incorrect/Wrong Timing" "message": "Incorrect/Wrong Timing"

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock para YouTube - Omitir Sponsors", "message": "SponsorBlock para YouTube - Omitir Sponsors",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Omitir sponsors en videos de YouTube. Infórmanos de sponsors en videos que ves para ahorrar el tiempo de otros.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Servidor dijo que esta solicitud no es valida" "message": "Servidor dijo que esta solicitud no es valida"
}, },
@@ -221,10 +213,6 @@
"showNotice": { "showNotice": {
"message": "Mostrar aviso de nuevo" "message": "Mostrar aviso de nuevo"
}, },
"longDescription": {
"message": "SponsorBlock es una extensión que se omitira segmentos de sponsor de vídeos de YouTube. SponsorBlock es una extensión de navegador que permite a cualquiera enviar los tiempos de comienzo y fin de segmentos de sponsor de vídeos de YouTube. Una vez que una persona envíe esta información, todos los demás con esta extensión pueden omitir directamente el segmento de sponsor.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Sitio Web", "message": "Sitio Web",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -440,18 +428,12 @@
"theKey": { "theKey": {
"message": "El botón" "message": "El botón"
}, },
"keyAlreadyUsedByYouTube": {
"message": "ya está en uso por youtube. Por favor, seleccione otro botón."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "está enlazado a otra acción. Por favor, seleccione otro botón." "message": "está enlazado a otra acción. Por favor, seleccione otro botón."
}, },
"category_sponsor": { "category_sponsor": {
"message": "Sponsor" "message": "Sponsor"
}, },
"category_intro": {
"message": "Animación de introducción"
},
"category_outro": { "category_outro": {
"message": "Tarjetas/Créditos" "message": "Tarjetas/Créditos"
}, },

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock YouTubelle - Ohita sponsoroinnit", "message": "SponsorBlock YouTubelle - Ohita sponsoroinnit",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Ohita sponsorointi YouTube-videoissa. Ilmoita katsomiesi videoinen sponsoreista säästääksesi muiden aikaa.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Palvelin sanoi tämän pyynnön olevan virheellinen" "message": "Palvelin sanoi tämän pyynnön olevan virheellinen"
}, },
@@ -314,9 +306,6 @@
"theKey": { "theKey": {
"message": "Näppäin" "message": "Näppäin"
}, },
"keyAlreadyUsedByYouTube": {
"message": "on jo YouTuben käytössä. Valitse toinen näppäin."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "on jo liitetty toiseen toimintoon. Valitse toinen näppäin." "message": "on jo liitetty toiseen toimintoon. Valitse toinen näppäin."
}, },
@@ -327,9 +316,6 @@
"category_sponsor": { "category_sponsor": {
"message": "Sponsori" "message": "Sponsori"
}, },
"category_intro": {
"message": "Intro-animaatio"
},
"category_outro": { "category_outro": {
"message": "Loppukortit/-tekstit" "message": "Loppukortit/-tekstit"
}, },

View File

@@ -1,14 +1,10 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock pour YouTube - Supprime les messages commerciaux et publicités intégrées", "message": "SponsorBlock pour YouTube - Supprime les messages commerciaux et publicités intégrées",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": { "Description": {
"message": "Passe automatiquement les messages commerciaux intégrés dans les vidéos YouTube. Soumettez les segments commerciaux dans les vidéos que vous regardez pour aidez les autres.", "message": "Ignorez les sponsors, les rappels d'interaction et plus encore sur les vidéos YouTube. Signalez les sponsors sur les vidéos que vous regardez pour sauver le temps des autres.",
"description": "Description of the extension." "description": "Description of the extension."
}, },
"400": { "400": {
@@ -222,7 +218,7 @@
"message": "Afficher la notification" "message": "Afficher la notification"
}, },
"longDescription": { "longDescription": {
"message": "SponsorBlock est une extension qui permet de passer les messages commerciaux des vidéos YouTube. SponsorBlock est une extension pour navigateur basée sur le crowdsourcing permettant à n'importe qui de soumettre le début et la fin des segments commerciaux sur les vidéos YouTube. s qu'une personne a soumis ces informations, les autres utilisateurs de l'extension en bénéficieront et verront les messages commerciaux automatiquement sautés.", "message": "SponsorBlock vous permet de sauter les sponsors, les intros, les outros, les rappels d'interaction et d'autres parties ennuyeuses des vidéos YouTube. SponsorBlock est une extension de navigateur participative qui permet à quiconque de soumettre les heures 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 disposant de cette extension passeront directement au segment sponsorisé. Vous pouvez également ignorer les sections non musicales des clips music.",
"description": "Full description of the extension on the store pages." "description": "Full description of the extension on the store pages."
}, },
"website": { "website": {
@@ -293,6 +289,12 @@
"audioNotificationDescription": { "audioNotificationDescription": {
"message": "La notification audio lors du passage jouera un son à chaque fois qu'un sponsor est ignoré. Si désactivé (ou si le passage automatique est désactivé), aucun son ne sera joué." "message": "La notification audio lors du passage jouera un son à chaque fois qu'un sponsor est ignoré. Si désactivé (ou si le passage automatique est désactivé), aucun son ne sera joué."
}, },
"showTimeWithSkips": {
"message": "Afficher le temps avec les passages supprimés"
},
"showTimeWithSkipsDescription": {
"message": "Ce temps apparaît entre crochets à côté du temps actuel sous la barre de défilement. Cela indique la durée totale de la vidéo après déduction de tout les segments. Ceci comprend les segments marqués comme étant uniquement à \"Afficher dans la barre de recherche\"."
},
"youHaveSkipped": { "youHaveSkipped": {
"message": "Vous avez passé " "message": "Vous avez passé "
}, },
@@ -470,9 +472,6 @@
"theKey": { "theKey": {
"message": "La clé" "message": "La clé"
}, },
"keyAlreadyUsedByYouTube": {
"message": "est déjà utilisé par YouTube. Veuillez sélectionner une autre clé."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "est lié à une autre action. Veuillez sélectionner une autre clé." "message": "est lié à une autre action. Veuillez sélectionner une autre clé."
}, },
@@ -487,13 +486,13 @@
"message": "Promotion rémunérée, parrainage rémunéré et publicité directe. Pas pour l'autopromotion ou les présentations gratuites de causes, de créateurs, de sites web ou de produits qu'ils aiment." "message": "Promotion rémunérée, parrainage rémunéré et publicité directe. Pas pour l'autopromotion ou les présentations gratuites de causes, de créateurs, de sites web ou de produits qu'ils aiment."
}, },
"category_intro": { "category_intro": {
"message": "Générique d'introduction" "message": "Entracte/Animation d'intro"
}, },
"category_intro_description": { "category_intro_description": {
"message": "Introductions animées qui sont récurrentes ou qui n'ont pas de valeur ajoutée directe dans la série. Ne doit pas être utilisé pour les vidéos musicales." "message": "Un intervalle sans contenu réel. Peut être une pause, une image statique, une animation répétitive. Ceci ne doit pas être utilisé pour les transitions contenant des informations ou être utilisé sur les vidéos musicales."
}, },
"category_intro_short": { "category_intro_short": {
"message": "Introduction" "message": "Entracte"
}, },
"category_outro": { "category_outro": {
"message": "Générique de fin" "message": "Générique de fin"
@@ -528,6 +527,9 @@
"category_livestream_messages": { "category_livestream_messages": {
"message": "Stream : lecture de dons et messages" "message": "Stream : lecture de dons et messages"
}, },
"category_livestream_messages_short": {
"message": "Lecture de messages"
},
"disable": { "disable": {
"message": "Désactiver" "message": "Désactiver"
}, },
@@ -569,6 +571,12 @@
"moreCategories": { "moreCategories": {
"message": "Autres catégories" "message": "Autres catégories"
}, },
"chooseACategory": {
"message": "Choisissez une catégorie"
},
"youMustSelectACategory": {
"message": "Vous devez sélectionner une catégorie pour tous les segments que vous soumettez !"
},
"bracketEnd": { "bracketEnd": {
"message": "(Fin)" "message": "(Fin)"
}, },

View File

@@ -1,8 +1,4 @@
{ {
"Name": {
"message": "સ્પોન્સરબ્લોક",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "યુટ્યુબ માટે સ્પોન્સરબ્લોક - સ્પોન્સરશિપ છોડી દો", "message": "યુટ્યુબ માટે સ્પોન્સરબ્લોક - સ્પોન્સરશિપ છોડી દો",
"description": "Name of the extension." "description": "Name of the extension."

View File

@@ -1,8 +1,4 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"Loading": { "Loading": {
"message": "Betöltés..." "message": "Betöltés..."
}, },

View File

@@ -4,7 +4,7 @@
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": { "Description": {
"message": "Salta i contenuti sponsorizzati nei video di YouTube. Segnala gli annunci incorporati nei video che guardi per far risparmiare tempo agli altri.", "message": "Salta sponsorizzazioni, implorazioni di iscrizione ai canali e molto altro sui video di YouTube. Segnala gli sponsor sui video che guardi per salvare il tempo ad altri.",
"description": "Description of the extension." "description": "Description of the extension."
}, },
"400": { "400": {
@@ -31,9 +31,15 @@
"Segments": { "Segments": {
"message": "spezzoni sponsorizzati" "message": "spezzoni sponsorizzati"
}, },
"upvoteButtonInfo": {
"message": "Vota questa segnalazione"
},
"reportButtonTitle": { "reportButtonTitle": {
"message": "Segnala" "message": "Segnala"
}, },
"reportButtonInfo": {
"message": "Segnala questa segnalazione come incorretta."
},
"Dismiss": { "Dismiss": {
"message": "Chiudi" "message": "Chiudi"
}, },
@@ -61,6 +67,9 @@
"paused": { "paused": {
"message": "In pausa" "message": "In pausa"
}, },
"manualPaused": {
"message": "Timer Fermato"
},
"confirmMSG": { "confirmMSG": {
"message": "\n\nPer modificare o eliminare valori specifici, premi il pulsante delle informazioni o apri il popup cliccando l'icona dell'estensione nell'angolo in alto a destra." "message": "\n\nPer modificare o eliminare valori specifici, premi il pulsante delle informazioni o apri il popup cliccando l'icona dell'estensione nell'angolo in alto a destra."
}, },
@@ -91,6 +100,9 @@
"voted": { "voted": {
"message": "Votato!" "message": "Votato!"
}, },
"serverDown": {
"message": "Sembra che il server non funzioni. Contatta subito lo sviluppatore."
},
"connectionError": { "connectionError": {
"message": "Si è verificato un errore durante la connessione. Codice errore: " "message": "Si è verificato un errore durante la connessione. Codice errore: "
}, },
@@ -206,7 +218,7 @@
"message": "Mostra di Nuovo l'Avviso" "message": "Mostra di Nuovo l'Avviso"
}, },
"longDescription": { "longDescription": {
"message": "SponsorBlock è un'estensione che salta gli spezzoni con contenuti sponsorizzati nei video di YouTube. SponsorBlock è un'estensione crowdsourced per i browser che permette a chiunque di inviare i minutaggi degli spezzoni sponsorizzati nei video di YouTube. Quando una persona avrà inviato questa informazione, tutti gli utenti che utilizzano questa estensione potranno saltare lo spezzone sponsorizzato.", "message": "SponsorBlock è un'estensione che salta gli spezzoni con contenuti sponsorizzati nei video di YouTube. SponsorBlock è un'estensione crowdsourced per i browser che permette a chiunque di inviare i minutaggi degli spezzoni sponsorizzati nei video di YouTube. Quando un utente invia una segnalazione, tutti gli altri utenti che utilizzano questa estensione potranno saltare lo spezzone sponsorizzato.",
"description": "Full description of the extension on the store pages." "description": "Full description of the extension on the store pages."
}, },
"website": { "website": {
@@ -216,5 +228,209 @@
"sourceCode": { "sourceCode": {
"message": "Codice Sorgente", "message": "Codice Sorgente",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "L'avviso è stato aggiornato!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "Se non ti piace ancora, premi il pulsante \"non mostrare mai\".",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setStartSponsorShortcut": {
"message": "Imposta la chiave per l'associazione di tasti per l'inizio dello spezzone dello sponsor"
},
"setSubmitKeybind": {
"message": "Imposta la chiave per l'associazione di tasti per le segnalazioni"
},
"keybindDescription": {
"message": "Seleziona una chiave digitandola"
},
"keybindDescriptionComplete": {
"message": "L'associazione di tasti è stata impostata a: "
},
"0": {
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
},
"disableSkipping": {
"message": "Disabilita SponsorBlock"
},
"enableSkipping": {
"message": "Abilita SponsorBlock"
},
"yourWork": {
"message": "Il Tuo Lavoro",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "Il server sembra essere sovraccaricato. Riprova tra pochi secondi."
},
"errorCode": {
"message": "Codice Errore: "
},
"skip": {
"message": "Salta"
},
"skipped": {
"message": "Saltato"
},
"disableAutoSkip": {
"message": "Disabilita Salto Automatico"
},
"enableAutoSkip": {
"message": "Abilita Salto Automatico"
},
"audioNotification": {
"message": "Notifiche Audio per Salta"
},
"audioNotificationDescription": {
"message": "La notifica audio su salto riprodurrà un suono ogni volta che uno sponsor viene saltato. Se disabilitato (o se il salto automatico è disabilitato), nessun suono verrà riprodotto."
},
"showTimeWithSkips": {
"message": "Mostra Tempo Con Salti Rimossi"
},
"showTimeWithSkipsDescription": {
"message": "Questo tempo appare tra parentesi accanto al tempo attuale sotto alla barra di progresso. Questo mostra la durata totale del video meno gli spezzoni. Include spezzoni marcati come \"Mostra solo nella barra di progresso\"."
},
"youHaveSkipped": {
"message": "Hai saltato "
},
"youHaveSaved": {
"message": "Ti sei salvato "
},
"minLower": {
"message": "minuto"
},
"minsLower": {
"message": "minuti"
},
"hourLower": {
"message": "ora"
},
"hoursLower": {
"message": "ore"
},
"youHaveSavedTime": {
"message": "Hai salvato alle persone"
},
"youHaveSavedTimeEnd": {
"message": " delle loro vite."
},
"statusReminder": {
"message": "Controlla status.sponsor.ajay.app per lo stato del server."
},
"changeUserID": {
"message": "Importa/Esporta Il Tuo ID Utente"
},
"whatChangeUserID": {
"message": "Questo dovrebbe essere tenuto privato. Questo è come una password e non dovrebbe essere condiviso con nessuno. Se qualcuno ha questo, ti può impersonare."
},
"setUserID": {
"message": "Imposta ID utente"
},
"userIDChangeWarning": {
"message": "Attenzione: cambiare l'ID utente è permanente. Sei sicuro di volerlo fare? Assicurati di eseguire il backup del tuo vecchio nel caso."
},
"createdBy": {
"message": "Creato da"
},
"autoSkip": {
"message": "Salta Automaticamente"
},
"showSkipNotice": {
"message": "Mostra Avviso Dopo Aver Saltato Uno Sponsor"
},
"keybindCurrentlySet": {
"message": ". Attualmente è impostato su:"
},
"supportInvidious": {
"message": "Supporta Invidious"
},
"supportInvidiousDescription": {
"message": "Invidious (invidio.us) è un client YouTube di terze parti. Per abilitare il supporto, è necessario accettare i permessi aggiuntivi. Questo NON funziona in incognito su Chrome e altre varianti di Chromium."
},
"optionsInfo": {
"message": "Abilita supporto invidioso, disabilita salto automatico, nascondi i pulsanti e altro ancora."
},
"addInvidiousInstance": {
"message": "Aggiungi istanza di Invidious"
},
"addInvidiousInstanceDescription": {
"message": "Aggiungi un'istanza personalizzata di Invidious. Questo deve essere formattato SOLO con il dominio. Esempio: invidious.ajay.app"
},
"add": {
"message": "Aggiungi"
},
"addInvidiousInstanceError": {
"message": "Questo è un dominio non valido. Questo dovrebbe includere SOLO la parte del dominio. Esempio: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Reimposta la lista di istanze Invidious"
},
"resetInvidiousInstanceAlert": {
"message": "Stai per reimpostare la lista di istanze di Invidious"
},
"currentInstances": {
"message": "Istanze Attuali:"
},
"minDuration": {
"message": "Durata minima (secondi):"
},
"minDurationDescription": {
"message": "I segmenti di sponsor più corti del valore impostato non verranno saltati o mostrati."
},
"whatUploadButton": {
"message": "Questo pulsante appare sul riproduttore di YouTube dopo che hai selezionato un marcatore temporale e sei pronto ad inviarlo."
},
"customServerAddress": {
"message": "Indirizzo Server SponsorBlock"
},
"customServerAddressDescription": {
"message": "L'indirizzo che SponsorBlock usa per effettuare richieste al server. Questo non dovrebbe essere modificato a meno che tu non abbia un tuo server."
},
"save": {
"message": "Salva"
},
"reset": {
"message": "Reimposta"
},
"customAddressError": {
"message": "Questo indirizzo non è nel formatto corretto. Assicurati di avere http:// o https:// all'inizio e nessuno slash alla fine."
},
"areYouSureReset": {
"message": "Sei sicuro di voler eseguire il reset?"
},
"confirmPrivacy": {
"message": "Il video è stato rilevato come privato. Fare clic su Annulla se non si desidera controllare la presenza di sponsor."
},
"unlistedCheck": {
"message": "Ignora Video Non Pubblicati/Privati"
},
"whatUnlistedCheck": {
"message": "Questa impostazione rallenterà leggermente SponsorBlock. Le ricerche degli sponsor richiedono l'invio dell'ID video al server. Se sei preoccupato per gli ID video non elencati inviati via internet, abilita questa opzione."
},
"mobileUpdateInfo": {
"message": "m.youtube.com è ora supportato"
},
"exportOptions": {
"message": "Importa/Esporta Tutte Le Opzioni"
},
"whatExportOptions": {
"message": "Questa è la tua intera configurazione in formaro JSON. Questo include il tuo ID utente, quindi presta attenzione se vuoi condividerlo."
},
"chooseACategory": {
"message": "Scegli una Categoria"
},
"youMustSelectACategory": {
"message": "Devi selezionare una categoria per tutti i segmenti che stai inviando!"
},
"bracketEnd": {
"message": "(Fine)"
},
"hiddenDueToDownvote": {
"message": "nascosto: downvote"
},
"hiddenDueToDuration": {
"message": "nascosto: troppo corto"
} }
} }

View File

@@ -1 +1,6 @@
{} {
"fullName": {
"message": "SponserBlock for YouTube - 動画のスポンサーセクションを自動でスキップする",
"description": "Name of the extension."
}
}

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock voor YouTube - Sla sponsorberichten over", "message": "SponsorBlock voor YouTube - Sla sponsorberichten over",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Sla sponsoring over op YouTube video's. Rapporteer sponsors van video's die je bekijkt om tijd van anderen te besparen.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Server zegt dat het verzoek ongeldig is" "message": "Server zegt dat het verzoek ongeldig is"
}, },

View File

@@ -1,14 +1,10 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock na YouTube - Omiń reklamy sponsorów", "message": "SponsorBlock na YouTube - Omiń reklamy sponsorów",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": { "Description": {
"message": "Przewijaj reklamy sponsorów w filmach na YouTube. Zgłaszaj sponsorzy w filmach żeby oszczędzać czas innych.", "message": "Pomijaj sponsorów, prośby o subskrypcje i inne fragmenty filmów na YouTube. Zgłaszaj segmenty sponsorów na filmach, które oglądasz, by oszczędzić czas innym.",
"description": "Description of the extension." "description": "Description of the extension."
}, },
"400": { "400": {
@@ -27,17 +23,23 @@
"message": "sponsor" "message": "sponsor"
}, },
"Sponsors": { "Sponsors": {
"message": "sponsorzy" "message": "sponsorów"
}, },
"Segment": { "Segment": {
"message": "segment sponsorowany" "message": "segment sponsorowany"
}, },
"Segments": { "Segments": {
"message": "segmenty sponsorowane" "message": "segmentami sponsorowanymi"
},
"upvoteButtonInfo": {
"message": "Oceń pozytywnie to zgłoszenie"
}, },
"reportButtonTitle": { "reportButtonTitle": {
"message": "Zgłoś" "message": "Zgłoś"
}, },
"reportButtonInfo": {
"message": "Zgłoś ten segment jako nieprawidłowy."
},
"Dismiss": { "Dismiss": {
"message": "Odrzuć" "message": "Odrzuć"
}, },
@@ -65,6 +67,9 @@
"paused": { "paused": {
"message": "Zatrzymany" "message": "Zatrzymany"
}, },
"manualPaused": {
"message": "Timer zatrzymany"
},
"confirmMSG": { "confirmMSG": {
"message": "Żeby zmienić lub usunąć wartości, kliknij na guzik informacji lub otwórz okienko rozszerzenia klikając w ikonę rozszerzenia znajdującą się w prawym górnym rogu." "message": "Żeby zmienić lub usunąć wartości, kliknij na guzik informacji lub otwórz okienko rozszerzenia klikając w ikonę rozszerzenia znajdującą się w prawym górnym rogu."
}, },
@@ -72,7 +77,7 @@
"message": "Jesteś pewien, że chcesz to usunąć?\n\n" "message": "Jesteś pewien, że chcesz to usunąć?\n\n"
}, },
"Unknown": { "Unknown": {
"message": "Wystąpił błąd podczas przesyłania twojego zgłoszenia, proszę spróbować ponownie później." "message": "Wystąpił błąd podczas przesyłania twojego segmentu. Proszę spróbować ponownie później."
}, },
"sponsorFound": { "sponsorFound": {
"message": "Segmenty sponsora dla tego nagrania są już w bazie!" "message": "Segmenty sponsora dla tego nagrania są już w bazie!"
@@ -87,7 +92,7 @@
"message": "Sponsor kończy się teraz" "message": "Sponsor kończy się teraz"
}, },
"noVideoID": { "noVideoID": {
"message": "Nie znaleziono nagrania wideo w tej karcie. Jeśli wiesz, że to karta YouTube'a, zamknij to okienko i otwórz je ponownie. Jeśli to nie zadziała spróbuj przeładować stronę." "message": "Nie znaleziono filmu na tej karcie. Jeśli wiesz, że to karta YouTube'a, zamknij to okienko i otwórz je ponownie. Jeśli to nie zadziała, spróbuj odświeżyć stronę."
}, },
"success": { "success": {
"message": "Sukces!" "message": "Sukces!"
@@ -95,6 +100,9 @@
"voted": { "voted": {
"message": "Zagłosowano!" "message": "Zagłosowano!"
}, },
"serverDown": {
"message": "Wygląda na to, że serwer nie działa. Skontaktuj się niezwłocznie z deweloperem."
},
"connectionError": { "connectionError": {
"message": "Błąd z połączeniem. Kod błędu: " "message": "Błąd z połączeniem. Kod błędu: "
}, },
@@ -114,7 +122,7 @@
"message": "Zgłoś segmenty sponsora" "message": "Zgłoś segmenty sponsora"
}, },
"submitCheck": { "submitCheck": {
"message": "Jesteś pewien, że chcesz to zgłosić?" "message": "Czy na pewno chcesz to zamieścić?"
}, },
"whitelistChannel": { "whitelistChannel": {
"message": "Dodaj kanał do wyjątków" "message": "Dodaj kanał do wyjątków"
@@ -129,7 +137,7 @@
"message": "Nagraj czasy segmentów sponsorowanych" "message": "Nagraj czasy segmentów sponsorowanych"
}, },
"soFarUHSubmited": { "soFarUHSubmited": {
"message": "Jak na razie zgłosiłeś:" "message": "Do tej pory zgłosiłeś"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "Ocaliłeś ludzi przed " "message": "Ocaliłeś ludzi przed "
@@ -141,7 +149,7 @@
"message": "tutaj" "message": "tutaj"
}, },
"recordTimesDescription": { "recordTimesDescription": {
"message": "Kliknij guzik poniżej kiedy segment reklamowy się zaczyna i kończy żeby go oznaczyć i wysłać do bazy danych." "message": "Kliknij przycisk poniżej, gdy segment sponsorowany zaczyna się i kończy, by oznaczyć go i przesłać do bazy danych."
}, },
"popupHint": { "popupHint": {
"message": "Podpowiedź: Klikając średnik kiedy zaznaczone jest zgłaszanie wideo możesz oznaczyć początek reklamy, znakiem cytatu oznaczysz jej koniec. (Klawisze można zmienić w opcjach)" "message": "Podpowiedź: Klikając średnik kiedy zaznaczone jest zgłaszanie wideo możesz oznaczyć początek reklamy, znakiem cytatu oznaczysz jej koniec. (Klawisze można zmienić w opcjach)"
@@ -171,31 +179,31 @@
"message": "Opcje" "message": "Opcje"
}, },
"showButtons": { "showButtons": {
"message": "Pokaż guziki w odtwarzaczu YouTube" "message": "Pokaż przyciski na odtwarzaczu YouTube"
}, },
"hideButtons": { "hideButtons": {
"message": "Ukryj guziki w odtwarzaczu YouTube" "message": "Ukryj przyciski na odtwarzaczu YouTube"
}, },
"hideButtonsDescription": { "hideButtonsDescription": {
"message": "Ta opcja ukrywa guziki zgłaszania reklamy w odtwarzaczu. Wiem, że mogą one irytować niektórych. Zamiast zgłaszania bezpośrednio w odtwarzaczu możesz to zrobić w tym okienku. Zawsze możesz zmienić te opcje później." "message": "Ta opcja ukrywa przyciski do zamieszczania segmentów pojawiające się na odtwarzaczu YouTube."
}, },
"showInfoButton": { "showInfoButton": {
"message": "Pokaż guzik informacyjny w odtwarzaczu YouTube" "message": "Pokaż przycisk informacyjny na odtwarzaczu YouTube"
}, },
"hideInfoButton": { "hideInfoButton": {
"message": "Ukryj guzik informacyjny w odtwarzaczu YouTube" "message": "Ukryj przycisk informacyjny na odtwarzaczu YouTube"
}, },
"whatInfoButton": { "whatInfoButton": {
"message": "Jest to guzik otwierający popup na stronie YouTube." "message": "Jest to przycisk otwierający okienko pop-up na stronie YouTube."
}, },
"hideDeleteButton": { "hideDeleteButton": {
"message": "Ukryj guzik usuwania w odtwarzaczu YouTube" "message": "Ukryj przycisk usuwania na odtwarzaczu YouTube"
}, },
"showDeleteButton": { "showDeleteButton": {
"message": "Pokaż guzik usuwania w odtwarzaczu YouTube" "message": "Pokaż przycisk usuwania na odtwarzaczu YouTube"
}, },
"whatDeleteButton": { "whatDeleteButton": {
"message": "Ten guzik pozwala ci wyczyścić wszystkie segmenty reklamowe w odtwarzaczu YouTube." "message": "Ten przycisk na odtwarzaczu YouTube wyczyści wszystkie twoje niewysłane segmenty dla bieżącego filmu."
}, },
"disableViewTracking": { "disableViewTracking": {
"message": "Wyłącz licznik przewinięć" "message": "Wyłącz licznik przewinięć"
@@ -204,15 +212,11 @@
"message": "Włącz licznik przewinięć" "message": "Włącz licznik przewinięć"
}, },
"whatViewTracking": { "whatViewTracking": {
"message": "Ta opcja śledzi które segmenty pominąłeś i informuje zgłaszających ile czasu Ci zaoszczędzili, też wraz systemem głosowania pomaga wykrywać spam w zgłoszeniach. Rozszerzenie wysyła zapytanie do serwera za każdym razem kiedy przewinąłeś segment reklamowy. Miejmy nadzieję, że większość ludzi tego nie wyłączy i licznik wyświetleń będzie rzetelny. :)" "message": "Ta opcja monitoruje pominięte przez Ciebie segmenty i informuje zgłaszających, ile czasu Ci zaoszczędzili. Wraz z systemem głosowania pomaga też wykrywać spam w zgłoszeniach. Rozszerzenie wysyła zapytanie do serwera za każdym razem, kiedy pomijasz segment reklamowy. Miejmy nadzieję, że większość użytkowników tego nie wyłączy i licznik wyświetleń będzie rzetelny. :)"
}, },
"showNotice": { "showNotice": {
"message": "Pokaż informacje ponownie" "message": "Pokaż informacje ponownie"
}, },
"longDescription": {
"message": "SponsorBlock jest rozszerzeniem które przewinie segmenty sponsorów w filmach na YouTube. SponsorBlock jest opartym na crowdsourcing rozszerzeniem które pozwala każdemu zgłaszać początek i koniec segmentu reklamowego w filmach na YouTube. Kiedy ktoś zgłosi taki fragment zostanie on pominięty przez innych użytkowników rozszerzenia.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Strona", "message": "Strona",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -263,6 +267,9 @@
"skip": { "skip": {
"message": "Przewiń" "message": "Przewiń"
}, },
"skipped": {
"message": "Pominięto"
},
"disableAutoSkip": { "disableAutoSkip": {
"message": "Wyłącz auto przewijanie" "message": "Wyłącz auto przewijanie"
}, },
@@ -272,6 +279,15 @@
"autoSkipDescription": { "autoSkipDescription": {
"message": "Auto przewijanie przewinie segment za ciebie, wyłączone wyświetli komunikat z pytaniem czy chcesz przewinąć reklamę." "message": "Auto przewijanie przewinie segment za ciebie, wyłączone wyświetli komunikat z pytaniem czy chcesz przewinąć reklamę."
}, },
"audioNotification": {
"message": "Powiadomienie dźwiękowe o przewinięciu"
},
"audioNotificationDescription": {
"message": "Powiadomienie dźwiękowe po pominięciu będzie odtwarzane za każdym razem, gdy sponsor zostanie pominięty. Jeśli wyłączone (lub automatyczne pomijanie jest wyłączone), dźwięk nie zostanie odtworzony."
},
"showTimeWithSkips": {
"message": "Pokaż czas po usunięciu segmentów"
},
"youHaveSkipped": { "youHaveSkipped": {
"message": "Przewinąłeś " "message": "Przewinąłeś "
}, },
@@ -300,19 +316,19 @@
"message": "- Upewnij się, że zgłaszany fragment zawiera tylko reklamę i nic więcej.\n- Upewnij się, że nie zostanie przewinięta wartościowa treść\n- Jeśli całe nagranie to reklama, proszę nie zgłaszaj go. Blokowanie całych nagrań pojawi się wkrótce.\n- Nie ukrywaj treści które są istotne dla użytkownika (nie ukrywaj informacji, że recenzja produktu została opłacona przez producenta)" "message": "- Upewnij się, że zgłaszany fragment zawiera tylko reklamę i nic więcej.\n- Upewnij się, że nie zostanie przewinięta wartościowa treść\n- Jeśli całe nagranie to reklama, proszę nie zgłaszaj go. Blokowanie całych nagrań pojawi się wkrótce.\n- Nie ukrywaj treści które są istotne dla użytkownika (nie ukrywaj informacji, że recenzja produktu została opłacona przez producenta)"
}, },
"statusReminder": { "statusReminder": {
"message": "Wejdź na status.sponsor.ajay.app żeby sprawdzić czy serwer działa." "message": "Sprawdź status serwera na status.sponsor.ajay.app"
}, },
"changeUserID": { "changeUserID": {
"message": "Zaimportuj/Wyeksportuj swój UserID" "message": "Importuj/Eksportuj swój identyfikator użytkownika"
}, },
"whatChangeUserID": { "whatChangeUserID": {
"message": "Ta informacja jest poufna i działa jak hasło, użytkownik który ma do niej dostęp może zgłaszać treści jako ty." "message": "Ta informacja jest poufna i działa jak hasło. Użytkownik, który ma do niej dostęp, może zgłaszać treści jako ty."
}, },
"setUserID": { "setUserID": {
"message": "Ustaw UserID" "message": "Ustaw identyfikator użytkownika"
}, },
"userIDChangeWarning": { "userIDChangeWarning": {
"message": "Ostrzeżenie: Zmiana UserID jest nieodwracalna. Jesteś pewien, że chcesz to zrobić? Skopiuj obecny UserID na wszelki wypadek." "message": "Uwaga: Zmiana identyfikatora użytkownika jest nieodwracalna. Czy na pewno chcesz to zrobić? Na wszelki wypadek skopiuj swój poprzedni."
}, },
"createdBy": { "createdBy": {
"message": "Stworzony przez" "message": "Stworzony przez"
@@ -327,13 +343,13 @@
"message": ". Jest obecnie ustawione jako:" "message": ". Jest obecnie ustawione jako:"
}, },
"supportInvidious": { "supportInvidious": {
"message": "Wesprzyj Invidious" "message": "Wsparcie dla Invidious"
}, },
"supportInvidiousDescription": { "supportInvidiousDescription": {
"message": "Invidious (invidio.us) to nieoficjalny klient YouTube'a. Aby włączyć dla niego wsparcie musisz przyznać dodatkowe uprawnienia. W Chrome'ie i innych przeglądarkach bazujących na Chromium, ta opcja nie działa w trybie incognito." "message": "Invidious (invidio.us) to nieoficjalny klient YouTube'a. Aby włączyć dla niego wsparcie musisz przyznać dodatkowe uprawnienia. W Chrome'ie i innych przeglądarkach bazujących na Chromium, ta opcja nie działa w trybie incognito."
}, },
"optionsInfo": { "optionsInfo": {
"message": "Wesprzyj Invidious, wyłącz auto przewijanie, ukryj guziki i więcej." "message": "Włącz wsparcie dla Invidious, wyłącz auto przewijanie, ukryj przyciski i więcej."
}, },
"addInvidiousInstance": { "addInvidiousInstance": {
"message": "Dodaj instancje Invidious" "message": "Dodaj instancje Invidious"
@@ -359,13 +375,209 @@
"minDuration": { "minDuration": {
"message": "Minimalny czas trwania (sekundy):" "message": "Minimalny czas trwania (sekundy):"
}, },
"minDurationDescription": {
"message": "Segmenty sponsorowane krótsze niż ustawiona wartość nie będą pomijane ani pokazywane w odtwarzaczu."
},
"showUploadButton": {
"message": "Pokaż przycisk wysyłania"
},
"whatUploadButton": {
"message": "Ten przycisk pojawia się na odtwarzaczu YouTube po wybraniu przedziału czasowego, gdy segment jest gotowy do wysłania."
},
"customServerAddress": {
"message": "Adres serwera SponsorBlock"
},
"customServerAddressDescription": {
"message": "Adres SponsorBlock używa do wykonywania połączeń do serwera.\nDo póki nie posiadasz własnego serwera, to nie powinno być zmieniane."
},
"save": {
"message": "Zapisz"
},
"reset": {
"message": "Reset"
},
"customAddressError": {
"message": "Ten adres nie jest w prawidłowej formie. Upewnij się, że http:// lub https:// znajduje się na początku i nie ma końcowych ukośników."
},
"areYouSureReset": {
"message": "Czy na pewno chcesz to zresetować?"
},
"unlistedCheck": {
"message": "Ignoruj nielistowane/prywatne filmy"
},
"mobileUpdateInfo": { "mobileUpdateInfo": {
"message": "m.youtube.com jest teraz wspierany" "message": "m.youtube.com jest teraz wspierany"
}, },
"exportOptions": { "exportOptions": {
"message": "Importuj/Eksportuj wszystkie ustawienia" "message": "Importuj/Eksportuj wszystkie ustawienia"
}, },
"whatExportOptions": {
"message": "Oto cała twoja konfiguracja w formacie JSON. Zawarty jest w niej twój identyfikator użytkownika, więc uważaj, komu ją udostępniasz."
},
"setOptions": {
"message": "Zapisz ustawienia"
},
"incorrectlyFormattedOptions": {
"message": "Ten JSON nie został poprawnie sformatowany. Twoje opcje nie zostały zmienione."
},
"confirmNoticeTitle": {
"message": "Zgłoś segment"
},
"submit": {
"message": "Wyślij"
},
"cancel": {
"message": "Anuluj"
},
"delete": {
"message": "Usuń"
},
"preview": {
"message": "Podgląd"
},
"edit": {
"message": "Edytuj"
},
"copyDebugInformation": {
"message": "Skopiuj informacje debugowania do schowka"
},
"copyDebugInformationFailed": {
"message": "Nie udało się skopiować do schowka"
},
"copyDebugInformationComplete": { "copyDebugInformationComplete": {
"message": "Informacje do debugowania zostały skopiowane do schowka. Możesz usunąć dane, których nie chcesz udostępniać. Zapisz je w pliku tekstowym albo wklej do raportu podczas zgłaszania błędu." "message": "Informacje do debugowania zostały skopiowane do schowka. Możesz usunąć dane, których nie chcesz udostępniać. Zapisz je w pliku tekstowym albo wklej do raportu podczas zgłaszania błędu."
},
"theKey": {
"message": "Klucz"
},
"to": {
"message": "do",
"description": "Used between sponsor times. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_intro": {
"message": "Przerwa/Animowane intro"
},
"category_intro_short": {
"message": "Przerwa"
},
"category_outro": {
"message": "Ekran końcowy/Napisy"
},
"category_interaction": {
"message": "Przypomnienie o interakcji (Subskrybuj)"
},
"category_interaction_short": {
"message": "Przypomnienie o interakcji"
},
"category_selfpromo": {
"message": "Nieopłacona/Własna promocja"
},
"category_music_offtopic": {
"message": "Muzyka: Sekcja niemuzyczna"
},
"category_music_offtopic_short": {
"message": "Bez muzyki"
},
"category_livestream_messages": {
"message": "Transmisja live: Dotacja/Czytanie wiadomości"
},
"category_livestream_messages_short": {
"message": "Czytanie wiadomości"
},
"disable": {
"message": "Wyłączone"
},
"manualSkip": {
"message": "Ręczne pomijanie"
},
"showOverlay": {
"message": "Pokaż na pasku"
},
"colorFormatIncorrect": {
"message": "Nieprawidłowy format koloru. Powinien to być zapis szesnastkowy (heksadecymalny) składający się z 3 lub 6 znaków poprzedzonych kratką (#)."
},
"previewColor": {
"message": "Kolor podglądu",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Kolor paska postępu"
},
"category": {
"message": "Kategoria"
},
"skipOption": {
"message": "Tryb pomijania",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "Aktywuj serwer beta-testów"
},
"bracketNow": {
"message": "(Teraz)"
},
"moreCategories": {
"message": "Więcej kategorii"
},
"chooseACategory": {
"message": "Wybierz kategorię"
},
"youMustSelectACategory": {
"message": "Musisz wybrać kategorię dla każdego segmentu, który zamieszczasz!"
},
"bracketEnd": {
"message": "(Koniec)"
},
"hiddenDueToDownvote": {
"message": "ukryty: zminusowany"
},
"hiddenDueToDuration": {
"message": "ukryty: zbyt krótki"
},
"channelDataNotFound": {
"message": "ID kanału nie zostało póki co załadowane."
},
"adblockerIssue": {
"message": "Wygląda na to, że coś blokuje możliwość pobierania danych o filmach przez SponsorBlock. To prawdopodobnie Twój ad blocker. Sprawdź proszę https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
},
"itCouldBeAdblockerIssue": {
"message": "Jeśli ten problem się powtarza, możliwą przyczyną jest Twój ad blocker. Sprawdź proszę https://github.com/ajayyy/SponsorBlock/wiki/Fix-Ad-Blocker-Blocking-SponsorBlock's-Requests"
},
"forceChannelCheck": {
"message": "Wymuś sprawdzenie kanału przed pominięciem sponsorów"
},
"whatForceChannelCheck": {
"message": "Domyślnie, rozszerzenie pominie sponsorów od razu, jeszcze zanim dowie się jaki to kanał. Pewne segmenty nie trwające nawet sekundy domyślnie mogą zostać pominięte na kanałach dodanych do wyjątków. Włączenie tej opcji temu zapobiegnie, ale wszystkie pominięcia będą nieco opóźnione, gdyż uzyskanie ID kanału może chwilę potrwać. Opóźnienie to może być nieodczuwalne, jeśli masz szybki internet."
},
"downvoteDescription": {
"message": "Nieprawidłowy przedział czasowy"
},
"incorrectCategory": {
"message": "Zła kategoria"
},
"multipleSegments": {
"message": "Wiele segmentów"
},
"guidelines": {
"message": "Wytyczne"
},
"readTheGuidelines": {
"message": "Przeczytaj wytyczne!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "Kategorie są tutaj!"
},
"categoryUpdate2": {
"message": "Otwórz opcje, aby pominąć intra, outra, merch, itp."
},
"unsubmittedWarning": {
"message": "Powiadomienie o nieprzesłanych segmentach"
},
"unsubmittedWarningDescription": {
"message": "Wyślij powiadomienie po opuszczeniu filmu z segmentami, które nie zostały przesłane"
} }
} }

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock para YouTube - Pule patrocínios", "message": "SponsorBlock para YouTube - Pule patrocínios",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Pule patrocinadores em vídeos do YouTube. Reporte patrocinadores em videos que você assiste para salvar o tempo dos outros.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "O servidor disse que esse pedido foi inválido" "message": "O servidor disse que esse pedido foi inválido"
}, },
@@ -35,9 +27,15 @@
"Segments": { "Segments": {
"message": "segmentos de patrocinadores" "message": "segmentos de patrocinadores"
}, },
"upvoteButtonInfo": {
"message": "Votar nesse segmento positivamente"
},
"reportButtonTitle": { "reportButtonTitle": {
"message": "Reportar" "message": "Reportar"
}, },
"reportButtonInfo": {
"message": "Reportar esse segmento como inválido."
},
"Dismiss": { "Dismiss": {
"message": "Ignorar" "message": "Ignorar"
}, },
@@ -54,7 +52,7 @@
"message": "Nunca mostrar" "message": "Nunca mostrar"
}, },
"hitGoBack": { "hitGoBack": {
"message": "Aperta reverter pulo para voltar onde estava" "message": "Aperta \"reverter pulo\" para voltar onde estava."
}, },
"unskip": { "unskip": {
"message": "Reverter pulo" "message": "Reverter pulo"
@@ -65,6 +63,9 @@
"paused": { "paused": {
"message": "Pausado" "message": "Pausado"
}, },
"manualPaused": {
"message": "Tempo parado"
},
"confirmMSG": { "confirmMSG": {
"message": "\n\nPara editar ou remover linhas individuais, clique com o botão direito ou abra o popup da extensão pelo icone no canto superior direito." "message": "\n\nPara editar ou remover linhas individuais, clique com o botão direito ou abra o popup da extensão pelo icone no canto superior direito."
}, },
@@ -95,6 +96,9 @@
"voted": { "voted": {
"message": "Votado!" "message": "Votado!"
}, },
"serverDown": {
"message": "Parece que o servidor caiu. Contate o desenvolvedor o quanto antes."
},
"connectionError": { "connectionError": {
"message": "Ocorreu um erro de conexão. Código de erro: " "message": "Ocorreu um erro de conexão. Código de erro: "
}, },
@@ -209,10 +213,6 @@
"showNotice": { "showNotice": {
"message": "Mostrar notificação outra vez" "message": "Mostrar notificação outra vez"
}, },
"longDescription": {
"message": "SponsorBlock é uma extensão que salta segmentos patrocinados em vídeos do YouTube. SponsorBlock é uma extenção crowdfunded que permite a qualquer um submeter o início e o fim de segmentos patrocinados. Assim que uma pessoa submete essa informação todos com a extenção poderam saltar automaticamete o patrocínio.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Site", "message": "Site",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -263,6 +263,9 @@
"skip": { "skip": {
"message": "Pular" "message": "Pular"
}, },
"skipped": {
"message": "Pulado"
},
"disableAutoSkip": { "disableAutoSkip": {
"message": "Desativar Salto Automático" "message": "Desativar Salto Automático"
}, },
@@ -278,6 +281,9 @@
"audioNotificationDescription": { "audioNotificationDescription": {
"message": "A notificação de áudio ao pular irá tocar um som sempre que um patrocínio for ignorado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido." "message": "A notificação de áudio ao pular irá tocar um som sempre que um patrocínio for ignorado. Se desativado (ou o pulo automático estiver desativado), nenhum som será reproduzido."
}, },
"showTimeWithSkips": {
"message": "Mostrar tempo com pulos removidos"
},
"youHaveSkipped": { "youHaveSkipped": {
"message": "Você pulou " "message": "Você pulou "
}, },
@@ -455,9 +461,6 @@
"theKey": { "theKey": {
"message": "A tecla" "message": "A tecla"
}, },
"keyAlreadyUsedByYouTube": {
"message": "já está sendo usado pelo youtube. Por favor, selecione outra tecla."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "está vinculado a outra ação. Por favor, selecione outra tecla." "message": "está vinculado a outra ação. Por favor, selecione outra tecla."
}, },
@@ -468,21 +471,24 @@
"category_sponsor": { "category_sponsor": {
"message": "Patrocinador" "message": "Patrocinador"
}, },
"category_intro": {
"message": "Animação de Introdução"
},
"category_outro": { "category_outro": {
"message": "Finalização/Créditos" "message": "Finalização/Créditos"
}, },
"category_interaction": { "category_interaction": {
"message": "Lembrete de interação (inscrever-se)" "message": "Lembrete de interação (inscrever-se)"
}, },
"category_interaction_short": {
"message": "Lembrete de interação"
},
"category_music_offtopic": { "category_music_offtopic": {
"message": "Música: Seção sem música" "message": "Música: Seção sem música"
}, },
"category_livestream_messages": { "category_livestream_messages": {
"message": "Livestream: Leituras de Doação/Mensagem" "message": "Livestream: Leituras de Doação/Mensagem"
}, },
"category_livestream_messages_short": {
"message": "Leitura de mensagens"
},
"disable": { "disable": {
"message": "Desativar" "message": "Desativar"
}, },
@@ -492,6 +498,20 @@
"showOverlay": { "showOverlay": {
"message": "Mostrar barra de progresso" "message": "Mostrar barra de progresso"
}, },
"previewColor": {
"message": "Cor de pré-visualização",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Cor da barra"
},
"category": {
"message": "Categoria"
},
"skipOption": {
"message": "Opção de pulo",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": { "enableTestingServer": {
"message": "Habilitar Servidor em teste Beta" "message": "Habilitar Servidor em teste Beta"
}, },
@@ -507,6 +527,12 @@
"moreCategories": { "moreCategories": {
"message": "Mais categorias" "message": "Mais categorias"
}, },
"chooseACategory": {
"message": "Selecione uma Categoria"
},
"youMustSelectACategory": {
"message": "Você deve selecionar uma categoria para todos os segmentos que você está enviando!"
},
"bracketEnd": { "bracketEnd": {
"message": "(Fim)" "message": "(Fim)"
}, },
@@ -534,10 +560,32 @@
"forceChannelCheckPopup": { "forceChannelCheckPopup": {
"message": "Considere habilitar a verificação de canal forçada antes de pular os patrocinadores" "message": "Considere habilitar a verificação de canal forçada antes de pular os patrocinadores"
}, },
"downvoteDescription": {
"message": "Incorreto/tempo errado"
},
"incorrectCategory": { "incorrectCategory": {
"message": "Categoria errada" "message": "Categoria errada"
}, },
"nonMusicCategoryOnMusic": { "nonMusicCategoryOnMusic": {
"message": "Este vídeo é classificado como música. Você tem certeza que deseja enviar segmentos com categorias que não são músicas? A menos que esse vídeo não seja de fato música, você não deve enviar esse segmento. Por favor leia as orientações se estiver em dúvidas." "message": "Este vídeo é classificado como música. Você tem certeza que deseja enviar segmentos com categorias que não são músicas? A menos que esse vídeo não seja de fato música, você não deve enviar esse segmento. Por favor leia as orientações se estiver em dúvidas."
},
"multipleSegments": {
"message": "Multiplos segmentos"
},
"guidelines": {
"message": "Diretrizes"
},
"readTheGuidelines": {
"message": "Leia as Diretrizes!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "As categorias estão aqui!"
},
"unsubmittedWarning": {
"message": "Notificação de segmentos não enviados"
},
"unsubmittedWarningDescription": {
"message": "Enviar uma notificação quando você sair de um vídeo com segmentos que não foram enviados"
} }
} }

View File

@@ -3,10 +3,6 @@
"message": "SponsorBlock para o YouTube - Salte patrocínios", "message": "SponsorBlock para o YouTube - Salte patrocínios",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Salte patrocinadores em vídeos do YouTube. Reporte patrocinadores em vídeos que assista para poupar tempo a outros.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "O servidor disse que este pedido foi inválido" "message": "O servidor disse que este pedido foi inválido"
}, },
@@ -205,10 +201,6 @@
"showNotice": { "showNotice": {
"message": "Mostrar notificação outra vez" "message": "Mostrar notificação outra vez"
}, },
"longDescription": {
"message": "SponsorBlock é uma extensão que salta segmentos patrocinados em vídeos do YouTube. SponsorBlock é uma extenção crowdfunded que permite a qualquer um submeter o início e o fim de segmentos patrocinados. Assim que uma pessoa submete essa informação todos com a extenção poderam saltar automaticamete o patrocínio.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Site", "message": "Site",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock pentru YouTube - Sari peste sponsorizări", "message": "SponsorBlock pentru YouTube - Sari peste sponsorizări",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Sari peste sponsorizările din videoclipurile de pe YouTube. Adaugă sponsorizări din videoclipurile pe care le urmăriți pentru a salva timpul altora.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Serverul a spus că această cerere este invalidă" "message": "Serverul a spus că această cerere este invalidă"
}, },
@@ -221,10 +213,6 @@
"showNotice": { "showNotice": {
"message": "Arată Notificarea Din Nou" "message": "Arată Notificarea Din Nou"
}, },
"longDescription": {
"message": "SponsorBlock este o extensie care va sări peste segmentele sponsorizate din videoclipurile de pe YouTube. SponsorBlock este o extensie crowdsourced care lasă pe oricine să trimită începutul și finalul segmentelor sponsorizate din videoclipurile de pe YouTube. Odată ce o persoană trimite aceste informații, toată lumea cu această extensie va sări peste acel segment sponsorizat.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Website", "message": "Website",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -293,6 +281,12 @@
"audioNotificationDescription": { "audioNotificationDescription": {
"message": "Notificarea audio va reda un sunet atunci când sari peste un segement sponsorizat. Daca este dezactivat (sau autoskip este dezactivat), niciun sunet nu va fi redat." "message": "Notificarea audio va reda un sunet atunci când sari peste un segement sponsorizat. Daca este dezactivat (sau autoskip este dezactivat), niciun sunet nu va fi redat."
}, },
"showTimeWithSkips": {
"message": "Arată timpul cu săriturile eliminate"
},
"showTimeWithSkipsDescription": {
"message": "Acest timp apare în paranteze lângă ora curentă sub bara de progres. Aceasta arată durata totală a videoclipului minus orice segment. Aceasta include segmente marcate doar ca \"Afișare în Seekbar\"."
},
"youHaveSkipped": { "youHaveSkipped": {
"message": "Ai sărit peste " "message": "Ai sărit peste "
}, },
@@ -470,9 +464,6 @@
"theKey": { "theKey": {
"message": "Tasta" "message": "Tasta"
}, },
"keyAlreadyUsedByYouTube": {
"message": "este deja utilizat de YouTube. Vă rugăm selectați o altă tastă."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "este deja setată la o altă acțiune. Vă rugăm să selectați o altă tastă." "message": "este deja setată la o altă acțiune. Vă rugăm să selectați o altă tastă."
}, },
@@ -487,13 +478,13 @@
"message": "Promovare plătită, refferali plătiți și reclame directe. Nu pentru autopromovări sau promovări gratis ale cauzelor/creatorilor/website-urilor/produselor." "message": "Promovare plătită, refferali plătiți și reclame directe. Nu pentru autopromovări sau promovări gratis ale cauzelor/creatorilor/website-urilor/produselor."
}, },
"category_intro": { "category_intro": {
"message": "Animație de Început" "message": "Pauză/Animație Intro"
}, },
"category_intro_description": { "category_intro_description": {
"message": "Animațiile de introducere care se repetă în serie sau care nu oferă nici o valoare directă. Această opțiune nu ar trebui folosită în videoclipurile muzicale." "message": "Un interval fără conținut real. Poate fi o pauză, un cadru static, o animație care se repetă. Acestea nu ar trebui utilizate pentru tranziții care conțin informații sau nu ar trebui utilizate pe videoclipuri muzicale."
}, },
"category_intro_short": { "category_intro_short": {
"message": "Intro" "message": "Pauză"
}, },
"category_outro": { "category_outro": {
"message": "Ecran De Final/Credite" "message": "Ecran De Final/Credite"
@@ -572,6 +563,12 @@
"moreCategories": { "moreCategories": {
"message": "Mai multe categorii" "message": "Mai multe categorii"
}, },
"chooseACategory": {
"message": "Alege o categorie"
},
"youMustSelectACategory": {
"message": "Trebuie să selectaţi o categorie pentru toate segmentele pe care le trimiteţi!"
},
"bracketEnd": { "bracketEnd": {
"message": "(Sfârșit)" "message": "(Sfârșit)"
}, },

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock для YouTube - Пропускайте спонсорские вставки", "message": "SponsorBlock для YouTube - Пропускайте спонсорские вставки",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Пропускайте спонсорские вставки в видео на YouTube. Сообщайте о спонсорских вставках в видео, которые Вы смотрите, чтобы сэкономить время других пользователей.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Сервер отклонил этот запрос." "message": "Сервер отклонил этот запрос."
}, },
@@ -65,6 +57,9 @@
"paused": { "paused": {
"message": "Пауза" "message": "Пауза"
}, },
"manualPaused": {
"message": "Таймер остановлен"
},
"confirmMSG": { "confirmMSG": {
"message": "\n\nЧтобы изменить или удалить отдельные значения, нажмите кнопку «Информация» или откройте всплывающее окно расширения, щелкнув значок расширения в правом верхнем углу." "message": "\n\nЧтобы изменить или удалить отдельные значения, нажмите кнопку «Информация» или откройте всплывающее окно расширения, щелкнув значок расширения в правом верхнем углу."
}, },
@@ -107,6 +102,9 @@
"clearTimes": { "clearTimes": {
"message": "Удалить отмеченные сегменты" "message": "Удалить отмеченные сегменты"
}, },
"openPopup": {
"message": "Открыть всплывающее окно SponsorBlock"
},
"SubmitTimes": { "SubmitTimes": {
"message": "Отправить отмеченные сегменты" "message": "Отправить отмеченные сегменты"
}, },
@@ -206,10 +204,6 @@
"showNotice": { "showNotice": {
"message": "Показывать уведомление снова" "message": "Показывать уведомление снова"
}, },
"longDescription": {
"message": "SponsorBlock — это расширение, которое пропускает спонсорские вставки в видео на YouTube. SponsorBlock — это краудсорсинговое расширение, которое позволяет каждому отправить время начала и конца спонсорских сегментов в видео на YouTube. После того, как кто-нибудь отправляет эту информацию, все остальные пользователи расширения будут автоматически пропускать спонсорские сегменты.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Сайт", "message": "Сайт",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -413,6 +407,24 @@
"whatExportOptions": { "whatExportOptions": {
"message": "Это вся конфигурация в формате JSON. Этот файл содержит Ваш идентификатор пользователя, поэтому не забудьте общаться с этим разумно." "message": "Это вся конфигурация в формате JSON. Этот файл содержит Ваш идентификатор пользователя, поэтому не забудьте общаться с этим разумно."
}, },
"submit": {
"message": "Отправить"
},
"cancel": {
"message": "Отменить"
},
"delete": {
"message": "Удалить"
},
"preview": {
"message": "Превью"
},
"edit": {
"message": "Редактировать"
},
"copyDebugInformation": {
"message": "Скопировать отладочную информацию в буфер обмена"
},
"bracketNow": { "bracketNow": {
"message": "(Сейчас)" "message": "(Сейчас)"
}, },

View File

@@ -1,8 +1,4 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"Sponsor": { "Sponsor": {
"message": "sponzor" "message": "sponzor"
}, },

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock för YouTube - Hoppa över sponsring", "message": "SponsorBlock för YouTube - Hoppa över sponsring",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Hoppa över sponsormeddelanden på YouTube-videor. Rapportera sponsring på videor du ser på för att spara tid för andra.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Felaktigt anrop enligt servern" "message": "Felaktigt anrop enligt servern"
}, },
@@ -18,7 +10,7 @@
"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?" "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?"
}, },
"409": { "409": {
"message": "Den här har redan blivit rapporterad." "message": "Den här har redan blivit rapporterad"
}, },
"channelWhitelisted": { "channelWhitelisted": {
"message": "Kanal vitlistad!" "message": "Kanal vitlistad!"
@@ -54,7 +46,7 @@
"message": "Sekunder" "message": "Sekunder"
}, },
"Hide": { "Hide": {
"message": "\"Visa aldrig\"-knappen. " "message": "Visa Aldrig"
}, },
"hitGoBack": { "hitGoBack": {
"message": "Tryck på Tillbaka för att ångra åtgärden." "message": "Tryck på Tillbaka för att ångra åtgärden."
@@ -63,7 +55,7 @@
"message": "Tillbaka" "message": "Tillbaka"
}, },
"reskip": { "reskip": {
"message": "Frammåt" "message": "Framåt"
}, },
"paused": { "paused": {
"message": "Pausad" "message": "Pausad"
@@ -218,10 +210,6 @@
"showNotice": { "showNotice": {
"message": "Visa Notisen Igen" "message": "Visa Notisen Igen"
}, },
"longDescription": {
"message": "SponsorBlock är ett webbläsartillägg som hoppar över sponsormeddelanden på YouTube-videor. SponsorBlock är ett crowdsourcat webbläsartillägg som låter vem som hellst att rapportera start och sluttider för sponsorsegment på YouTube-videor. När informationen väl har rapporterats kommer alla andra med detta tillägg att hoppa över sponsorsegmentet.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Hemsida", "message": "Hemsida",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -467,9 +455,6 @@
"theKey": { "theKey": {
"message": "Nyckeln" "message": "Nyckeln"
}, },
"keyAlreadyUsedByYouTube": {
"message": "används redan av YouTube. Välj en annan nyckel."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "är kopplad till en annan funktion. Välj en annan knapp." "message": "är kopplad till en annan funktion. Välj en annan knapp."
}, },
@@ -480,15 +465,6 @@
"category_sponsor": { "category_sponsor": {
"message": "Sponsormeddelande" "message": "Sponsormeddelande"
}, },
"category_intro": {
"message": "Intro-animation"
},
"category_intro_description": {
"message": "Intro-animationer som är återkommande i serien eller inte ger direkt värde. Detta bör inte användas på musikvideor."
},
"category_intro_short": {
"message": "Intro"
},
"category_music_offtopic_description": { "category_music_offtopic_description": {
"message": "Endast för användning i musikvideor. Detta inkluderar intros och outros i musikvideor." "message": "Endast för användning i musikvideor. Detta inkluderar intros och outros i musikvideor."
}, },
@@ -522,6 +498,12 @@
"moreCategories": { "moreCategories": {
"message": "Fler Kategorier" "message": "Fler Kategorier"
}, },
"chooseACategory": {
"message": "Välj en kategori"
},
"youMustSelectACategory": {
"message": "Du måste välja en kategori för alla segment du skickar in!"
},
"bracketEnd": { "bracketEnd": {
"message": "(Slut)" "message": "(Slut)"
}, },

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "Youtube için SponsorBlock - Sponsorlukları Atla", "message": "Youtube için SponsorBlock - Sponsorlukları Atla",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "YouTube videolarındaki sponsorlukları atla. İzlediğin videolardaki sponsorları diğerlerine zaman kazandırmak için raporla.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Sunucu isteğin geçersiz olduğunu iletti" "message": "Sunucu isteğin geçersiz olduğunu iletti"
}, },
@@ -221,10 +213,6 @@
"showNotice": { "showNotice": {
"message": "Uyarıyı Tekrar Göster" "message": "Uyarıyı Tekrar Göster"
}, },
"longDescription": {
"message": "SponsorBlock, YouTube'da sponsorlu bölümleri atlamanıza yardımcı olan bir eklentidir. SponsorBlock, herkesin YouTube videolarında bulunan sponsorlu bölümlerin başını ve sonunu göndermesine izin veren kitlekaynaklı bir tarayıcı eklentisidir. Bu bilgiyi biri yolladığında, bu sponsorlu bölüm herkeste atlanır.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Website", "message": "Website",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -470,9 +458,6 @@
"theKey": { "theKey": {
"message": "Anahtar" "message": "Anahtar"
}, },
"keyAlreadyUsedByYouTube": {
"message": "YouTube tarafından zaten kullanımda. Lütfen başka bir anahtar seçin."
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "başka bir eyleme bağlı. Lütfen başka bir anahtar seçin." "message": "başka bir eyleme bağlı. Lütfen başka bir anahtar seçin."
}, },
@@ -483,9 +468,6 @@
"category_sponsor": { "category_sponsor": {
"message": "Sponsor" "message": "Sponsor"
}, },
"category_intro": {
"message": "Giriş Animasyonu"
},
"category_outro": { "category_outro": {
"message": "Bitiş Ekranı/Jenerik" "message": "Bitiş Ekranı/Jenerik"
}, },
@@ -510,6 +492,20 @@
"showOverlay": { "showOverlay": {
"message": "Arama Çubuğunda Göster" "message": "Arama Çubuğunda Göster"
}, },
"previewColor": {
"message": "Önizleme Rengi",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Oynatma Çubuğu Rengi"
},
"category": {
"message": "Kategori"
},
"skipOption": {
"message": "Atlama Seçeneği",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": { "enableTestingServer": {
"message": "Beta Deneme Sunucusunu Devreye Sok" "message": "Beta Deneme Sunucusunu Devreye Sok"
}, },
@@ -563,5 +559,15 @@
}, },
"multipleSegments": { "multipleSegments": {
"message": "Birden Çok Bölüm" "message": "Birden Çok Bölüm"
},
"guidelines": {
"message": "Kılavuz"
},
"readTheGuidelines": {
"message": "Kılavuzu Oku!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "Kategoriler burada!"
} }
} }

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock для YouTube - Пропускайте спонсорські вставки", "message": "SponsorBlock для YouTube - Пропускайте спонсорські вставки",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "Пропускайте спонсорські вставки в відео на YouTube. Повідомляйте про спонсорські вставки в відео, які Ви дивіться, щоб заощадити час інших користувачів.",
"description": "Description of the extension."
},
"400": { "400": {
"message": "Сервер відхилив цей запит" "message": "Сервер відхилив цей запит"
}, },
@@ -209,10 +201,6 @@
"showNotice": { "showNotice": {
"message": "Показувати сповіщення знову" "message": "Показувати сповіщення знову"
}, },
"longDescription": {
"message": "SponsorBlock - це розширення, яке пропускає спонсорські вставки в відео на YouTube. SponsorBlock - це краудсорсінгове розширення, яке дозволяє кожному надіслати час початку і кінця спонсорських сегментів в відео на YouTube. Після того, як хто-небудь надсилає цю інформацію, всі інші користувачі розширення будуть автоматично пропускати спонсорські сегменти.",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "Сайт", "message": "Сайт",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"

View File

@@ -1,16 +1,8 @@
{ {
"Name": {
"message": "SponsorBlock",
"description": "Name of the extension."
},
"fullName": { "fullName": {
"message": "SponsorBlock for YouTube - 跳过赞助商广告", "message": "SponsorBlock for YouTube - 跳过赞助商广告",
"description": "Name of the extension." "description": "Name of the extension."
}, },
"Description": {
"message": "跳过 YouTube 视频的赞助商广告。报告您观看的视频的赞助商广告以节省他人的时间。",
"description": "Description of the extension."
},
"400": { "400": {
"message": "服务器说此请求无效" "message": "服务器说此请求无效"
}, },
@@ -221,10 +213,6 @@
"showNotice": { "showNotice": {
"message": "重新显示通知" "message": "重新显示通知"
}, },
"longDescription": {
"message": "SponsorBlock 是一个用于跳过 YouTube 视频的赞助商广告片段的扩展。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 Youtube 视频的赞助商广告片段的开始和结束时间。一旦有人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。",
"description": "Full description of the extension on the store pages."
},
"website": { "website": {
"message": "网站", "message": "网站",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
@@ -470,9 +458,6 @@
"theKey": { "theKey": {
"message": "按键" "message": "按键"
}, },
"keyAlreadyUsedByYouTube": {
"message": "已被 Youtube 使用。请选择其他按键。"
},
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "已绑定其他操作。请选择其他按键。" "message": "已绑定其他操作。请选择其他按键。"
}, },
@@ -483,24 +468,30 @@
"category_sponsor": { "category_sponsor": {
"message": "赞助商广告" "message": "赞助商广告"
}, },
"category_intro": {
"message": "开头动画"
},
"category_outro": { "category_outro": {
"message": "结束画面/结尾职员表" "message": "结束画面/结尾职员表"
}, },
"category_interaction": { "category_interaction": {
"message": "互动提醒(订阅)" "message": "互动提醒(订阅)"
}, },
"category_interaction_short": {
"message": "互动提醒"
},
"category_selfpromo": { "category_selfpromo": {
"message": "未收钱的/自我推销" "message": "未收钱的/自我推销"
}, },
"category_music_offtopic": { "category_music_offtopic": {
"message": "音乐:非音乐部分" "message": "音乐:非音乐部分"
}, },
"category_music_offtopic_short": {
"message": "无音乐"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "直播:捐赠/消息阅读" "message": "直播:捐赠/消息阅读"
}, },
"category_livestream_messages_short": {
"message": "阅读消息"
},
"disable": { "disable": {
"message": "禁用" "message": "禁用"
}, },
@@ -510,6 +501,20 @@
"showOverlay": { "showOverlay": {
"message": "在搜索栏中显示" "message": "在搜索栏中显示"
}, },
"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": { "enableTestingServer": {
"message": "启用 Beta 测试服务器" "message": "启用 Beta 测试服务器"
}, },
@@ -563,5 +568,18 @@
}, },
"multipleSegments": { "multipleSegments": {
"message": "多个片段" "message": "多个片段"
},
"guidelines": {
"message": "指南"
},
"readTheGuidelines": {
"message": "阅读指南!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "类别在这里!"
},
"categoryUpdate2": {
"message": "打开选项,跳过开头,结尾,商业等。"
} }
} }

View File

@@ -140,6 +140,7 @@
color: rgb(235, 235, 235); color: rgb(235, 235, 235);
border: none; border: none;
display: inline-block; display: inline-block;
font-size: 13.3333px !important;
cursor: pointer; cursor: pointer;
@@ -179,6 +180,7 @@
.sponsorSkipNoticeCloseButton { .sponsorSkipNoticeCloseButton {
height: 10px; height: 10px;
width: 10px; width: 10px;
box-sizing: unset;
padding: 2px 5px; padding: 2px 5px;

View File

@@ -268,6 +268,23 @@
<div class="small-description">__MSG_audioNotificationDescription__</div> <div class="small-description">__MSG_audioNotificationDescription__</div>
</div> </div>
<br/>
<br/>
<div option-type="toggle" sync-option="showTimeWithSkips">
<label class="switch-container" label-name="__MSG_showTimeWithSkips__">
<label class="switch">
<input type="checkbox" checked>
<span class="slider round"></span>
</label>
</label>
<br/>
<br/>
<div class="small-description">__MSG_showTimeWithSkipsDescription__</div>
</div>
<br/> <br/>
<br/> <br/>

View File

@@ -10,7 +10,7 @@
<div id="app" class="popupBody sponsorBlockPageBody"> <div id="app" class="popupBody sponsorBlockPageBody">
<h1 class="popupElement logoText"> <h1 class="popupElement logoText">
<img src="icons/IconSponsorBlocker256px.png" height="32px" id="sponsorBlockPopupLogo"/> <img src="icons/IconSponsorBlocker256px.png" height="32px" id="sponsorBlockPopupLogo"/>
__MSG_Name__ SponsorBlock
</h1> </h1>
<!-- Loading text --> <!-- Loading text -->
@@ -38,8 +38,6 @@
<sub class="popupElement">__MSG_popupHint__</sub> <sub class="popupElement">__MSG_popupHint__</sub>
<div id="submissionSection" class="popupElement" style="display: none"> <div id="submissionSection" class="popupElement" style="display: none">
<h3 class="popupElement">__MSG_lastTimes__</h3>
<b>Sponsor Editing has been moved and will appear after you click submit</b> <b>Sponsor Editing has been moved and will appear after you click submit</b>
<br/> <br/>

View File

@@ -40,21 +40,6 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
}); });
}); });
return true;
case "addSponsorTime":
addSponsorTime(request.time, request.videoID, callback);
//this allows the callback to be called later
return true;
case "getSponsorTimes":
getSponsorTimes(request.videoID, function(sponsorTimes) {
callback({
sponsorTimes
});
});
//this allows the callback to be called later
return true; return true;
case "submitVote": case "submitVote":
submitVote(request.type, request.UUID, request.category).then(callback); submitVote(request.type, request.UUID, request.category).then(callback);
@@ -127,38 +112,6 @@ function unregisterFirefoxContentScript(id: string) {
delete contentScriptRegistrations[id]; delete contentScriptRegistrations[id];
} }
//gets the sponsor times from memory
function getSponsorTimes(videoID, callback) {
let sponsorTimes = [];
let sponsorTimesStorage = Config.config.sponsorTimes.get(videoID);
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
sponsorTimes = sponsorTimesStorage;
}
callback(sponsorTimes);
}
function addSponsorTime(time, videoID, callback) {
getSponsorTimes(videoID, function(sponsorTimes) {
//add to sponsorTimes
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length < 2) {
//it is an end time
sponsorTimes[sponsorTimes.length - 1][1] = time;
} else {
//it is a start time
let sponsorTimesIndex = sponsorTimes.length;
sponsorTimes[sponsorTimesIndex] = [];
sponsorTimes[sponsorTimesIndex][0] = time;
}
//save this info
Config.config.sponsorTimes.set(videoID, sponsorTimes);
callback();
});
}
async function submitVote(type: number, UUID: string, category: string) { async function submitVote(type: number, UUID: string, category: string) {
let userID = Config.config.userID; let userID = Config.config.userID;

View File

@@ -134,13 +134,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.audio.volume = this.contentContainer().v.volume * 0.1; this.audio.volume = this.contentContainer().v.volume * 0.1;
this.audio.play(); this.audio.play();
} }
if (Config.config.categoryUpdateShowCount < 3 && Config.config.categorySelections.length <= 1) {
this.setNoticeInfoMessageWithOnClick(() => chrome.runtime.sendMessage({"message": "openConfig"})
, chrome.i18n.getMessage("categoryUpdate1"), chrome.i18n.getMessage("categoryUpdate2"));
Config.config.categoryUpdateShowCount = Config.config.categoryUpdateShowCount + 1
}
} }
render() { render() {

View File

@@ -230,7 +230,12 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
} }
getCategoryOptions() { getCategoryOptions() {
let elements = []; let elements = [(
<option value={"chooseACategory"}
key={"chooseACategory"}>
{chrome.i18n.getMessage("chooseACategory")}
</option>
)];
for (const category of Config.config.categorySelections) { for (const category of Config.config.categorySelections) {
elements.push( elements.push(
@@ -322,7 +327,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;
Config.config.sponsorTimes.set(this.props.contentContainer().sponsorVideoID, utils.getSegmentsFromSponsorTimes(sponsorTimesSubmitting)); Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimesSubmitting);
this.props.contentContainer().updatePreviewBar(); this.props.contentContainer().updatePreviewBar();
} }
@@ -354,7 +359,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
sponsorTimes.splice(index, 1); sponsorTimes.splice(index, 1);
//save this //save this
Config.config.sponsorTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimes); Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimes);
this.props.contentContainer().updatePreviewBar(); this.props.contentContainer().updatePreviewBar();

View File

@@ -167,9 +167,16 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
ref.current.saveEditTimes(); ref.current.saveEditTimes();
} }
let sponsorTimesSubmitting = this.props.contentContainer().sponsorTimesSubmitting;
for (const sponsorTime of sponsorTimesSubmitting) {
if (sponsorTime.category === "chooseACategory") {
alert(chrome.i18n.getMessage("youMustSelectACategory"));
return;
}
}
// Check if any non music categories are being used on a music video // Check if any non music categories are being used on a music video
if (this.contentContainer().videoInfo?.microformat?.playerMicroformatRenderer?.category === "Music") { if (this.contentContainer().videoInfo?.microformat?.playerMicroformatRenderer?.category === "Music") {
let sponsorTimesSubmitting = this.props.contentContainer().sponsorTimesSubmitting;
for (const sponsorTime of sponsorTimesSubmitting) { for (const sponsorTime of sponsorTimesSubmitting) {
if (!sponsorTime.category.startsWith("music_")) { if (!sponsorTime.category.startsWith("music_")) {
if (!confirm(chrome.i18n.getMessage("nonMusicCategoryOnMusic"))) return; if (!confirm(chrome.i18n.getMessage("nonMusicCategoryOnMusic"))) return;

View File

@@ -1,12 +1,14 @@
import * as CompileConfig from "../config.json"; import * as CompileConfig from "../config.json";
import { CategorySelection, CategorySkipOption, PreviewBarOption } from "./types"; import { CategorySelection, CategorySkipOption, PreviewBarOption, SponsorTime } from "./types";
import Utils from "./utils"; import Utils from "./utils";
const utils = new Utils(); const utils = new Utils();
interface SBConfig { interface SBConfig {
userID: string, userID: string,
sponsorTimes: SBMap<string, any>, // sponsorTimes: SBMap<string, SponsorTime[]>,
segmentTimes: SBMap<string, SponsorTime[]>,
defaultCategory: string,
whitelistedChannels: string[], whitelistedChannels: string[],
forceChannelCheck: boolean, forceChannelCheck: boolean,
startSponsorKeybind: string, startSponsorKeybind: string,
@@ -15,6 +17,7 @@ interface SBConfig {
skipCount: number, skipCount: number,
sponsorTimesContributed: number, sponsorTimesContributed: number,
submissionCountSinceCategories: number, // New count used to show the "Read The Guidelines!!" message submissionCountSinceCategories: number, // New count used to show the "Read The Guidelines!!" message
showTimeWithSkips: boolean,
unsubmittedWarning: boolean, unsubmittedWarning: boolean,
disableSkipping: boolean, disableSkipping: boolean,
trackViewCount: boolean, trackViewCount: boolean,
@@ -33,13 +36,12 @@ interface SBConfig {
checkForUnlistedVideos: boolean, checkForUnlistedVideos: boolean,
testingServer: boolean, testingServer: boolean,
categoryUpdateShowCount: number,
// What categories should be skipped // What categories should be skipped
categorySelections: CategorySelection[], categorySelections: CategorySelection[],
// Preview bar // Preview bar
barTypes: { barTypes: {
"preview-chooseACategory": PreviewBarOption,
"sponsor": PreviewBarOption, "sponsor": PreviewBarOption,
"preview-sponsor": PreviewBarOption, "preview-sponsor": PreviewBarOption,
"intro": PreviewBarOption, "intro": PreviewBarOption,
@@ -51,7 +53,7 @@ interface SBConfig {
"selfpromo": PreviewBarOption, "selfpromo": PreviewBarOption,
"preview-selfpromo": PreviewBarOption, "preview-selfpromo": PreviewBarOption,
"music_offtopic": PreviewBarOption, "music_offtopic": PreviewBarOption,
"preview-music_offtopic": PreviewBarOption "preview-music_offtopic": PreviewBarOption,
} }
} }
@@ -84,24 +86,39 @@ class SBMap<T, U> extends Map {
} }
} }
set(key, value) { get(key): U {
const result = super.set(key, value); return super.get(key);
}
rawSet(key, value) {
return super.set(key, value);
}
update() {
// Store updated SBMap locally // Store updated SBMap locally
chrome.storage.sync.set({ chrome.storage.sync.set({
[this.id]: encodeStoredItem(this) [this.id]: encodeStoredItem(this)
}); });
}
set(key: T, value: U) {
const result = super.set(key, value);
this.update();
return result; return result;
} }
delete(key) { delete(key) {
const result = super.delete(key); const result = super.delete(key);
// Store updated SBMap locally // Make sure there are no empty elements
chrome.storage.sync.set({ for (const entry of this.entries()) {
[this.id]: encodeStoredItem(this) if (entry[1].length === 0) {
}); super.delete(entry[0]);
}
}
this.update();
return result; return result;
} }
@@ -109,10 +126,7 @@ class SBMap<T, U> extends Map {
clear() { clear() {
const result = super.clear(); const result = super.clear();
chrome.storage.sync.set({ this.update();
[this.id]: encodeStoredItem(this)
});
return result; return result;
} }
} }
@@ -124,7 +138,8 @@ var Config: SBObject = {
configListeners: [], configListeners: [],
defaults: { defaults: {
userID: null, userID: null,
sponsorTimes: new SBMap("sponsorTimes"), segmentTimes: new SBMap("segmentTimes"),
defaultCategory: "chooseACategory",
whitelistedChannels: [], whitelistedChannels: [],
forceChannelCheck: false, forceChannelCheck: false,
startSponsorKeybind: ";", startSponsorKeybind: ";",
@@ -133,6 +148,7 @@ var Config: SBObject = {
skipCount: 0, skipCount: 0,
sponsorTimesContributed: 0, sponsorTimesContributed: 0,
submissionCountSinceCategories: 0, submissionCountSinceCategories: 0,
showTimeWithSkips: true,
unsubmittedWarning: true, unsubmittedWarning: true,
disableSkipping: false, disableSkipping: false,
trackViewCount: true, trackViewCount: true,
@@ -151,8 +167,6 @@ var Config: SBObject = {
checkForUnlistedVideos: false, checkForUnlistedVideos: false,
testingServer: false, testingServer: false,
categoryUpdateShowCount: 0,
categorySelections: [{ categorySelections: [{
name: "sponsor", name: "sponsor",
option: CategorySkipOption.AutoSkip option: CategorySkipOption.AutoSkip
@@ -160,6 +174,10 @@ var Config: SBObject = {
// Preview bar // Preview bar
barTypes: { barTypes: {
"preview-chooseACategory": {
color: "#ffffff",
opacity: "0.7"
},
"sponsor": { "sponsor": {
color: "#00d400", color: "#00d400",
opacity: "0.7" opacity: "0.7"
@@ -238,24 +256,13 @@ function encodeStoredItem<T>(data: T): T | Array<any> {
* *
* @param {*} data * @param {*} data
*/ */
function decodeStoredItem<T>(id: string, data: T): T | SBMap<string, any> { function decodeStoredItem<T>(id: string, data: T): T | SBMap<string, SponsorTime[]> {
if (!Config.defaults[id]) return data; if (!Config.defaults[id]) return data;
if (Config.defaults[id] instanceof SBMap) { if (Config.defaults[id] instanceof SBMap) {
try { try {
let jsonData: any = data; if (!Array.isArray(data)) return data;
return new SBMap(id, data);
// Check if data is stored in the old format for SBMap (a JSON string)
if (typeof data === "string") {
try {
jsonData = JSON.parse(data);
} catch(e) {
// Continue normally (out of this if statement)
}
}
if (!Array.isArray(jsonData)) return data;
return new SBMap(id, jsonData);
} catch(e) { } catch(e) {
console.error("Failed to parse SBMap: " + id); console.error("Failed to parse SBMap: " + id);
} }
@@ -313,9 +320,9 @@ function fetchConfig() {
}); });
} }
async function migrateOldFormats() { function migrateOldFormats(config: SBConfig) {
if (Config.config["disableAutoSkip"]) { if (config["disableAutoSkip"]) {
for (const selection of Config.config.categorySelections) { for (const selection of config.categorySelections) {
if (selection.name === "sponsor") { if (selection.name === "sponsor") {
selection.option = CategorySkipOption.ManualSkip; selection.option = CategorySkipOption.ManualSkip;
@@ -325,62 +332,108 @@ async function migrateOldFormats() {
} }
// Auto vote removal // Auto vote removal
if (Config.config["autoUpvote"]) { if (config["autoUpvote"]) {
chrome.storage.sync.remove("autoUpvote"); chrome.storage.sync.remove("autoUpvote");
} }
// mobileUpdateShowCount removal // mobileUpdateShowCount removal
if (Config.config["mobileUpdateShowCount"] !== undefined) { if (config["mobileUpdateShowCount"] !== undefined) {
chrome.storage.sync.remove("mobileUpdateShowCount"); chrome.storage.sync.remove("mobileUpdateShowCount");
} }
// categoryUpdateShowCount removal
if (config["categoryUpdateShowCount"] !== undefined) {
chrome.storage.sync.remove("categoryUpdateShowCount");
}
// Channel URLS // Channel URLS
if (Config.config.whitelistedChannels.length > 0 && if (config.whitelistedChannels.length > 0 &&
(Config.config.whitelistedChannels[0] == null || Config.config.whitelistedChannels[0].includes("/"))) { (config.whitelistedChannels[0] == null || config.whitelistedChannels[0].includes("/"))) {
let newChannelList: string[] = []; const channelURLFixer = async() => {
for (const item of Config.config.whitelistedChannels) { let newChannelList: string[] = [];
if (item != null) { for (const item of config.whitelistedChannels) {
if (item.includes("/channel/")) { if (item != null) {
newChannelList.push(item.split("/")[2]); if (item.includes("/channel/")) {
} else if (item.includes("/user/") && utils.isContentScript()) { newChannelList.push(item.split("/")[2]);
// Replace channel URL with channelID } else if (item.includes("/user/") && utils.isContentScript()) {
let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
if (response.ok) { // Replace channel URL with channelID
newChannelList.push((JSON.parse(response.responseText)).authorId); let response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
} else {
// Add it at the beginning so it gets converted later 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); newChannelList.unshift(item);
} else {
newChannelList.push(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;
} }
Config.config.whitelistedChannels = newChannelList; channelURLFixer();
} }
// Check if off-topic category needs to be removed // Check if off-topic category needs to be removed
for (let i = 0; i < Config.config.categorySelections.length; i++) { for (let i = 0; i < config.categorySelections.length; i++) {
if (Config.config.categorySelections[i].name === "offtopic") { if (config.categorySelections[i].name === "offtopic") {
Config.config.categorySelections.splice(i, 1); config.categorySelections.splice(i, 1);
// Call set listener // Call set listener
Config.config.categorySelections = Config.config.categorySelections; config.categorySelections = config.categorySelections;
break; break;
} }
} }
// Migrate old "sponsorTimes"
if (config["sponsorTimes"]) {
let jsonData: any = 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)) {
let oldMap = new Map(jsonData);
oldMap.forEach((sponsorTimes: number[][], key) => {
let 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");
}
} }
async function setupConfig() { async function setupConfig() {
await fetchConfig(); await fetchConfig();
addDefaults(); addDefaults();
convertJSON(); convertJSON();
Config.config = configProxy(); const config = configProxy();
migrateOldFormats(); migrateOldFormats(config);
Config.config = config;
} }
// Reset config // Reset config
@@ -399,6 +452,12 @@ function addDefaults() {
for (const key in Config.defaults) { for (const key in Config.defaults) {
if(!Config.localConfig.hasOwnProperty(key)) { if(!Config.localConfig.hasOwnProperty(key)) {
Config.localConfig[key] = Config.defaults[key]; Config.localConfig[key] = Config.defaults[key];
} else if (key === "barTypes") {
for (const key2 in Config.defaults[key]) {
if(!Config.localConfig[key].hasOwnProperty(key2)) {
Config.localConfig[key][key2] = Config.defaults[key][key2];
}
}
} }
} }
}; };
@@ -406,4 +465,4 @@ function addDefaults() {
// Sync config // Sync config
setupConfig(); setupConfig();
export default Config; export default Config;

View File

@@ -323,13 +323,13 @@ async function videoIDChange(id) {
//warn them if they had unsubmitted times //warn them if they had unsubmitted times
if (previousVideoID != null) { if (previousVideoID != null) {
//get the sponsor times from storage //get the sponsor times from storage
let sponsorTimes = Config.config.sponsorTimes.get(previousVideoID); let sponsorTimes = Config.config.segmentTimes.get(previousVideoID);
if (sponsorTimes != undefined && sponsorTimes.length > 0) { if (sponsorTimes != undefined && sponsorTimes.length > 0) {
//warn them that they have unsubmitted sponsor times //warn them that they have unsubmitted sponsor times
chrome.runtime.sendMessage({ chrome.runtime.sendMessage({
message: "alertPrevious", message: "alertPrevious",
previousVideoID: previousVideoID previousVideoID: previousVideoID
}) });
} }
//set the previous video id to the currentID //set the previous video id to the currentID
@@ -347,10 +347,10 @@ async function videoIDChange(id) {
//make sure everything is properly added //make sure everything is properly added
updateVisibilityOfPlayerControlsButton().then(() => { updateVisibilityOfPlayerControlsButton().then(() => {
//see if the onvideo control image needs to be changed //see if the onvideo control image needs to be changed
let segments = Config.config.sponsorTimes.get(sponsorVideoID); let segments = Config.config.segmentTimes.get(sponsorVideoID);
if (segments != null && segments.length > 0 && segments[segments.length - 1].length >= 2) { if (segments != null && segments.length > 0 && segments[segments.length - 1].segment.length >= 2) {
changeStartSponsorButton(true, true); changeStartSponsorButton(true, true);
} else if (segments != null && segments.length > 0 && segments[segments.length - 1].length < 2) { } else if (segments != null && segments.length > 0 && segments[segments.length - 1].segment.length < 2) {
changeStartSponsorButton(false, true); changeStartSponsorButton(false, true);
} else { } else {
changeStartSponsorButton(true, false); changeStartSponsorButton(true, false);
@@ -418,7 +418,7 @@ function createPreviewBar(): void {
const el = document.querySelectorAll(selector); const el = document.querySelectorAll(selector);
if (el && el.length && el[0]) { if (el && el.length && el[0]) {
previewBar = new PreviewBar(el[0], onMobileYouTube); previewBar = new PreviewBar(el[0], onMobileYouTube, onInvidious);
updatePreviewBar(); updatePreviewBar();
@@ -448,7 +448,7 @@ function cancelSponsorSchedule(): void {
* *
* @param currentTime Optional if you don't want to use the actual current time * @param currentTime Optional if you don't want to use the actual current time
*/ */
function startSponsorSchedule(includeIntersectingSegments: boolean = false, currentTime?: number): void { function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: number, includeNonIntersectingSegments = true): void {
cancelSponsorSchedule(); cancelSponsorSchedule();
// Don't skip if advert playing and reset last checked time // Don't skip if advert playing and reset last checked time
@@ -470,7 +470,7 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
if (currentTime === undefined || currentTime === null) currentTime = video.currentTime; if (currentTime === undefined || currentTime === null) currentTime = video.currentTime;
let skipInfo = getNextSkipIndex(currentTime, includeIntersectingSegments); let skipInfo = getNextSkipIndex(currentTime, includeIntersectingSegments, includeNonIntersectingSegments);
if (skipInfo.index === -1) return; if (skipInfo.index === -1) return;
@@ -493,27 +493,29 @@ function startSponsorSchedule(includeIntersectingSegments: boolean = false, curr
} }
// Don't skip if this category should not be skipped // Don't skip if this category should not be skipped
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ShowOverlay) return; if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ShowOverlay
&& skipInfo.array !== sponsorTimesSubmitting) return;
let skippingFunction = () => { let skippingFunction = () => {
let forcedSkipTime: number = null; let forcedSkipTime: number = null;
let forcedIncludeIntersectingSegments = false; let forcedIncludeIntersectingSegments = false;
let forcedIncludeNonIntersectingSegments = true;
if (incorrectVideoCheck(videoID, currentSkip)) return; if (incorrectVideoCheck(videoID, currentSkip)) return;
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) { if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
skipToTime(video, skipTime, skippingSegments, skipInfo.openNotice); skipToTime(video, skipTime, skippingSegments, skipInfo.openNotice);
// TODO: Know the autoSkip settings for ALL items being skipped if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ManualSkip) {
if (utils.getCategorySelection(currentSkip.category).option === CategorySkipOption.ManualSkip) {
forcedSkipTime = skipTime[0] + 0.001; forcedSkipTime = skipTime[0] + 0.001;
} else { } else {
forcedSkipTime = skipTime[1]; forcedSkipTime = skipTime[1];
forcedIncludeIntersectingSegments = true; forcedIncludeIntersectingSegments = true;
forcedIncludeNonIntersectingSegments = false;
} }
} }
startSponsorSchedule(forcedIncludeIntersectingSegments, forcedSkipTime); startSponsorSchedule(forcedIncludeIntersectingSegments, forcedSkipTime, forcedIncludeNonIntersectingSegments);
}; };
if (timeUntilSponsor <= 0) { if (timeUntilSponsor <= 0) {
@@ -566,8 +568,9 @@ function sponsorsLookup(id: string) {
// Check if an ad is playing // Check if an ad is playing
updateAdFlag(); updateAdFlag();
// Make sure it doesn't get double called with the playing event // Make sure it doesn't get double called with the playing event
if (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000) { if (Math.abs(lastCheckVideoTime - video.currentTime) > 0.3
|| (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)) {
lastCheckTime = Date.now(); lastCheckTime = Date.now();
lastCheckVideoTime = video.currentTime; lastCheckVideoTime = video.currentTime;
@@ -577,7 +580,8 @@ function sponsorsLookup(id: string) {
}); });
video.addEventListener('playing', () => { video.addEventListener('playing', () => {
// Make sure it doesn't get double called with the play event // Make sure it doesn't get double called with the play event
if (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000) { if (Math.abs(lastCheckVideoTime - video.currentTime) > 0.3
|| (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)) {
lastCheckTime = Date.now(); lastCheckTime = Date.now();
lastCheckVideoTime = video.currentTime; lastCheckVideoTime = video.currentTime;
@@ -585,11 +589,11 @@ function sponsorsLookup(id: string) {
} }
}); });
video.addEventListener('seeking', () => { video.addEventListener('seeking', () => {
// Reset lastCheckVideoTime
lastCheckVideoTime = -1
lastCheckTime = 0;
if (!video.paused){ if (!video.paused){
// Reset lastCheckVideoTime
lastCheckTime = Date.now();
lastCheckVideoTime = video.currentTime;
startSponsorSchedule(); startSponsorSchedule();
} }
}); });
@@ -618,7 +622,7 @@ function sponsorsLookup(id: string) {
videoID: id, videoID: id,
categories categories
}).then(async (response: FetchResponse) => { }).then(async (response: FetchResponse) => {
if (response.ok) { if (response?.ok) {
let recievedSegments: SponsorTime[] = JSON.parse(response.responseText); let recievedSegments: SponsorTime[] = JSON.parse(response.responseText);
if (!recievedSegments.length) { if (!recievedSegments.length) {
console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments)); console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments));
@@ -662,7 +666,7 @@ function sponsorsLookup(id: string) {
} }
sponsorLookupRetries = 0; sponsorLookupRetries = 0;
} else if (response.status === 404) { } else if (response?.status === 404) {
sponsorDataFound = false; sponsorDataFound = false;
//check if this video was uploaded recently //check if this video was uploaded recently
@@ -714,7 +718,7 @@ function startSkipScheduleCheckingForStartSponsors() {
} }
if (startingSponsor !== -1) { if (startingSponsor !== -1) {
startSponsorSchedule(false, startingSponsor); startSponsorSchedule(undefined, startingSponsor);
} else { } else {
startSponsorSchedule(); startSponsorSchedule();
} }
@@ -801,7 +805,7 @@ function updatePreviewBar() {
if (localSponsorTimes == null) localSponsorTimes = []; if (localSponsorTimes == null) localSponsorTimes = [];
let allSponsorTimes = localSponsorTimes.concat(sponsorTimesSubmitting); let allSponsorTimes = localSponsorTimes.concat(sponsorTimesSubmitting);
//create an array of the sponsor types //create an array of the sponsor types
let types = []; let types = [];
for (let i = 0; i < localSponsorTimes.length; i++) { for (let i = 0; i < localSponsorTimes.length; i++) {
@@ -818,6 +822,10 @@ function updatePreviewBar() {
previewBar.set(utils.getSegmentsFromSponsorTimes(allSponsorTimes), types, video.duration) previewBar.set(utils.getSegmentsFromSponsorTimes(allSponsorTimes), types, video.duration)
if (Config.config.showTimeWithSkips) {
showTimeWithoutSkips(allSponsorTimes);
}
//update last video id //update last video id
lastPreviewBarUpdate = sponsorVideoID; lastPreviewBarUpdate = sponsorVideoID;
} }
@@ -839,23 +847,23 @@ function whitelistCheck() {
} }
// check if the start of segments were missed // check if the start of segments were missed
if (sponsorTimes && sponsorTimes.length > 0) startSkipScheduleCheckingForStartSponsors(); if (Config.config.forceChannelCheck && sponsorTimes && sponsorTimes.length > 0) startSkipScheduleCheckingForStartSponsors();
} }
/** /**
* Returns info about the next upcoming sponsor skip * Returns info about the next upcoming sponsor skip
*/ */
function getNextSkipIndex(currentTime: number, includeIntersectingSegments: boolean): function getNextSkipIndex(currentTime: number, includeIntersectingSegments: boolean, includeNonIntersectingSegments: boolean):
{array: SponsorTime[], index: number, endIndex: number, openNotice: boolean} { {array: SponsorTime[], index: number, endIndex: number, openNotice: boolean} {
let sponsorStartTimes = getStartTimes(sponsorTimes, includeIntersectingSegments); let sponsorStartTimes = getStartTimes(sponsorTimes, includeIntersectingSegments, includeNonIntersectingSegments);
let sponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimes, includeIntersectingSegments, currentTime, true, true); let sponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimes, includeIntersectingSegments, includeNonIntersectingSegments, currentTime, true, true);
let minSponsorTimeIndex = sponsorStartTimes.indexOf(Math.min(...sponsorStartTimesAfterCurrentTime)); let minSponsorTimeIndex = sponsorStartTimes.indexOf(Math.min(...sponsorStartTimesAfterCurrentTime));
let endTimeIndex = getLatestEndTimeIndex(sponsorTimes, minSponsorTimeIndex); let endTimeIndex = getLatestEndTimeIndex(sponsorTimes, minSponsorTimeIndex);
let previewSponsorStartTimes = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments); let previewSponsorStartTimes = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, includeNonIntersectingSegments);
let previewSponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, currentTime, false, false); let previewSponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, includeNonIntersectingSegments, currentTime, false, false);
let minPreviewSponsorTimeIndex = previewSponsorStartTimes.indexOf(Math.min(...previewSponsorStartTimesAfterCurrentTime)); let minPreviewSponsorTimeIndex = previewSponsorStartTimes.indexOf(Math.min(...previewSponsorStartTimesAfterCurrentTime));
let previewEndTimeIndex = getLatestEndTimeIndex(sponsorTimesSubmitting, minPreviewSponsorTimeIndex); let previewEndTimeIndex = getLatestEndTimeIndex(sponsorTimesSubmitting, minPreviewSponsorTimeIndex);
@@ -893,13 +901,13 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
*/ */
function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideHiddenSponsors: boolean = true): number { function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideHiddenSponsors: boolean = true): number {
// Only combine segments for AutoSkip // Only combine segments for AutoSkip
if (index == -1 || if (index == -1 ||
utils.getCategorySelection(sponsorTimes[index].category).option !== CategorySkipOption.AutoSkip) return index; utils.getCategorySelection(sponsorTimes[index].category)?.option !== CategorySkipOption.AutoSkip) return index;
// Default to the normal endTime // Default to the normal endTime
let latestEndTimeIndex = index; let latestEndTimeIndex = index;
for (let i = 0; i < sponsorTimes.length; i++) { for (let i = 0; i < sponsorTimes?.length; i++) {
let currentSegment = sponsorTimes[i].segment; let currentSegment = sponsorTimes[i].segment;
let latestEndTime = sponsorTimes[latestEndTimeIndex].segment[1]; let latestEndTime = sponsorTimes[latestEndTimeIndex].segment[1];
@@ -929,14 +937,16 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH
* @param includeIntersectingSegments If true, it will include segments that start before * @param includeIntersectingSegments If true, it will include segments that start before
* the current time, but end after * the current time, but end after
*/ */
function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: boolean, minimum?: number, function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: boolean, includeNonIntersectingSegments: boolean,
onlySkippableSponsors: boolean = false, hideHiddenSponsors: boolean = false): number[] { minimum?: number, onlySkippableSponsors: boolean = false, hideHiddenSponsors: boolean = false): number[] {
if (sponsorTimes === null) return []; if (sponsorTimes === null) return [];
let startTimes: number[] = []; let startTimes: number[] = [];
for (let i = 0; i < sponsorTimes.length; i++) { for (let i = 0; i < sponsorTimes?.length; i++) {
if ((minimum === undefined || (sponsorTimes[i].segment[0] >= minimum || (includeIntersectingSegments && sponsorTimes[i].segment[1] > minimum))) 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) && (!onlySkippableSponsors || utils.getCategorySelection(sponsorTimes[i].category).option !== CategorySkipOption.ShowOverlay)
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)) { && (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)) {
@@ -964,9 +974,9 @@ function previewTime(time: number) {
//skip from the start time to the end time for a certain index sponsor time //skip from the start time to the end time for a certain index sponsor time
function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) { function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) {
// There will only be one submission if it is manual skip // There will only be one submission if it is manual skip
let autoSkip: boolean = utils.getCategorySelection(skippingSegments[0].category).option === CategorySkipOption.AutoSkip; let autoSkip: boolean = utils.getCategorySelection(skippingSegments[0].category)?.option === CategorySkipOption.AutoSkip;
if (autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) { if ((autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) && v.currentTime !== skipTime[1]) {
v.currentTime = skipTime[1]; v.currentTime = skipTime[1];
} }
@@ -1007,8 +1017,6 @@ function unskipSponsorTime(segment: SponsorTime) {
if (sponsorTimes != null) { if (sponsorTimes != null) {
//add a tiny bit of time to make sure it is not skipped again //add a tiny bit of time to make sure it is not skipped again
video.currentTime = segment.segment[0] + 0.001; video.currentTime = segment.segment[0] + 0.001;
checkIfInsideSegment();
} }
} }
@@ -1016,16 +1024,6 @@ function reskipSponsorTime(segment: SponsorTime) {
video.currentTime = segment.segment[1]; video.currentTime = segment.segment[1];
} }
/**
* Checks if currently inside a segment and will trigger
* a skip schedule if true.
*
* This is used for when a manual skip is finished or a reskip is complete
*/
function checkIfInsideSegment() {
// for
}
function createButton(baseID, title, callback, imageName, isDraggable=false): boolean { function createButton(baseID, title, callback, imageName, isDraggable=false): boolean {
if (document.getElementById(baseID + "Button") != null) return false; if (document.getElementById(baseID + "Button") != null) return false;
@@ -1034,18 +1032,10 @@ function createButton(baseID, title, callback, imageName, isDraggable=false): bo
newButton.draggable = isDraggable; newButton.draggable = isDraggable;
newButton.id = baseID + "Button"; newButton.id = baseID + "Button";
newButton.classList.add("playerButton"); newButton.classList.add("playerButton");
if (!onMobileYouTube) { newButton.classList.add("ytp-button");
newButton.classList.add("ytp-button");
} else {
newButton.classList.add("icon-button");
newButton.style.padding = "0";
}
newButton.setAttribute("title", chrome.i18n.getMessage(title)); newButton.setAttribute("title", chrome.i18n.getMessage(title));
newButton.addEventListener("click", (event: Event) => { newButton.addEventListener("click", (event: Event) => {
callback(); callback();
// Prevents the contols from closing when clicked
if (onMobileYouTube) event.stopPropagation();
}); });
// Image HTML // Image HTML
@@ -1087,6 +1077,8 @@ function getControls(): HTMLElement | boolean {
//adds all the player controls buttons //adds all the player controls buttons
async function createButtons(): Promise<boolean> { async function createButtons(): Promise<boolean> {
if (onMobileYouTube) return;
let result = await utils.wait(getControls).catch(); let result = await utils.wait(getControls).catch();
//set global controls variable //set global controls variable
@@ -1164,36 +1156,28 @@ function startSponsorClicked() {
sponsorTimesSubmitting.push({ sponsorTimesSubmitting.push({
segment: [getRealCurrentTime()], segment: [getRealCurrentTime()],
UUID: null, UUID: null,
// Default to sponsor category: Config.config.defaultCategory
category: "sponsor"
}); });
} }
// Create raw segment list
let segments: number[][] = [];
for (const sponsorTime of sponsorTimesSubmitting) {
segments.push(sponsorTime.segment);
}
//save this info //save this info
Config.config.sponsorTimes.set(sponsorVideoID, segments); Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
updateSponsorTimesSubmitting(false) updateSponsorTimesSubmitting(false)
} }
function updateSponsorTimesSubmitting(getFromConfig: boolean = true) { function updateSponsorTimesSubmitting(getFromConfig: boolean = true) {
let segments = Config.config.sponsorTimes.get(sponsorVideoID); let segmentTimes = Config.config.segmentTimes.get(sponsorVideoID);
//see if this data should be saved in the sponsorTimesSubmitting variable //see if this data should be saved in the sponsorTimesSubmitting variable
if (getFromConfig && segments != undefined) { if (getFromConfig && segmentTimes != undefined) {
sponsorTimesSubmitting = []; sponsorTimesSubmitting = [];
for (const segment of segments) { for (const segmentTime of segmentTimes) {
sponsorTimesSubmitting.push({ sponsorTimesSubmitting.push({
segment: segment, segment: segmentTime.segment,
UUID: null, UUID: null,
// Default to sponsor category: segmentTime.category
category: "sponsor"
}); });
} }
} }
@@ -1220,9 +1204,9 @@ async function changeStartSponsorButton(showStartSponsor, uploadButtonVisible) {
(<HTMLImageElement> document.getElementById("startSponsorImage")).src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png"); (<HTMLImageElement> document.getElementById("startSponsorImage")).src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png");
document.getElementById("startSponsorButton").setAttribute("title", chrome.i18n.getMessage("sponsorStart")); document.getElementById("startSponsorButton").setAttribute("title", chrome.i18n.getMessage("sponsorStart"));
if (document.getElementById("startSponsorImage").style.display != "none" && uploadButtonVisible && !Config.config.hideUploadButtonPlayerControls) { if (document.getElementById("startSponsorImage").style.display != "none" && uploadButtonVisible && !Config.config.hideUploadButtonPlayerControls && !onInvidious) {
document.getElementById("submitButton").style.display = "unset"; document.getElementById("submitButton").style.display = "unset";
} else if (!uploadButtonVisible) { } else if (!uploadButtonVisible || onInvidious) {
//disable submit button //disable submit button
document.getElementById("submitButton").style.display = "none"; document.getElementById("submitButton").style.display = "none";
} }
@@ -1317,7 +1301,7 @@ function clearSponsorTimes() {
let currentVideoID = sponsorVideoID; let currentVideoID = sponsorVideoID;
let sponsorTimes = Config.config.sponsorTimes.get(currentVideoID); let sponsorTimes = Config.config.segmentTimes.get(currentVideoID);
if (sponsorTimes != undefined && sponsorTimes.length > 0) { if (sponsorTimes != undefined && sponsorTimes.length > 0) {
let confirmMessage = chrome.i18n.getMessage("clearThis") + getSegmentsMessage(sponsorTimes) let confirmMessage = chrome.i18n.getMessage("clearThis") + getSegmentsMessage(sponsorTimes)
@@ -1325,7 +1309,7 @@ function clearSponsorTimes() {
if(!confirm(confirmMessage)) return; if(!confirm(confirmMessage)) return;
//clear the sponsor times //clear the sponsor times
Config.config.sponsorTimes.delete(currentVideoID); Config.config.segmentTimes.delete(currentVideoID);
//clear sponsor times submitting //clear sponsor times submitting
sponsorTimesSubmitting = []; sponsorTimesSubmitting = [];
@@ -1447,14 +1431,14 @@ async function sendSubmitMessage(){
} }
//update sponsorTimes //update sponsorTimes
Config.config.sponsorTimes.set(sponsorVideoID, utils.getSegmentsFromSponsorTimes(sponsorTimesSubmitting)); Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
// Check to see if any of the submissions are below the minimum duration set // Check to see if any of the submissions are below the minimum duration set
if (Config.config.minDuration > 0) { if (Config.config.minDuration > 0) {
for (let i = 0; i < sponsorTimesSubmitting.length; i++) { 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) {
let confirmShort = chrome.i18n.getMessage("shortCheck") + "\n\n" + let confirmShort = chrome.i18n.getMessage("shortCheck") + "\n\n" +
getSegmentsMessage(utils.getSegmentsFromSponsorTimes(sponsorTimesSubmitting)); getSegmentsMessage(sponsorTimesSubmitting);
if(!confirm(confirmShort)) return; if(!confirm(confirmShort)) return;
} }
@@ -1484,7 +1468,7 @@ async function sendSubmitMessage(){
submitButton.addEventListener("animationend", animationEndListener); submitButton.addEventListener("animationend", animationEndListener);
//clear the sponsor times //clear the sponsor times
Config.config.sponsorTimes.delete(sponsorVideoID); Config.config.segmentTimes.delete(sponsorVideoID);
//add submissions to current sponsors list //add submissions to current sponsors list
if (sponsorTimes === null) sponsorTimes = []; if (sponsorTimes === null) sponsorTimes = [];
@@ -1512,12 +1496,12 @@ async function sendSubmitMessage(){
} }
//get the message that visually displays the video times //get the message that visually displays the video times
function getSegmentsMessage(segments: number[][]): string { function getSegmentsMessage(sponsorTimes: SponsorTime[]): string {
let sponsorTimesMessage = ""; let sponsorTimesMessage = "";
for (let i = 0; i < segments.length; i++) { for (let i = 0; i < sponsorTimes.length; i++) {
for (let s = 0; s < segments[i].length; s++) { for (let s = 0; s < sponsorTimes[i].segment.length; s++) {
let timeMessage = utils.getFormattedTime(segments[i][s]); let timeMessage = utils.getFormattedTime(sponsorTimes[i].segment[s]);
//if this is an end time //if this is an end time
if (s == 1) { if (s == 1) {
timeMessage = " to " + timeMessage; timeMessage = " to " + timeMessage;
@@ -1593,3 +1577,38 @@ function updateAdFlag() {
updateVisibilityOfPlayerControlsButton(); updateVisibilityOfPlayerControlsButton();
} }
} }
function showTimeWithoutSkips(allSponsorTimes): void {
if (onMobileYouTube || onInvidious) return;
let skipDuration = 0;
// Calculate skipDuration based from the segments in the preview bar
for (let i = 0; i < allSponsorTimes.length; i++) {
// If an end time exists
if (allSponsorTimes[i].segment[1]) {
skipDuration += allSponsorTimes[i].segment[1] - allSponsorTimes[i].segment[0];
}
}
// YouTube player time display
let display = document.getElementsByClassName("ytp-time-display notranslate")[0];
if (!display) return;
let formatedTime = utils.getFormattedTime(video.duration - skipDuration);
const durationID = "sponsorBlockDurationAfterSkips";
let duration = document.getElementById(durationID);
// Create span if needed
if(duration === null) {
duration = document.createElement('span');
duration.id = durationID;
duration.classList.add("ytp-time-duration");
display.appendChild(duration);
}
duration.innerText = (skipDuration <= 0 || isNaN(skipDuration) || formatedTime.includes("NaN")) ? "" : " ("+formatedTime+")";
}

View File

@@ -6,21 +6,25 @@
'use strict'; 'use strict';
import Config from "../config"; import Config from "../config";
import Utils from "../utils";
let utils = new Utils();
class PreviewBar { class PreviewBar {
container: HTMLUListElement; container: HTMLUListElement;
parent: any; parent: any;
onMobileYouTube: boolean; onMobileYouTube: boolean;
onInvidious: boolean;
timestamps: number[][]; timestamps: number[][];
types: string; types: string;
constructor(parent, onMobileYouTube) { constructor(parent, onMobileYouTube, onInvidious) {
this.container = document.createElement('ul'); this.container = document.createElement('ul');
this.container.id = 'previewbar'; this.container.id = 'previewbar';
this.parent = parent; this.parent = parent;
this.onMobileYouTube = onMobileYouTube; this.onMobileYouTube = onMobileYouTube;
this.onInvidious = onInvidious;
this.updatePosition(parent); this.updatePosition(parent);
@@ -28,6 +32,8 @@ class PreviewBar {
} }
setupHoverText() { setupHoverText() {
if (this.onMobileYouTube || this.onInvidious) return;
let seekBar = document.querySelector(".ytp-progress-bar-container"); let seekBar = document.querySelector(".ytp-progress-bar-container");
// Create label placeholder // Create label placeholder
@@ -79,8 +85,8 @@ class PreviewBar {
tooltipTextWrapper.classList.remove("sbTooltipOneTitleThumbnailOffset"); tooltipTextWrapper.classList.remove("sbTooltipOneTitleThumbnailOffset");
} else if (category !== null) { } else if (category !== null) {
categoryTooltip.classList.remove("sbHidden"); categoryTooltip.classList.remove("sbHidden");
categoryTooltip.textContent = chrome.i18n.getMessage("category_" + category) categoryTooltip.textContent = utils.shortCategoryName(category)
|| (chrome.i18n.getMessage("preview") + " " + chrome.i18n.getMessage("category_" + category.split("preview-")[1])); || (chrome.i18n.getMessage("preview") + " " + utils.shortCategoryName(category.split("preview-")[1]));
// There is a title now // There is a title now
tooltip.classList.remove("ytp-tooltip-text-no-title"); tooltip.classList.remove("ytp-tooltip-text-no-title");

View File

@@ -237,7 +237,7 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
let setButton = element.querySelector(".text-change-set"); let setButton = element.querySelector(".text-change-set");
setButton.addEventListener("click", async function(e) { setButton.addEventListener("click", async function(e) {
if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http") || textBox.value.includes(":")) { if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http")) {
alert(chrome.i18n.getMessage("addInvidiousInstanceError")); alert(chrome.i18n.getMessage("addInvidiousInstanceError"));
} else { } else {
// Add this // Add this
@@ -298,19 +298,23 @@ function invidiousInit(checkbox: HTMLInputElement, option: string) {
* @param checkbox * @param checkbox
* @param option * @param option
*/ */
function invidiousOnClick(checkbox: HTMLInputElement, option: string) { async function invidiousOnClick(checkbox: HTMLInputElement, option: string) {
if (checkbox.checked) { return new Promise((resolve) => {
utils.setupExtraSitePermissions(function (granted) { if (checkbox.checked) {
if (!granted) { utils.setupExtraSitePermissions(function (granted) {
Config.config[option] = false; if (!granted) {
checkbox.checked = false; Config.config[option] = false;
} else { checkbox.checked = false;
checkbox.checked = true; } else {
} checkbox.checked = true;
}); }
} else {
utils.removeExtraSiteRegistration(); resolve();
} });
} else {
utils.removeExtraSiteRegistration();
}
});
} }
/** /**
@@ -358,15 +362,6 @@ function keybindKeyPressed(element: HTMLElement, e: KeyboardEvent) {
let button: HTMLElement = element.querySelector(".trigger-button"); let button: HTMLElement = element.querySelector(".trigger-button");
let option = element.getAttribute("sync-option"); let option = element.getAttribute("sync-option");
// Don't allow keys which are already listened for by youtube
let restrictedKeys = "1234567890,.jklftcibmJKLFTCIBMNP/<> -+";
if (restrictedKeys.indexOf(key) !== -1 ) {
closeKeybindOption(element, button);
alert(chrome.i18n.getMessage("theKey") + " " + key + " " + chrome.i18n.getMessage("keyAlreadyUsedByYouTube"));
return;
}
// Make sure keybind isn't used by the other listener // Make sure keybind isn't used by the other listener
// TODO: If other keybindings are going to be added, we need a better way to find the other keys used. // TODO: If other keybindings are going to be added, we need a better way to find the other keys used.
let otherKeybind = (option === "startSponsorKeybind") ? Config.config['submitKeybind'] : Config.config['startSponsorKeybind']; let otherKeybind = (option === "startSponsorKeybind") ? Config.config['submitKeybind'] : Config.config['startSponsorKeybind'];
@@ -435,8 +430,8 @@ function activatePrivateTextChange(element: HTMLElement) {
case "*": case "*":
let jsonData = JSON.parse(JSON.stringify(Config.localConfig)); let jsonData = JSON.parse(JSON.stringify(Config.localConfig));
// Fix sponsorTimes data as it is destroyed from the JSON stringify // Fix segmentTimes data as it is destroyed from the JSON stringify
jsonData.sponsorTimes = Config.encodeStoredItem(Config.localConfig.sponsorTimes); jsonData.segmentTimes = Config.encodeStoredItem(Config.localConfig.segmentTimes);
result = JSON.stringify(jsonData); result = JSON.stringify(jsonData);
break; break;
@@ -445,7 +440,7 @@ function activatePrivateTextChange(element: HTMLElement) {
textBox.value = result; textBox.value = result;
let setButton = element.querySelector(".text-change-set"); let setButton = element.querySelector(".text-change-set");
setButton.addEventListener("click", () => { setButton.addEventListener("click", async () => {
let confirmMessage = element.getAttribute("confirm-message"); let confirmMessage = element.getAttribute("confirm-message");
if (confirmMessage === null || confirm(chrome.i18n.getMessage(confirmMessage))) { if (confirmMessage === null || confirm(chrome.i18n.getMessage(confirmMessage))) {
@@ -460,15 +455,14 @@ function activatePrivateTextChange(element: HTMLElement) {
} }
Config.convertJSON(); Config.convertJSON();
// Reload options on page
init();
if (newConfig.supportInvidious) { if (newConfig.supportInvidious) {
let checkbox = <HTMLInputElement> document.querySelector("#support-invidious > label > label > input"); let checkbox = <HTMLInputElement> document.querySelector("#support-invidious > label > label > input");
checkbox.checked = true; checkbox.checked = true;
invidiousOnClick(checkbox, "supportInvidious"); await invidiousOnClick(checkbox, "supportInvidious");
} }
window.location.reload();
} catch (e) { } catch (e) {
alert(chrome.i18n.getMessage("incorrectlyFormattedOptions")); alert(chrome.i18n.getMessage("incorrectlyFormattedOptions"));
@@ -519,8 +513,8 @@ function copyDebugOutputToClipboard() {
config: JSON.parse(JSON.stringify(Config.localConfig)) // Deep clone config object config: JSON.parse(JSON.stringify(Config.localConfig)) // Deep clone config object
}; };
// Fix sponsorTimes data as it is destroyed from the JSON stringify // Fix segmentTimes data as it is destroyed from the JSON stringify
output.config.sponsorTimes = Config.encodeStoredItem(Config.localConfig.sponsorTimes); output.config.segmentTimes = Config.encodeStoredItem(Config.localConfig.segmentTimes);
// Sanitise sensitive user config values // Sanitise sensitive user config values
delete output.config.userID; delete output.config.userID;

View File

@@ -119,7 +119,7 @@ async function runThePopup(messageListener?: MessageListener) {
let startTimeChosen = false; let startTimeChosen = false;
//the start and end time pairs (2d) //the start and end time pairs (2d)
let sponsorTimes = []; let sponsorTimes: SponsorTime[] = [];
//current video ID of this tab //current video ID of this tab
let currentVideoID = null; let currentVideoID = null;
@@ -252,9 +252,9 @@ async function runThePopup(messageListener?: MessageListener) {
} }
//load video times for this video //load video times for this video
let sponsorTimesStorage = Config.config.sponsorTimes.get(currentVideoID); let sponsorTimesStorage = Config.config.segmentTimes.get(currentVideoID);
if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) {
if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].segment.length < 2) {
startTimeChosen = true; startTimeChosen = true;
PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd"); PageElements.sponsorStart.innerHTML = chrome.i18n.getMessage("sponsorEnd");
} }
@@ -336,13 +336,17 @@ async function runThePopup(messageListener?: MessageListener) {
let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0);
if (sponsorTimes[sponsorTimesIndex] == undefined) { if (sponsorTimes[sponsorTimesIndex] == undefined) {
sponsorTimes[sponsorTimesIndex] = []; sponsorTimes[sponsorTimesIndex] = {
segment: [],
category: Config.config.defaultCategory,
UUID: null
};
} }
sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; sponsorTimes[sponsorTimesIndex].segment[startTimeChosen ? 1 : 0] = response.time;
let localStartTimeChosen = startTimeChosen; let localStartTimeChosen = startTimeChosen;
Config.config.sponsorTimes.set(currentVideoID, sponsorTimes); Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
//send a message to the client script //send a message to the client script
if (localStartTimeChosen) { if (localStartTimeChosen) {
@@ -528,7 +532,7 @@ async function runThePopup(messageListener?: MessageListener) {
} }
function previewSponsorTime(index) { function previewSponsorTime(index) {
let skipTime = sponsorTimes[index][0]; let skipTime = sponsorTimes[index].segment[0];
if (document.getElementById("startTimeMinutes" + index) != null) { if (document.getElementById("startTimeMinutes" + index) != null) {
//edit is currently open, use that time //edit is currently open, use that time
@@ -575,28 +579,28 @@ async function runThePopup(messageListener?: MessageListener) {
startTimeMinutes.id = "startTimeMinutes" + index; startTimeMinutes.id = "startTimeMinutes" + index;
startTimeMinutes.className = "sponsorTime popupElement"; startTimeMinutes.className = "sponsorTime popupElement";
startTimeMinutes.type = "text"; startTimeMinutes.type = "text";
startTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index][0])); startTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index].segment[0]));
startTimeMinutes.style.width = "45px"; startTimeMinutes.style.width = "45px";
let startTimeSeconds = document.createElement("input"); let startTimeSeconds = document.createElement("input");
startTimeSeconds.id = "startTimeSeconds" + index; startTimeSeconds.id = "startTimeSeconds" + index;
startTimeSeconds.className = "sponsorTime popupElement"; startTimeSeconds.className = "sponsorTime popupElement";
startTimeSeconds.type = "text"; startTimeSeconds.type = "text";
startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index].segment[0]);
startTimeSeconds.style.width = "60px"; startTimeSeconds.style.width = "60px";
let endTimeMinutes = document.createElement("input"); let endTimeMinutes = document.createElement("input");
endTimeMinutes.id = "endTimeMinutes" + index; endTimeMinutes.id = "endTimeMinutes" + index;
endTimeMinutes.className = "sponsorTime popupElement"; endTimeMinutes.className = "sponsorTime popupElement";
endTimeMinutes.type = "text"; endTimeMinutes.type = "text";
endTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index][1])); endTimeMinutes.value = String(getTimeInMinutes(sponsorTimes[index].segment[1]));
endTimeMinutes.style.width = "45px"; endTimeMinutes.style.width = "45px";
let endTimeSeconds = document.createElement("input"); let endTimeSeconds = document.createElement("input");
endTimeSeconds.id = "endTimeSeconds" + index; endTimeSeconds.id = "endTimeSeconds" + index;
endTimeSeconds.className = "sponsorTime popupElement"; endTimeSeconds.className = "sponsorTime popupElement";
endTimeSeconds.type = "text"; endTimeSeconds.type = "text";
endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index].segment[1]);
endTimeSeconds.style.width = "60px"; endTimeSeconds.style.width = "60px";
//the button to set the current time //the button to set the current time
@@ -668,11 +672,11 @@ async function runThePopup(messageListener?: MessageListener) {
} }
function saveSponsorTimeEdit(index, closeEditMode = true) { function saveSponsorTimeEdit(index, closeEditMode = true) {
sponsorTimes[index][0] = getSponsorTimeEditTimes("startTime", index); sponsorTimes[index].segment[0] = getSponsorTimeEditTimes("startTime", index);
sponsorTimes[index][1] = getSponsorTimeEditTimes("endTime", index); sponsorTimes[index].segment[1] = getSponsorTimeEditTimes("endTime", index);
//save this //save this
Config.config.sponsorTimes.set(currentVideoID, sponsorTimes); Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
messageHandler.query({ messageHandler.query({
active: true, active: true,
@@ -692,7 +696,7 @@ async function runThePopup(messageListener?: MessageListener) {
//deletes the sponsor time submitted at an index //deletes the sponsor time submitted at an index
function deleteSponsorTime(index) { function deleteSponsorTime(index) {
//if it is not a complete sponsor time //if it is not a complete sponsor time
if (sponsorTimes[index].length < 2) { if (sponsorTimes[index].segment.length < 2) {
messageHandler.query({ messageHandler.query({
active: true, active: true,
currentWindow: true currentWindow: true
@@ -710,7 +714,7 @@ async function runThePopup(messageListener?: MessageListener) {
sponsorTimes.splice(index, 1); sponsorTimes.splice(index, 1);
//save this //save this
Config.config.sponsorTimes.set(currentVideoID, sponsorTimes); Config.config.segmentTimes.set(currentVideoID, sponsorTimes);
//if they are all removed //if they are all removed
if (sponsorTimes.length == 0) { if (sponsorTimes.length == 0) {
@@ -780,7 +784,7 @@ async function runThePopup(messageListener?: MessageListener) {
//hides and shows the submit times button when needed //hides and shows the submit times button when needed
function showSubmitTimesIfNecessary() { function showSubmitTimesIfNecessary() {
//check if an end time has been specified for the latest sponsor time //check if an end time has been specified for the latest sponsor time
if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].segment.length > 1) {
//show submit times button //show submit times button
document.getElementById("submitTimesContainer").style.display = "unset"; document.getElementById("submitTimesContainer").style.display = "unset";
} else { } else {

View File

@@ -331,25 +331,35 @@ class Utils {
return seconds % 60; return seconds % 60;
} }
getFormattedTime(seconds: number, precise?: boolean) { getFormattedTime(seconds: number, precise?: boolean): string {
let minutes = Math.floor(seconds / 60); let hours = Math.floor(seconds / 60 / 60);
let secondsNum: number = seconds - minutes * 60; let minutes = Math.floor(seconds / 60) % 60;
let minutesDisplay = String(minutes);
let secondsNum = seconds % 60;
if (!precise) { if (!precise) {
secondsNum = Math.floor(secondsNum); secondsNum = Math.floor(secondsNum);
} }
let secondsDisplay: string = String(secondsNum.toFixed(3)); let secondsDisplay: string = String(precise ? secondsNum.toFixed(3) : secondsNum);
if (secondsNum < 10) { if (secondsNum < 10) {
//add a zero //add a zero
secondsDisplay = "0" + secondsDisplay; secondsDisplay = "0" + secondsDisplay;
} }
if (hours && minutes < 10) {
//add a zero
minutesDisplay = "0" + minutesDisplay;
}
let formatted = minutes + ":" + secondsDisplay; let formatted = (hours ? hours + ":" : "") + minutesDisplay + ":" + secondsDisplay;
return formatted; return formatted;
} }
shortCategoryName(categoryName: string): string {
return chrome.i18n.getMessage("category_" + categoryName + "_short") || chrome.i18n.getMessage("category_" + categoryName);
}
getRawSeconds(minutes: number, seconds: number): number { getRawSeconds(minutes: number, seconds: number): number {
return minutes * 60 + seconds; return minutes * 60 + seconds;
} }