Compare commits

...

149 Commits

Author SHA1 Message Date
Ajay
97aea1c268 Fix icon sizes 2022-05-31 13:12:01 -04:00
Ajay
b70f50e1a0 Fix skip notice width limiting 2022-05-31 03:06:48 -04:00
Ajay
4880227320 Fix blank skip notice title when unskipping 2022-05-31 02:58:36 -04:00
Ajay
dfa21068f4 Fix buttons being offset on guidelines notice 2022-05-31 02:55:44 -04:00
Ajay
fd75a33e50 Use full details instead of learn more 2022-05-31 02:55:32 -04:00
Ajay
1409c563e2 Add guidelines for all categories 2022-05-31 02:37:29 -04:00
Ajay
588c42d579 Add initial sponsor help page 2022-05-31 00:50:32 -04:00
Ajay
d7ff6aa6a2 Add user to channel id regex 2022-05-26 22:25:16 -04:00
Ajay
44266e508b Another fix for firefox addon icon 2022-05-26 15:56:21 -04:00
Ajay
c0f8f5e1d0 bump version 2022-05-25 14:16:45 -04:00
Ajay Ramachandran
e948e1e569 Merge pull request #1331 from mchangrh/updateDependencies
update dependencies & bump minimum node version
2022-05-25 00:01:10 -04:00
Ajay
5289e62d43 Use virtual time for determining whether to skip and increase skip buffer
Potentially fix recent issue with skips not triggering
2022-05-24 23:54:05 -04:00
Ajay
eda7aac5ef Add time to log messages 2022-05-24 23:31:43 -04:00
Michael C
d9f4ab0d04 specify jest as cjs, change eslintrc to .json 2022-05-24 21:23:05 -04:00
Michael C
2665327729 update dependencies & bump minimum node version (#1329)
- bump all dependences
- add github-actions reporter to jest
- convert (most) webpack configs to ESM
  - manifest.cjs cannot be converted since there is no native .json import until node 17
2022-05-24 21:14:36 -04:00
Ajay
4738c1897f bump version 2022-05-24 14:05:13 -04:00
Ajay
cfbb194a61 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-05-24 14:04:54 -04:00
Ajay
9ad21e8ea1 Fix channel id regex 2022-05-24 14:04:53 -04:00
Ajay Ramachandran
941fc2985d Merge pull request #1238 from AlecRust/fix-unused-vars-lint
Fix @typescript-eslint/no-unused-vars lint warnings
2022-05-24 13:17:27 -04:00
Ajay Ramachandran
e2da071761 bump version 2022-05-24 13:16:04 -04:00
Ajay Ramachandran
c20c9ac64a Merge pull request #1220 from tadwohlrapp/patch-1
Fix minor typos and inconsistencies
2022-05-24 13:12:20 -04:00
Ajay Ramachandran
2d59f3825c New translations messages.json (Swedish) (#1326) 2022-05-24 13:09:34 -04:00
Ajay Ramachandran
fb8b7a7d19 Merge pull request #1327 from Argn0/branch1
Add reset settings option
2022-05-24 12:56:50 -04:00
Ajay
d992cc7a3c Don't reset everything 2022-05-24 12:55:17 -04:00
Ajay
f8fecf5174 Remove redundant explanation 2022-05-24 12:50:39 -04:00
Argn0
3007cddce9 add reset settings option 2022-05-24 10:04:56 +02:00
Ajay
2b3c812f8a Some more debug logs 2022-05-23 21:41:35 -04:00
Ajay
61535fac95 Add more logging for catching skip issues 2022-05-23 01:14:46 -04:00
Ajay
4182595436 Don't stop skipping if channel id fetch fails 2022-05-21 16:54:02 -04:00
Ajay
97e30e4001 bump version 2022-05-20 04:19:20 -04:00
Ajay
6763fd3b4b Allow more channel IDs
Help with #753
2022-05-20 04:01:50 -04:00
Ajay
a39ec76340 Fix skip to highlight option on mobile 2022-05-19 19:28:26 -04:00
Ajay
f68282decc Add more verbose logging to hidden variable 2022-05-19 19:22:59 -04:00
Ajay
160de56a71 Fix icon on android firefox 2022-05-19 13:07:44 -04:00
Ajay
bd4fbcc93d bump version 2022-05-18 15:44:08 -04:00
Ajay
f1839eef94 Added another warning related to buffering 2022-05-18 15:43:51 -04:00
Ajay
3e3abf36e5 Fix unsafe navigation 2022-05-17 22:39:49 -04:00
Ajay
393861dcd3 bump version 2022-05-17 14:16:19 -04:00
Ajay Ramachandran
b5d6b2d3fd New Crowdin updates (#1309) 2022-05-17 14:16:04 -04:00
Ajay Ramachandran
a0c82dc734 Merge pull request #1315 from mchangrh/invidiousProgressBar
shortcut creating preview bar on invidious
2022-05-17 14:15:44 -04:00
Ajay
e4be99c3d7 Clean up isVisible shortcut 2022-05-17 14:11:07 -04:00
Michael C
3da6a57e42 shorcut creating preview bar on invidious 2022-05-17 14:10:57 -04:00
Ajay Ramachandran
7ce9442153 Merge pull request #1314 from mchangrh/mobileChapters
add selector for mobile YT chapters
2022-05-17 14:02:19 -04:00
Ajay
773da185ee Fix visual issues on mobile preview bar 2022-05-17 13:55:39 -04:00
Ajay
bf3dcd97b8 Fix time without skips 2022-05-17 13:50:30 -04:00
Ajay
793c16a21b Add warning messages to catch weird not skipping bug 2022-05-17 13:33:26 -04:00
Ajay
52dc697635 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-05-16 14:33:02 -04:00
Ajay
36689ed886 Don't use hide buttons for auto hiding skipt to highlight
Fixes #1318
2022-05-16 14:32:59 -04:00
Michael C
4d4689a190 add selector for mobile YT chapters #1287 2022-05-10 20:51:32 -04:00
Florian Wendelborn
78aaffb8d8 Add iOS info (#1307) 2022-05-07 01:08:25 -04:00
Ajay
b82e43bb93 bump version 2022-05-06 14:14:48 -04:00
Ajay
8eef3a3ce5 Revert "Refresh segments when submitting"
Fixes #1295
2022-05-06 14:11:11 -04:00
Ajay
063845d513 bump version 2022-05-05 09:03:55 -04:00
Ajay
7353a2ac0d Fix extra requests being made 2022-05-05 09:03:37 -04:00
Ajay Ramachandran
5e733fddad Merge pull request #1293 from AlecRust/consistent-vote-buttons
Fix vote button hover inconsistency
2022-05-03 20:03:02 -04:00
Ajay Ramachandran
5d48e87e0b New Crowdin updates (#1292) 2022-05-03 20:02:35 -04:00
Ajay Ramachandran
e86f5a1a59 bump version 2022-05-03 20:02:27 -04:00
Ajay
2d2bd36abb Add note about misleading name 2022-05-03 15:14:57 -04:00
Ajay
e72f3b1a12 Fix button not appearing when starting at a channel trailer 2022-05-03 14:53:26 -04:00
Ajay
fd260f4caa Fix old video ids potentially being fetched 2022-05-03 14:28:05 -04:00
github-actions[bot]
95696e23fe Update Invidious List (#1299)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2022-04-30 23:16:28 -04:00
Alec Rust
463ce258bf Fix @typescript-eslint/no-unused-vars lint warnings 2022-04-23 15:44:21 +01:00
Alec Rust
0bf8368686 Fix up vote button CSS 2022-04-23 14:51:52 +01:00
Ajay
0c216792cf Don't show duplicate skip notices 2022-04-23 00:10:46 -04:00
Ajay
dd447297f9 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-04-22 22:17:27 -04:00
Ajay
1a908b5038 Add tooltips to vote buttons in popup 2022-04-22 22:17:25 -04:00
Ajay Ramachandran
ba629e9c9e bump version 2022-04-22 15:43:20 -04:00
Ajay Ramachandran
fb11242dd5 New Crowdin updates (#1233) 2022-04-22 15:26:56 -04:00
Ajay Ramachandran
aa88ab1985 Merge pull request #1237 from AlecRust/refine-popup
Improve popup alert and fix Firefox issues
2022-04-22 15:26:30 -04:00
Ajay
b075116502 Make it show skip right away instead of unskip on mute segments
Fixes #1075
2022-04-22 15:18:58 -04:00
Ajay
9e02e35c4d Keep skip notice open for full duration of mute segments 2022-04-22 02:41:27 -04:00
Ajay
d7e67fb397 Add skip button to mute segment notices
Fixes #1075
2022-04-22 02:33:07 -04:00
Ajay
f2172bb2ad Don't show never show when already hidden 2022-04-21 21:33:22 -04:00
Ajay
c773b4ecd1 Enter unskip with skip notice hidden 2022-04-21 21:28:25 -04:00
Ajay Ramachandran
9bad5ed324 Merge pull request #1291 from mchangrh/userInfo-isVip
remove lastIsVipUpdate from config
2022-04-19 18:48:49 -04:00
Michael C
93bb016b4f remove lastIsVipUpdate from config 2022-04-19 18:45:48 -04:00
Ajay Ramachandran
8c901d5bad Merge pull request #1290 from mchangrh/userInfo-isVip
reuse userinfo for isVip and remove lastIsVipUpdate
2022-04-19 18:45:36 -04:00
Michael C
ac533c612c reuse userinfo for isVip and remove lastIsVipUpdate 2022-04-19 18:41:06 -04:00
Ajay Ramachandran
21e9dd870d Merge pull request #1284 from mini-bomba/segmentEditPreview-patch1
Start playback of edited segment at it's end when it starts 0:00
2022-04-19 13:42:58 -04:00
mini-bomba
e3f6242e5f Start playback of edited segment at it's end when it starts 0:00 2022-04-15 22:31:46 +02:00
Alec Rust
a47fa20652 Integrate new "beta server alert" into popup CSS 2022-04-15 16:20:48 +01:00
Alec Rust
fa0c890633 Disable popup max height when displayed in-page 2022-04-15 16:12:16 +01:00
Alec Rust
d7d12e1618 Set max height on popup
#778
2022-04-15 16:12:16 +01:00
Alec Rust
82bdc28305 Fix popup width issues in Firefox
fixes #778
2022-04-15 16:12:16 +01:00
Alec Rust
7c4f649016 Fix gutter when popup is very narrow 2022-04-15 16:12:15 +01:00
Alec Rust
d937a2ae59 Remove unnecessary flexbox usage 2022-04-15 16:12:15 +01:00
Alec Rust
d19fcd2a4c Fix spacing regression
closes #1235
2022-04-15 16:12:15 +01:00
Alec Rust
9b4c4afa35 Hide "consider force channel check" alert when removed from whitelist 2022-04-15 16:12:15 +01:00
Alec Rust
c5b00f67a1 Refine "consider force channel check" alert 2022-04-15 16:12:15 +01:00
Alec Rust
6f79e986ba Reduce "cursor: pointer" repetition and tidy 2022-04-15 16:12:15 +01:00
Ajay
8aa10605c5 Refresh segments when submitting 2022-04-12 10:35:25 -04:00
Ajay
44421c4b5d Refresh segments on config change 2022-04-12 10:29:44 -04:00
Ajay Ramachandran
fbbd6de0ff Merge pull request #1259 from mchangrh/bumpDependencies
bump dependencies
2022-04-11 01:31:06 -04:00
Ajay Ramachandran
c6e3d11071 Merge pull request #1276 from MRuy/beta-server-warning
Add beta server warning to popup
2022-04-11 01:28:52 -04:00
Ajay Ramachandran
ae7f1f228f fix toggle to always remove 2022-04-09 11:56:56 -04:00
Nanobyte
d353f3b677 Add beta server warning to popup
#1275
2022-04-09 16:22:39 +02:00
Ajay Ramachandran
42eceb3efd Merge pull request #1274 from ajayyy/dependabot/npm_and_yarn/moment-2.29.2
Bump moment from 2.29.1 to 2.29.2
2022-04-09 01:29:35 -04:00
dependabot[bot]
6f5586d656 Bump moment from 2.29.1 to 2.29.2
Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-09 04:42:15 +00:00
Ajay Ramachandran
9bea04dfc2 Merge pull request #1273 from mchangrh/miscFixes
Misc fixes
2022-04-08 23:39:34 -04:00
Michael C
0d34e643c7 fix #1236 2022-04-08 22:36:44 -04:00
Michael C
88f60c0e84 close #1265 2022-04-08 22:03:00 -04:00
Michael C
964a277331 adjust lint to ignore children props 2022-04-01 00:26:27 -04:00
Michael C
057c7792df bump dependencies + reduce build time by 1/3
- drop webpack to 5.64 to fix 1 security issue, the rest depend on web-ext
2022-03-31 23:02:55 -04:00
github-actions[bot]
bd6372d944 Update Invidious List 2022-03-31 20:32:07 -04:00
Ajay Ramachandran
0d31b8276c Merge pull request #1250 from zedseven/channel-id-lookup-optimisations
Improve the channel ID lookup.
2022-03-28 15:43:59 -04:00
Ajay
b15a8db651 Fix close skips not overlapping 2022-03-28 15:33:15 -04:00
Zacchary Dempsey-Plante
9f1f9f84d4 Improve the channel ID lookup. 2022-03-26 23:09:24 -04:00
Ajay Ramachandran
5d72498aac Merge pull request #1247 from ajayyy/dependabot/npm_and_yarn/minimist-1.2.6
Bump minimist from 1.2.5 to 1.2.6
2022-03-25 20:00:05 -04:00
dependabot[bot]
e8536fd404 Bump minimist from 1.2.5 to 1.2.6
Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6.
- [Release notes](https://github.com/substack/minimist/releases)
- [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6)

---
updated-dependencies:
- dependency-name: minimist
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-25 23:39:45 +00:00
Ajay Ramachandran
9489354357 Merge pull request #1242 from AlecRust/improve-readme
Improve "load in Firefox" docs
2022-03-22 22:10:11 -04:00
Ajay Ramachandran
940350504a different wording 2022-03-22 22:09:57 -04:00
Ajay
0e37ebd789 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-03-21 22:42:48 -04:00
Ajay
c66110a60f Increase tooltip zindex 2022-03-21 22:42:47 -04:00
Alec Rust
ac7f2eb5b1 Refine "load in Firefox" docs 2022-03-20 12:15:04 +00:00
Ajay Ramachandran
0cdbcfc97e Merge pull request #1228 from AlecRust/refine-popup
Fix popup width and improve close button
2022-03-18 19:29:56 -04:00
Ajay
821bbc969b bump version 2022-03-17 22:19:33 -04:00
Ajay
e20011ce08 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-03-17 22:19:22 -04:00
Ajay
e30bccd2b7 Don't use virtual time on firefox 2022-03-17 22:19:21 -04:00
Alec Rust
c0cfa3a683 Fix "You've saved" and "You've skipped" not being on separate lines
Screenshot: https://i.imgur.com/VqeXMmS.png
2022-03-17 17:53:33 +00:00
Alec Rust
f7510eea88 Improve close popup button 2022-03-17 17:50:06 +00:00
Alec Rust
24fc5e4370 Fix popup width when rendered in-page 2022-03-17 17:47:52 +00:00
Ajay Ramachandran
5b62e76a63 Merge pull request #1234 from molniya0207/patch-1
Fix guidelines link
2022-03-17 12:29:11 -04:00
Stopper
15c73d7940 Fix guidelines link 2022-03-17 22:24:00 +06:00
Ajay
36f0fccd9c Force css 2022-03-17 00:29:33 -04:00
Ajay
d4544a7c47 Fixes for safari 2022-03-17 00:27:36 -04:00
Ajay Ramachandran
d9f1ee9bb8 New Crowdin updates (#1225) 2022-03-16 22:14:42 -04:00
Ajay Ramachandran
5f4c4332be bump version 2022-03-16 22:14:14 -04:00
Ajay
1acda5fe0a Improve precision on chromium using predicted virtual time 2022-03-16 16:17:44 -04:00
Ajay
21d4f0487c Fix skip notice behind controls on mobile youtube
Fix #1229
2022-03-16 13:30:20 -04:00
Ajay
340127a7f3 Switch font back to arial 2022-03-16 12:30:35 -04:00
Ajay Ramachandran
38ab10a191 Merge pull request #1227 from AlecRust/details-element
Refactor segment expanding to use <details>
2022-03-12 15:54:17 -05:00
Alec Rust
ced30c711e Refactor segment expanding to use <details> 2022-03-12 12:03:33 +00:00
Ajay
6bb265939a bump version 2022-03-12 00:25:47 -05:00
Ajay Ramachandran
d495be18a3 Merge pull request #1189 from AlecRust/improve-popup
Add menu bar to popup
2022-03-12 00:24:46 -05:00
Ajay Ramachandran
476efff47b New Crowdin updates (#1207) 2022-03-12 00:24:26 -05:00
Ajay
dcbefb5457 More specific class name 2022-03-12 00:23:16 -05:00
Ajay Ramachandran
b167cecdce Merge pull request #1224 from mchangrh/5xx-no-cf
ignore body if cloudflare error found
2022-03-12 00:02:41 -05:00
Michael C
924c777736 ignore body if cloudflare error found 2022-03-11 23:52:30 -05:00
Ajay Ramachandran
405fb342f0 Merge pull request #1218 from MRuy/userinfo
Get user infos from userInfo api for popup
2022-03-10 10:24:11 -05:00
Ajay
c76f241b63 Formatting 2022-03-10 10:23:35 -05:00
Ajay
54013681ef Ask for specific values 2022-03-10 10:22:53 -05:00
Ajay Ramachandran
8e94a05fa9 Merge pull request #1222 from mchangrh/custom5xx
custom error handler for 5xx
2022-03-10 10:18:44 -05:00
Michael C
7c747e6566 custom error handler for 5xx 2022-03-10 02:31:19 -05:00
Tad Wohlrapp
a64deb2e18 Fix minor typos and inconsistencies 2022-03-08 19:57:09 +01:00
Nanobyte
effac2449a Get user infos from userInfo api for popup 2022-03-05 23:52:44 +01:00
github-actions[bot]
d02aab4ba3 Update Invidious List 2022-02-28 22:26:53 -05:00
Ajay
a1caf8fbdb Switch hotkeys to not use array 2022-02-27 20:17:19 -05:00
Alec Rust
a3734e050f Refactor away global styles 2022-02-24 19:37:00 +00:00
Alec Rust
5496b05c88 Add menu bar to popup 2022-02-24 19:37:00 +00:00
78 changed files with 12627 additions and 4673 deletions

View File

@@ -1,33 +0,0 @@
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
jest: true,
jasmine: true,
},
extends: [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended",
],
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 12,
sourceType: "module",
},
plugins: ["react", "@typescript-eslint"],
rules: {
// TODO: Remove warn rules when not needed anymore
"no-self-assign": "off",
"@typescript-eslint/no-empty-interface": "off",
},
settings: {
react: {
version: "detect",
},
},
};

33
.eslintrc.json Normal file
View File

@@ -0,0 +1,33 @@
{
"env": {
"browser": true,
"es2021": true,
"node": true,
"jest": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 12,
"sourceType": "module"
},
"plugins": ["react", "@typescript-eslint"],
"rules": {
"@typescript-eslint/no-unused-vars": "error",
"no-self-assign": "off",
"@typescript-eslint/no-empty-interface": "off",
"react/prop-types": [2, { "ignore": ["children"] }]
},
"settings": {
"react": {
"version": "detect"
}
}
}

View File

@@ -1,6 +1,6 @@
<p align="center">
<a href="https://sponsor.ajay.app"><img src="public/icons/LogoSponsorBlocker256px.png" alt="Logo"></img></a>
<br/>
<sub>Logo by <a href="https://github.com/munadikieh">@munadikieh</a></sub>
</p>
@@ -13,7 +13,7 @@
<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://github.com/ajayyy/SponsorBlock/wiki/Safari">Safari for MacOS</a> |
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Safari">Safari for MacOS and iOS</a> |
<a href="https://sponsor.ajay.app">Website</a> |
<a href="https://sponsor.ajay.app/stats">Stats</a>
</p>
@@ -72,7 +72,7 @@ You must have [Node.js 16](https://nodejs.org/) and npm installed.
- You can also run `npm run build` (for Chrome) or `npm run build:firefox` (for Firefox) to generate a production build.
4. The built extension is now in `dist/`. You can load it in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/#manifest) or in Firefox as a [temporary extension](https://developer.mozilla.org/en-US/docs/Tools/about:debugging#loading_a_temporary_extension).
4. The built extension is now in `dist/`. You can load this folder directly in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/#manifest), or convert it to a zip file to load it as a [temporary extension](https://developer.mozilla.org/en-US/docs/Tools/about:debugging#loading_a_temporary_extension) in Firefox.
### Developing with a clean profile and hot reloading

View File

@@ -1 +1 @@
["yewtu.be","invidious.snopyta.org","vid.puffyan.us","invidious.kavin.rocks","invidio.xamh.de","inv.riverside.rocks","invidious.osi.kr","inv.cthd.icu","yt.artemislena.eu","youtube.076.ne.jp","invidious.namazso.eu"]
["yewtu.be","vid.puffyan.us","invidious.snopyta.org","inv.riverside.rocks","invidious-us.kavin.rocks","invidious.osi.kr","tube.cthd.icu","invidious.flokinet.to","yt.artemislena.eu","invidious.mutahar.rocks","invidious.esmailelbob.xyz","youtube.076.ne.jp","invidious.weblibre.org","invidious.namazso.eu","invidious.kavin.rocks"]

View File

@@ -5,4 +5,5 @@ module.exports = {
"transform": {
"^.+\\.ts$": "ts-jest"
},
"reporters": ["github-actions"]
};

View File

@@ -1,7 +1,7 @@
{
"name": "__MSG_fullName__",
"short_name": "SponsorBlock",
"version": "4.1.5",
"version": "4.4.5",
"default_locale": "en",
"description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app",
@@ -34,6 +34,7 @@
"icons/settings.svg",
"icons/pencil.svg",
"icons/check.svg",
"icons/check-smaller.svg",
"icons/upvote.png",
"icons/downvote.png",
"icons/thumbs_down.svg",
@@ -50,6 +51,16 @@
"icons/heart.svg",
"icons/visible.svg",
"icons/not_visible.svg",
"icons/money.svg",
"icons/segway.png",
"icons/close-smaller.svg",
"icons/right-arrow.svg",
"icons/campaign.svg",
"icons/star.svg",
"icons/lightbulb.svg",
"icons/bolt.svg",
"icons/stopwatch.svg",
"icons/music-note.svg",
"icons/PlayerInfoIconSponsorBlocker.svg",
"icons/PlayerDeleteIconSponsorBlocker.svg",
"popup.html",
@@ -64,7 +75,35 @@
],
"browser_action": {
"default_title": "SponsorBlock",
"default_popup": "popup.html"
"default_popup": "popup.html",
"default_icon": {
"16": "icons/IconSponsorBlocker16px.png",
"32": "icons/IconSponsorBlocker32px.png",
"64": "icons/LogoSponsorBlocker64px.png",
"128": "icons/LogoSponsorBlocker128px.png"
},
"theme_icons": [
{
"light": "icons/IconSponsorBlocker16px.png",
"dark": "icons/IconSponsorBlocker16px.png",
"size": 16
},
{
"light": "icons/IconSponsorBlocker32px.png",
"dark": "icons/IconSponsorBlocker32px.png",
"size": 32
},
{
"light": "icons/LogoSponsorBlocker64px.png",
"dark": "icons/LogoSponsorBlocker64px.png",
"size": 64
},
{
"light": "icons/LogoSponsorBlocker128px.png",
"dark": "icons/LogoSponsorBlocker128px.png",
"size": 128
}
]
},
"background": {
"scripts":[

11762
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,37 +3,40 @@
"version": "1.0.0",
"description": "",
"main": "background.js",
"type": "module",
"dependencies": {
"react": "^17.0.2",
"react-dom": "^17.0.2"
},
"devDependencies": {
"@types/chrome": "^0.0.178",
"@types/chrome": "^0.0.188",
"@types/firefox-webext-browser": "^94.0.1",
"@types/jest": "^27.4.0",
"@types/jest": "^27.5.1",
"@types/react": "^17.0.43",
"@types/react-dom": "^17.0.14",
"@types/selenium-webdriver": "^4.1.0",
"@types/wicg-mediasession": "^1.1.3",
"@types/react": "^17.0.39",
"@types/react-dom": "^17.0.11",
"@types/selenium-webdriver": "^4.0.17",
"@typescript-eslint/eslint-plugin": "^5.10.2",
"@typescript-eslint/parser": "^5.10.2",
"chromedriver": "^97.0.4",
"concurrently": "^7.0.0",
"copy-webpack-plugin": "^10.2.4",
"eslint": "^8.8.0",
"eslint-plugin-react": "^7.28.0",
"jest": "^27.5.0",
"@typescript-eslint/eslint-plugin": "^5.26.0",
"@typescript-eslint/parser": "^5.26.0",
"chromedriver": "^101.0.0",
"concurrently": "^7.2.1",
"copy-webpack-plugin": "^11.0.0",
"eslint": "^8.16.0",
"eslint-plugin-react": "^7.30.0",
"fork-ts-checker-webpack-plugin": "^7.2.11",
"jest": "^28.1.0",
"rimraf": "^3.0.2",
"schema-utils": "^4.0.0",
"selenium-webdriver": "^4.1.1",
"ts-jest": "^27.1.3",
"ts-loader": "^9.2.6",
"ts-node": "^10.4.0",
"typescript": "4.5",
"web-ext": "^6.6.0",
"webpack": "^5.68.0",
"selenium-webdriver": "^4.1.2",
"speed-measure-webpack-plugin": "^1.5.0",
"ts-jest": "^28.0.3",
"ts-loader": "^9.3.0",
"ts-node": "^10.8.0",
"typescript": "4.7",
"web-ext": "^6.8.0",
"webpack": "^5.72.1",
"webpack-cli": "^4.9.2",
"webpack-merge": "^4.2.2"
"webpack-merge": "^5.8.0"
},
"scripts": {
"web-run": "npm run web-run:chrome",
@@ -63,21 +66,26 @@
"lint:fix": "eslint src --fix"
},
"engines": {
"node": ">=12.20.0"
"node": ">=16"
},
"funding": [{
"funding": [
{
"type": "individual",
"url": "hhttps://sponsor.ajay.app/donate"
}, {
},
{
"type": "github",
"url": "https://github.com/sponsors/ajayyy-org"
}, {
},
{
"type": "patreon",
"url": "https://www.patreon.com/ajayyy"
}, {
},
{
"type": "individual",
"url": "https://paypal.me/ajayyy"
}],
}
],
"repository": {
"type": "git",
"url": "git+https://github.com/ajayyy/SponsorBlock.git"

View File

@@ -104,7 +104,7 @@
"message": "حدث خطأ في الاتصال. رمز الخطأ: "
},
"clearTimes": {
"message": "مسح الأقسام"
"message": "مسح الأجزاء"
},
"openPopup": {
"message": "فتح نافذة سبونسر بلوك المنبثقة"
@@ -113,7 +113,7 @@
"message": "إغلاق النافذة المنبثقة"
},
"SubmitTimes": {
"message": "إرسال الأقسام"
"message": "إرسال الأجزاء"
},
"submitCheck": {
"message": "هل أنت متيقّن من إرسال هذا؟"
@@ -125,7 +125,7 @@
"message": "إزالة القناة من القائمة البيضاء"
},
"voteOnTime": {
"message": "صوّت لقسم"
"message": "صوّت لجزء"
},
"Submissions": {
"message": "المشاركات"
@@ -180,7 +180,7 @@
"message": "إخفاء الأزرار على مشغل اليوتيوب"
},
"hideButtonsDescription": {
"message": "هذا يخفي الأزرار التي تظهر على مشغل اليوتيوب لإرسال أقسام للتخطي."
"message": "هذا يخفي الأزرار التي تظهر على مشغل اليوتيوب لإرسال أجزاء للتخطي."
},
"showSkipButton": {
"message": "إبقاء زر \"تخطي للعنوان الرئيس\" على المشغّل"
@@ -200,6 +200,32 @@
"showDeleteButton": {
"message": "إظهار زر \"حذف\" على مشغّل اليوتيوب"
},
"showNotice": {
"message": "إظهار الإشعار مرة أخرى"
},
"website": {
"message": "موقع الويب",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "الشفرة المصدرية",
"description": "Used on Firefox Store Page"
},
"setSkipShortcut": {
"message": "تخطي الجزء",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "بدء/إيقاف الجزء",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "إرسال الأجزاء",
"description": "Keybind label"
},
"errorCode": {
"message": "رمز الخطأ: "
},
"skip": {
"message": "تخطي"
},
@@ -244,9 +270,102 @@
"minsLower": {
"message": "دقائق"
},
"hourLower": {
"message": "ساعة"
},
"hoursLower": {
"message": "ساعات"
},
"youHaveSavedTime": {
"message": "لقد وفّرت على الناس",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " من حياتهم",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"createdBy": {
"message": "أنشئت من قِبل"
},
"supportOtherSites": {
"message": "دعم مواقع يوتيوب الطرف الثالث"
},
"supportedSites": {
"message": "المواقع المدعومة: "
},
"add": {
"message": "أضِف"
},
"save": {
"message": "حفظ"
},
"reset": {
"message": "إعادة تعيين"
},
"exportOptionsCopy": {
"message": "تعديل/نسخ"
},
"exportOptionsDownload": {
"message": "حفظ إلى ملف"
},
"exportOptionsUpload": {
"message": "تحميل من ملف"
},
"submit": {
"message": "إرسال"
},
"cancel": {
"message": "إلغاء"
},
"delete": {
"message": "حذف"
},
"preview": {
"message": "معاينة"
},
"unsubmitted": {
"message": "غير مرسلة"
},
"inspect": {
"message": "فحص"
},
"edit": {
"message": "تعديل"
},
"to": {
"message": "إلى",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "الراعي"
},
"category_exclusive_access": {
"message": "وصول حصري"
},
"category_outro": {
"message": "الخاتمة/تترات النهاية"
},
"category_preview": {
"message": "معاينة/خلاصة"
},
"category_filler_short": {
"message": "حشو"
},
"category_music_offtopic": {
"message": "الموسيقى: مقطع غير موسيقي"
},
"category": {
"message": "الفئة"
},
"bracketNow": {
"message": "(الآن)"
},
"moreCategories": {
"message": "المزيد من الفئات"
},
"chooseACategory": {
"message": "اختر فئة"
},
"permissionRequestSuccess": {
"message": "نجح طلب الإذن!"
},
@@ -259,6 +378,9 @@
"incorrectCategory": {
"message": "تغيير الفئة"
},
"multipleSegments": {
"message": "أجزاء متعددة"
},
"guidelines": {
"message": "الإرشادات"
},

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Копиране на публичния UserID"
},
"copySegmentID": {
"message": "Копиране на идентификатора на сегмента"
},
"discordAdvert": {
"message": "Елате в официалния Discord сървър, за да давате предложения!"
},
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Това незабавно ще се приложи към вашите сегменти"
},
"downvote": {
"message": "Не одобрение"
},
"upvote": {
"message": "Одобрение"
},
"hideSegment": {
"message": "Скриване на сегмента"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Използвайте колелото на мишката, докато държите курсора върху полето за редактиране, за да коригирате бързо времето. Комбинации с клавиша ctrl или shift могат да се използват за фина настройка на промените."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Това е вградена клавишна комбинация в YouTube. Наистина ли искате да я използвате?"
},
"betaServerWarning": {
"message": "Сървърът BETA е активиран!"
},
"openOptionsPage": {
"message": "Отваряне на страницата с опции"
}
}

View File

@@ -3,7 +3,949 @@
"message": "ইউটিউবের জন্য স্পনসরব্লক - স্পনসরশিপ এড়িয়ে যান",
"description": "Name of the extension."
},
"Description": {
"message": "YouTube ভিডিওতে স্পনসরশিপ, সাবস্ক্রিপশন ভিক্ষা এবং আরও অনেক কিছু এড়িয়ে যান। অন্যদের সময় বাঁচাতে আপনার দেখা ভিডিওগুলিতে স্পনসরদের রিপোর্ট করুন।",
"description": "Description of the extension."
},
"400": {
"message": "সার্ভার বলেছে এই অনুরোধটি অবৈধ"
},
"429": {
"message": "আপনি এই একটি ভিডিওর জন্য অনেক বেশি স্পনসর জমা দিয়েছেন, আপনি কি নিশ্চিত যে এই একটি ভিডিওর জন্য অনেকগুলি স্পনসর আছে?"
},
"409": {
"message": "এটি আগেই জমা দেওয়া হয়েছে"
},
"channelWhitelisted": {
"message": "চ্যানেল সাদা তালিকাভুক্ত!"
},
"Segment": {
"message": "অংশ"
},
"Segments": {
"message": "অংশগুলো"
},
"upvoteButtonInfo": {
"message": "এই জমাটিকে সমর্থন করুন"
},
"reportButtonTitle": {
"message": "রিপোর্ট"
},
"reportButtonInfo": {
"message": "এই জমাটি ভুল হিসাবে রিপোর্ট করুন।"
},
"Dismiss": {
"message": "খারিজ করুন"
},
"Loading": {
"message": "লোড করা হচ্ছে..."
},
"Hide": {
"message": "কখনো দেখাবে না"
},
"hitGoBack": {
"message": "আপনি যেখান থেকে এসেছেন সেখানে যেতে আনস্কিপ টিপুন"
},
"unskip": {
"message": "বাদ দিন"
},
"reskip": {
"message": "বাদ দিন"
},
"unmute": {
"message": "সরব করুন"
},
"paused": {
"message": "বিরতি"
},
"manualPaused": {
"message": "টাইমার থেমেছে"
},
"confirmMSG": {
"message": "পৃথক মান সম্পাদনা করতে বা মুছতে, তথ্য বোতামে ক্লিক করুন বা উপরের ডানদিকের কোণায় এক্সটেনশন আইকনে ক্লিক করে এক্সটেনশন পপআপ খুলুন।"
},
"clearThis": {
"message": "আপনি কি পরিষ্কার করতে চান?"
},
"Unknown": {
"message": "আপনার স্পনসর জমা দেওয়ার সময় একটি ত্রুটি হয়েছে, অনুগ্রহ করে পরে আবার চেষ্টা করুন৷"
},
"sponsorFound": {
"message": "এই ভিডিওটি ডাটাবেসে সেগমেন্ট আছে!"
},
"sponsor404": {
"message": "কোনো সেগমেন্ট পাওয়া যায়নি"
},
"sponsorStart": {
"message": "অংশ এখন শুরু হয়"
},
"sponsorEnd": {
"message": "অংশ এখন শেষ হয়"
},
"sponsorCancel": {
"message": "সেগমেন্ট তৈরি করা বাতিল করুন"
},
"noVideoID": {
"message": "কোনো ইউটিউব ভিডিও পাওয়া যায়নি।\nযদি এটি ভুল হয়, ট্যাব রিফ্রেশ করুন।"
},
"refreshSegments": {
"message": "সেগমেন্ট রিফ্রেশ করুন"
},
"success": {
"message": "সফল!"
},
"voted": {
"message": "ভোট দিয়েছেন!"
},
"serverDown": {
"message": "মনে হচ্ছে সার্ভার ডাউন। অবিলম্বে বিকাশকারীর সাথে যোগাযোগ করুন।"
},
"connectionError": {
"message": "একটি সংযোগ ত্রুটি ঘটেছে. ভুল সংকেত: "
},
"clearTimes": {
"message": "বিভাগগুলি পরিষ্কার করুন"
},
"openPopup": {
"message": "স্পনসরব্লক পপআপ খুলুন"
},
"closePopup": {
"message": "পপআপ বন্ধ করুন"
},
"SubmitTimes": {
"message": "সেগমেন্ট জমা দিন"
},
"submitCheck": {
"message": "আপনি কি এটি জমা দেওয়ার বিষয়ে নিশ্চিত?"
},
"whitelistChannel": {
"message": "সাদা তালিকার চ্যানেল"
},
"removeFromWhitelist": {
"message": "সাদা তালিকা থেকে চ্যানেল সরান"
},
"voteOnTime": {
"message": "একটি বিভাগে ভোট দিন"
},
"Submissions": {
"message": "জমা"
},
"savedPeopleFrom": {
"message": "আপনি মানুষকে রক্ষা করেছেন "
},
"viewLeaderboard": {
"message": "শীর্ষতালিকা"
},
"recordTimesDescription": {
"message": "সাবমিট"
},
"submissionEditHint": {
"message": "আপনি জমা ক্লিক করার পরে বিভাগ সম্পাদনা প্রদর্শিত হবে",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "ইঙ্গিত: আপনি বিকল্পগুলিতে জমা দেওয়ার জন্য কীবাইন্ড সেটআপ করতে পারেন"
},
"clearTimesButton": {
"message": "সময় মুছুন"
},
"submitTimesButton": {
"message": "সময় জমা দিন"
},
"publicStats": {
"message": "আপনি কতটা অবদান রেখেছেন তা দেখানোর জন্য এটি সর্বজনীন পরিসংখ্যান পৃষ্ঠায় ব্যবহার করা হয়। এটা দেখ"
},
"Username": {
"message": "ব্যবহারকারীর নাম"
},
"setUsername": {
"message": "ব্যবহারকারীর নাম দিন"
},
"copyPublicID": {
"message": "পাবলিক ইউজার আইডি কপি করুন"
},
"copySegmentID": {
"message": "অংশের আইডি কপি করুন"
},
"discordAdvert": {
"message": "পরামর্শ এবং প্রতিক্রিয়া জানাতে অফিসিয়াল ডিসকর্ড সার্ভারে যোগ দিন!"
},
"hideThis": {
"message": "এই বিষয়বস্তু লুকান"
},
"Options": {
"message": "বিকল্পসমূহ"
},
"showButtons": {
"message": "ইউটিউব প্লেয়ারে বোতাম দেখান"
},
"hideButtons": {
"message": "ইউটিউব প্লেয়ারে বোতাম বাদ দিন"
},
"hideButtonsDescription": {
"message": "এটি স্কিপ সেগমেন্ট জমা দেওয়ার জন্য ইউটিউব প্লেয়ারে প্রদর্শিত বোতামগুলিকে লুকিয়ে রাখে।"
},
"showSkipButton": {
"message": "প্লেয়ারে বোতাম হাইলাইট করতে এড়িয়ে যান"
},
"showInfoButton": {
"message": "ইউটিউব প্লেয়ারে তথ্য বোতাম দেখান"
},
"hideInfoButton": {
"message": "ইউটিউব প্লেয়ারে তথ্য বোতাম লুকান"
},
"autoHideInfoButton": {
"message": "অটো-লুকান তথ্য বোতাম"
},
"hideDeleteButton": {
"message": "ইউটিউব প্লেয়ারে ডিলিট বোতাম লুকান"
},
"showDeleteButton": {
"message": "ইউটিউব প্লেয়ারে ডিলিট বোতাম দেখান"
},
"enableViewTracking": {
"message": "স্কিপ কাউন্ট ট্র্যাকিং সক্ষম করুন"
},
"whatViewTracking": {
"message": "এই বৈশিষ্ট্যটি ট্র্যাক করে যে আপনি কোন বিভাগগুলি এড়িয়ে গেছেন ব্যবহারকারীদের জানাতে যে তাদের জমা দেওয়া অন্যদের কতটা সাহায্য করেছে এবং স্প্যাম ডাটাবেসে প্রবেশ না করে তা নিশ্চিত করার জন্য আপভোট সহ একটি মেট্রিক হিসাবে ব্যবহার করা হয়েছে৷ আপনি যখনই একটি সেগমেন্ট এড়িয়ে যান তখন এক্সটেনশনটি সার্ভারে একটি বার্তা পাঠায়। আশা করি অধিকাংশ মানুষ এই সেটিং পরিবর্তন করবেন না যাতে ভিউ সংখ্যা সঠিক হয়। :)"
},
"enableViewTrackingInPrivate": {
"message": "ব্যক্তিগত/ছদ্মবেশী ট্যাবে গণনা ট্র্যাকিং এড়িয়ে যাওয়া সক্ষম করুন৷"
},
"enableTrackDownvotes": {
"message": "স্টোর সেগমেন্ট ডাউনভোট"
},
"whatTrackDownvotes": {
"message": "যেকোন ডাউনভোটকৃত অংশ রিফ্রেশ করার পরেও অদৃশ্য থাকবে"
},
"trackDownvotesWarning": {
"message": "সতর্কীকরণ: এটি বন্ধ করলে পূর্বে সংরক্ষিত সব ডাউনভোট মুছে যাবে"
},
"enableQueryByHashPrefix": {
"message": "হ্যাশের প্রিফিক্স দিয়ে খুজুন "
},
"whatQueryByHashPrefix": {
"message": "সার্ভার থেকে videoID দিয়ে অংশ অনুরোধ করার পরিবর্তে videoID এর হ্যাশ এর প্রথম অক্ষর পাঠানো হয়। এই সার্ভার সমতুল্য হ্যাশ এর সকল ভিডিও এর তথ্য ফেরত পাঠাবে।"
},
"enableRefetchWhenNotFound": {
"message": "নতুন ভিডিওতে আবার অংশটি যোগার করুন"
},
"whatRefetchWhenNotFound": {
"message": "যদি ভিডিওটি নতুন হয়, এবং কোন অংশ পাওয়া না যায়, আপনার দেখার সময় কয়েক মিনিট পর পরই এটি তথ্য আনতে থাকবে।"
},
"showNotice": {
"message": "নোটিশ পুনরায় প্রদর্শন করুন"
},
"showSkipNotice": {
"message": "একটি অংশ এড়ানোর পরে নোটিস প্রদর্শন করুন"
},
"noticeVisibilityMode0": {
"message": "পূর্ণ আকারের স্কিপ নোটিস"
},
"noticeVisibilityMode1": {
"message": "স্বয়ংক্রিয় স্কিপের জন্য ক্ষুদ্র আকারের স্কিপ নোটিস"
},
"noticeVisibilityMode2": {
"message": "সব ক্ষুদ্র আকারের স্কিপ নোটিস"
},
"noticeVisibilityMode3": {
"message": "স্বয়ংক্রিয় স্কিপের জন্য অনুজ্বল স্কিপ নোটিস"
},
"noticeVisibilityMode4": {
"message": "সব অনুজ্বল স্কিপ নোটিস"
},
"longDescription": {
"message": "SponsorBlock আপনাকে YouTube ভিডিওসমূহের স্পন্সর বার্তা, সূচনাবার্তা, সমাপ্তিবার্তা, সাবস্ক্রাইব করার জন্য স্মরণ করানো, এবং অন্যান্য বিবিধ বিরক্তিকর অংশ এড়িয়ে যেতে সাহায্য করে। SponsorBlock জনসংগৃহীত তথ্যসম্বলিত একটি ব্রাউজার এক্সটেনশন যা যে কাউকে একটি ভিডিওর স্পন্সর বার্তা এবং অন্যান্য অংশের শুরু এবং শেষ সময় সাবমিট করতে দেয়। যখন কেউ একজন এই তথ্য সাবমিট করে, এই এক্সটেনশন ব্যবহারকারী সবাই ঐ স্পন্সর বার্তা সম্বলিত অংশ এড়িয়ে যাবে। মিউজিক ভিডিও এর মিউজিক বহির্ভুত অংশও আপনি এড়িয়ে যেতে পারেন।",
"description": "Full description of the extension on the store pages."
},
"website": {
"message": "ওয়েবসাইট",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "সোর্স কোড",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "নোটিসটি আপগ্রেড করা হয়েছে!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "আপনি যদি এখনও এটি পছন্দ না করেন তবে কখনই দেখাবে না বোতামটি চাপুন।",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "সেগমেন্ট এড়িয়ে যান",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "সেগমেন্ট শুরু/শেষ",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "সেগমেন্ট জমা দিন",
"description": "Keybind label"
},
"keybindDescription": {
"message": "এটি টাইপ করে একটি কী নির্বাচন করুন এবং আপনি যে কোনও সংশোধক কীগুলি ব্যবহার করতে চান তা চয়ন করুন।"
},
"0": {
"message": "সংযোগের সময়সীমা অতিক্রান্ত। আপনার ইন্টারনেট সংযোগ যাচাই করুন. যদি আপনার ইন্টারনেট কাজ করে থাকে তবে সার্ভারটি সম্ভবত ওভারলোডেড বা ডাউন।"
},
"disableSkipping": {
"message": "স্কিপিং চালু করা হয়েছে"
},
"enableSkipping": {
"message": "স্কিপিং বন্ধ করা হয়েছে"
},
"yourWork": {
"message": "আপনার কাজ",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "সার্ভারটি সম্ভবত ওভারলোডেড। কয়েক সেকেন্ডের মধ্যে আবার চেষ্টা করুন।"
},
"errorCode": {
"message": "ইরোর কোডঃ "
},
"skip": {
"message": "এড়িয়ে যান"
},
"mute": {
"message": "নিঃশব্দ করুন"
},
"full": {
"message": "সমপূর্ণ ভিডিও",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "{0} এড়িয়ে যান?"
},
"mute_category": {
"message": "{0} নিঃশব্দ করুন?"
},
"skip_to_category": {
"message": "{0} তে চলে যান?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} এড়িয়ে যাওয়া হয়েছে",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} নিঃশব্দ করা হয়েছে",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "{0} তে চলে যাওয়া হয়েছে",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "স্বয়ংক্রিয়ভাবে স্কিপ করা বন্ধ করুন"
},
"enableAutoSkip": {
"message": "স্বয়ংক্রিয়ভাবে স্কিপ করা চালু করুন"
},
"audioNotification": {
"message": "স্কিপের জন্য অডিও নোটিস"
},
"audioNotificationDescription": {
"message": "যখনই কোনও অংশ এড়িয়ে যাওয়া হয় তখন একটি শব্দ বাজাবে। যদি বন্ধ করা হয় (বা অটো স্কিপ বন্ধ থাকে) তবে কোনও শব্দ বাজানো হবে না।"
},
"showTimeWithSkips": {
"message": "স্কিপগুলি সরানো সহ সময় দেখান"
},
"showTimeWithSkipsDescription": {
"message": "এই সময়টি সময় বারের নীচে বর্তমান সময়ের পাশের বন্ধনীগুলিতে উপস্থিত হয়। এটি মোট ভিডিও সময়কাল যে কোনও বিভাগকে বিয়োগ করে তা দেখায়। এর মধ্যে কেবল \"সময় বার এ দেখান\" হিসাবে চিহ্নিত বিভাগগুলি অন্তর্ভুক্ত রয়েছে।"
},
"youHaveSkipped": {
"message": "আপনি এড়িয়েছেন "
},
"minLower": {
"message": "মিনিট"
},
"minsLower": {
"message": "মিনিট"
},
"hourLower": {
"message": "ঘন্টা"
},
"hoursLower": {
"message": "ঘন্টা"
},
"youHaveSavedTime": {
"message": "আপনি মানুষকে রক্ষা করেছেন",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": "তাদের জীবন থেকে",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।"
},
"changeUserID": {
"message": "আপনার ইউজার আইডি ইম্পোর্ট/এক্সপোর্ট করুন"
},
"whatChangeUserID": {
"message": "এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।"
},
"setUserID": {
"message": "ইউজার আইডি দিন"
},
"userIDChangeWarning": {
"message": "সতর্কতা: ইউজারআইডি পরিবর্তন করা চিরস্থায়ী। আপনি কি নিশ্চিত যে আপনি এটি করতে চান? আপনার পুরানোটিকে সাবধানতার সার্থে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন।"
},
"createdBy": {
"message": "সৃষ্টি করেছেন"
},
"supportOtherSites": {
"message": "এটি ৩য় পক্ষের ইউটইউব সাইট সাপোর্ট করে"
},
"supportOtherSitesDescription": {
"message": "তৃতীয় পক্ষের ইউটিউব ক্লায়েন্টদের সমর্থন করুন। সমর্থন সক্ষম করতে, আপনাকে অবশ্যই অতিরিক্ত অনুমতিগুলি গ্রহণ করতে হবে। এটি ক্রোম এবং অন্যান্য ক্রোমিয়াম ভেরিয়েন্টগুলিতে ছদ্মবেশে কাজ করে না।",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "সমর্থিত সাইটসমুহ:"
},
"optionsInfo": {
"message": "Indivious সমর্থন সক্ষম করুন, অটোস্কিপ বন্ধ করুন, বোতামগুলি লুকান এবং আরও অনেক কিছু করুন।"
},
"addInvidiousInstance": {
"message": "তৃতীয় পক্ষের ক্লায়েন্ট যুক্ত করুন"
},
"addInvidiousInstanceDescription": {
"message": "একটি কাস্টম উদাহরণ যুক্ত করুন। এটি অবশ্যই ডোমেন দিয়ে ফর্ম্যাট করা উচিত। উদাহরণ: invidious.ajay.app"
},
"add": {
"message": "যোগ করুন"
},
"addInvidiousInstanceError": {
"message": "এটি একটি অবৈধ ডোমেন। এটিতে কেবল ডোমেন অংশ অন্তর্ভুক্ত করা উচিত। উদাহরণ: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Invidious Instance এর তালিকা পুনরায় সেট করুন"
},
"resetInvidiousInstanceAlert": {
"message": "আপনি এখন Invidious Instance এর তালিকা পুনরায় আগের মত করে দিবেন"
},
"currentInstances": {
"message": "বর্তমান Instance এর তালিকা"
},
"minDuration": {
"message": "সর্বনিম্ন দৈর্ঘ্য (সেকেন্ড):"
},
"minDurationDescription": {
"message": "সেট করা মান (সেকেন্ডে) থেকে ছোট সেগমেন্টগুলি প্লেয়ারে এড়িয়ে যাওয়া হবে বা দেখানো হবে না"
},
"skipNoticeDuration": {
"message": "নোটিশ প্রদর্শন করার দৈর্ঘ্য (সেকেন্ড):"
},
"skipNoticeDurationDescription": {
"message": "স্কিপ নোটিশটি কমপক্ষে এত সেকেন্ডের জন্য স্ক্রিনে থাকবে। নিজে এড়িয়ে যাওয়ার জন্য, এটি দীর্ঘকাল ধরে দৃশ্যমান হতে পারে।"
},
"shortCheck": {
"message": "নিম্নলিখিত সাবমিশনটি আপনার ন্যূনতম সময়কাল অপশনের চেয়ে কম। এর মানে এই হতে পারে যে এটি ইতিমধ্যে জমা দেওয়া হয়েছে, এবং এই অপশনের কারণে উপেক্ষা করা হচ্ছে। আপনি কি জমা দিতে চান?"
},
"liveOrPremiere": {
"message": "একটি সক্রিয় লাইভস্ট্রিম বা প্রিমিয়ারে জমা দেওয়ার অনুমতি নেই। এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন, তারপরে পৃষ্ঠাটি রিফ্রেশ করুন এবং অংশগুলি এখনও বৈধ কিনা তা যাচাই করুন।"
},
"showUploadButton": {
"message": "আপলোড করার বোতামটি দেখান"
},
"customServerAddress": {
"message": "স্পনসরব্লক সার্ভার ঠিকানা"
},
"customServerAddressDescription": {
"message": "এ ঠিকানা SponsorBlock সার্ভারে সাথে যোগাযোগ করতে ব্যবহার করে।\nআপনার নিজের সার্ভার না থাকলে এটি পরিবর্তন করবেন না।"
},
"save": {
"message": "সংরক্ষণ করুন"
},
"reset": {
"message": "পুনরায় সেট করুন"
},
"customAddressError": {
"message": "এই ঠিকানাটি সঠিক আকারে নেই। এটিতে http: // বা https: // শুরুতে এবং কোনও পিছনের স্ল্যাশ নেই তা নিশ্চিত করুন।"
},
"areYouSureReset": {
"message": "আপনি কি নিশ্চিতভাবে এটি মুছে ফেলতে চান??"
},
"mobileUpdateInfo": {
"message": "m.youtube.com এখন সাপর্টেড"
},
"exportOptions": {
"message": "সব অপশন ইম্পোর্ট/এক্সপোর্ট করুন"
},
"exportOptionsCopy": {
"message": "সম্পাদন/কপি করুন"
},
"exportOptionsDownload": {
"message": "ফাইল এ সেভ করুন"
},
"exportOptionsUpload": {
"message": "ফাইল থেকে লোড করুন"
},
"whatExportOptions": {
"message": "এটি আপনার সম্পূর্ণ কনফিগারেশন এতে আপনার ইউজারআইডি অন্তর্ভুক্ত রয়েছে, তাই বিজ্ঞতার সাথে শেয়ার করতে ভুলবেন না।."
},
"setOptions": {
"message": "অপশন সেট করুন"
},
"exportOptionsWarning": {
"message": "সতর্কতা: অপশনগুলি পরিবর্তন করা চিরস্থায়ী এবং আপনার ইনস্টলটি ভাঙতে পারে। আপনি কি নিশ্চিত যে আপনি এটি করতে চান? আপনার পুরানোটিকে সাবধানতার সার্থে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন।"
},
"incorrectlyFormattedOptions": {
"message": "এই JSON সঠিকভাবে ফর্ম্যাট করা হয় নাই। আপনার অপশনগুলি পরিবর্তন করা হয়নি।"
},
"confirmNoticeTitle": {
"message": "অংশ জমা দিন"
},
"submit": {
"message": "জমা দিন"
},
"cancel": {
"message": "বাতিল করুন"
},
"delete": {
"message": "মুছে ফেলুন"
},
"preview": {
"message": "প্রিভিউ দেখুন"
},
"unsubmitted": {
"message": "জমাকৃত নয়"
},
"inspect": {
"message": "পরিদর্শন করুন"
},
"edit": {
"message": "সম্পাদন করুন"
},
"copyDebugInformation": {
"message": "ডিবাগ তথ্য ক্লিপবোর্ডে কপি করুন"
},
"copyDebugInformationFailed": {
"message": "ক্লিপবোর্ডে কপি করা যায় নি"
},
"copyDebugInformationOptions": {
"message": " কোনও বাগ উত্থাপন করার সময় / যখন কোনও ডেভেলপার এটির জন্য অনুরোধ করে তখন ক্লিপবোর্ডে তথ্য কপি করে। সংবেদনশীল তথ্য যেমন আপনার ইউজার আইডি, সাদা তালিকাভুক্ত চ্যানেল এবং কাস্টম সার্ভারের ঠিকানা সরানো হয়েছে। তবে এটিতে আপনার ব্যবহারকারীর, ব্রাউজার, অপারেটিং সিস্টেম এবং এক্সটেনশন সংস্করণ নম্বরের মতো তথ্য রয়েছে।"
},
"copyDebugInformationComplete": {
"message": "ডিবাগের তথ্য ক্লিপ বোর্ডে কপি করা হয়েছে। আপনি কোনও তথ্য দিতে অনিচ্ছুক হলে তা নির্দ্বিধায় অপসারণ করতে পারেন। এটি একটি টেক্সট ফাইলে সংরক্ষণ করুন বা বাগ প্রতিবেদনে পেস্ট করুন।"
},
"keyAlreadyUsed": {
"message": "এই শর্টকাটটি অন্য ক্রিয়ায় আবদ্ধ। দয়া করে একটি আলাদা নির্বাচন করুন।"
},
"to": {
"message": "থেকে",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "স্পন্সর"
},
"category_sponsor_description": {
"message": "পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।"
},
"category_selfpromo": {
"message": "বিনা অর্থপ্রাপ্ত/স্ব-প্রচার"
},
"category_selfpromo_description": {
"message": "অবৈতনিক বা স্ব -প্রচার ব্যতীত \"স্পনসর\" এর মতো। এর মধ্যে পণ্যদ্রব্য, অনুদান বা তারা কার সাথে সহযোগিতা করেছে সে সম্পর্কে তথ্য অন্তর্ভুক্ত রয়েছে।"
},
"category_exclusive_access": {
"message": "এক্সক্লুসিভ অ্যাক্সেস"
},
"category_exclusive_access_description": {
"message": "শুধুমাত্র পুরো ভিডিও লেবেল করার জন্য। যখন কোনও ভিডিও কোনও পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে।"
},
"category_exclusive_access_pill": {
"message": "এই ভিডিওটি এমন একটি পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে",
"description": "Short description for this category"
},
"category_interaction": {
"message": "ইন্টারঅ্যাকশন রেমাইন্ডার (সাবস্ক্রাইব)"
},
"category_interaction_description": {
"message": "যখন সামগ্রীর মাঝখানে তাদেরকে লাইক, সাবস্ক্রাইব বা ফলো করার জন্য একটি সংক্ষিপ্ত অনুস্মারক থাকে। যদি এটি দীর্ঘ বা নির্দিষ্ট কিছু সম্পর্কে হয় তবে পরিবর্তে এটি স্ব -প্রচারের অধীনে থাকা উচিত।"
},
"category_interaction_short": {
"message": "ইন্টারঅ্যাকশন রেমাইন্ডার"
},
"category_intro": {
"message": "ইন্টারমিশন/ইন্ট্র অ্যানিমেশন"
},
"category_intro_description": {
"message": "প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয়।"
},
"category_intro_short": {
"message": "ইন্টারমিশন"
},
"category_outro": {
"message": "এন্ডকার্ডস/ক্রেডিট"
},
"category_outro_description": {
"message": "ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয়।"
},
"category_preview": {
"message": "প্রিভিউ/রিক্যাপ"
},
"category_preview_description": {
"message": "পূর্ববর্তী পর্বগুলির দ্রুত পুনরুদ্ধার, বা বর্তমান ভিডিওতে পরে কী ঘটছে তার পূর্বরূপ। একসাথে সম্পাদিত ক্লিপ এর জন্য, কথ্য সংক্ষিপ্তসার এর জন্য নয়।"
},
"category_filler": {
"message": "ফিলার ট্যানজেন্ট/জোকস"
},
"category_filler_description": {
"message": "স্পর্শকাতর দৃশ্য যেগুলি কেবল ফিলার বা হাস্যরসের জন্য যুক্ত হয়েছে যা ভিডিওর মূল বিষয়বস্তু বোঝার জন্য প্রয়োজন হয় না। এর মধ্যে প্রসঙ্গ বা পটভূমির বিশদ সরবরাহকারী বিভাগগুলি অন্তর্ভুক্ত করা উচিত নয়।"
},
"category_filler_short": {
"message": "ফিলার"
},
"category_music_offtopic": {
"message": "সঙ্গীত: অসঙ্গীত বিভাগ"
},
"category_music_offtopic_description": {
"message": "শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়।"
},
"category_music_offtopic_short": {
"message": "মিউসিক নয়"
},
"category_poi_highlight": {
"message": "গুরুত্বপূর্ণ"
},
"category_poi_highlight_description": {
"message": "ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।"
},
"category_livestream_messages": {
"message": "লাইভস্ট্রিম: অনুদান/বার্তা পাঠ"
},
"category_livestream_messages_short": {
"message": "বার্তা পাঠ"
},
"autoSkip": {
"message": "স্বয়ংক্রিয়ভাবে এড়িয়ে যান"
},
"manualSkip": {
"message": "নিজে এড়িয়ে যান"
},
"showOverlay": {
"message": "সময় বার এ দেখান"
},
"disable": {
"message": "নিষ্ক্রিয় করুন"
},
"autoSkip_POI": {
"message": "স্বয়ংক্রিয় ভাবে শুরুতে স্কিপ করুন"
},
"manualSkip_POI": {
"message": "ভিডিও লোড হলে জিজ্ঞেস করুন"
},
"showOverlay_POI": {
"message": "সময় বার এ দেখান"
},
"showOverlay_full": {
"message": "লেবেল দেখান"
},
"autoSkipOnMusicVideos": {
"message": "যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান"
},
"muteSegments": {
"message": "স্কিপের পরিবর্তে অডিও নিঃশব্দ এমন বিভাগগুলিকে দেখানোর অনুমতি দিন"
},
"fullVideoSegments": {
"message": "যখন কোনও ভিডিও সম্পূর্ণ বিজ্ঞাপন হয় তখন একটি আইকন দেখান",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
},
"previewColor": {
"message": "জমাকৃত নয় এমন অংশের রঙ",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "সময় বারের রঙ"
},
"category": {
"message": "বিভাগ"
},
"skipOption": {
"message": "সেগমেন্ট এড়িয়ে যাওয়ার অপশন",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "বিটা টেস্টিং প্রোগ্রামে যোগদান করুন"
},
"whatEnableTestingServer": {
"message": "আপনার জমাকৃত অংশ এবং ভোটগুলি মূল সার্ভারের হিসাবে গণনা করা হবে না। কেবল পরীক্ষার জন্য এটি ব্যবহার করুন।"
},
"testingServerWarning": {
"message": "সমস্ত জমাকৃত অংশ এবং ভোট টেস্ট সার্ভারের সাথে সংযোগ করার সময় মূল সার্ভারের হিসাবে গণনা করা হবেনা। আপনি যখন সত্যিকারের অংশ ও ভোট জমা দিতে চান তখন এটি বন্ধ করার বিষয়টি নিশ্চিত করুন।"
},
"bracketNow": {
"message": "(এখন)"
},
"moreCategories": {
"message": "আরো বিভাগ"
},
"chooseACategory": {
"message": "বিভাগ নির্বাচন করুন"
},
"enableThisCategoryFirst": {
"message": "\"{0}\" বিভাগের অন্তর্ভুক্ত অংশ জমা দিতে, আপনাকে এটি অপশন এ গিয়ে চালু করতে হবে। আপনাকে এখন অপশন এ পাঠানো হবে।",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "সতর্কতা: এই ধরণের বিভাগে একসময়ে সর্বাধিক একবার সক্রিয় থাকতে পারে। একাধিক জমা দেওয়া হলে যেকোন একটি এলোমেলোভাবে বেছে সেটি দেখানো হবে।"
},
"youMustSelectACategory": {
"message": "আপনাকে প্রত্যেকটি অংশের জন্য কমপক্ষে একটি করে ক্যাটাগরি সিলেক্ট করতে হবে!"
},
"bracketEnd": {
"message": "(শেষ)"
},
"hiddenDueToDownvote": {
"message": "লুক্কায়িতঃ ডাউনভোট"
},
"hiddenDueToDuration": {
"message": "লুক্কায়িতঃ খুব ছোট"
},
"manuallyHidden": {
"message": "নিজে লুক্কায়িত"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "চ্যানেল আইডি এখনও লোড হয় না। আপনি যদি এম্বেডে থাকা ভিডিও দেখছেন তবে পরিবর্তে ইউটিউব হোমপেজটি ব্যবহার করার চেষ্টা করুন। এটি ইউটিউব লেআউটে পরিবর্তনের কারণেও হতে পারে, আপনার যদি মনেহয় এটি লেআউটে পরিবর্তনের কারণে হয়েছে তাহলে এখানে একটি মন্তব্য করুনঃ "
},
"videoInfoFetchFailed": {
"message": "দেখে মনে হচ্ছে যে কোনও কিছু স্পনসরব্লকের ভিডিওর ডেটা পাওয়ার ক্ষমতা অবরুদ্ধ করছে। আরও তথ্যের জন্য দয়া করে https://github.com/ajayy/sponsorblock/issues/741 দেখুন।"
},
"youtubePermissionRequest": {
"message": "দেখে মনে হচ্ছে স্পনসরব্লক YouTube API তে পৌঁছাতে অক্ষম। এটি ঠিক করতে, এরপর উপস্থিত হবে সেই অনুমতি প্রম্পটটি গ্রহণ করবেন, তারপর কয়েক সেকেন্ড অপেক্ষা করে পৃষ্ঠাটি পুনরায় লোড করুন।"
},
"acceptPermission": {
"message": "অনুমতি একসেপ্ট করুন"
},
"permissionRequestSuccess": {
"message": "অনুমতির অনুরোধ সফল হয়েছে!"
},
"permissionRequestFailed": {
"message": "অনুমতির অনুরোধ ব্যর্থ হয়েছে, আপনি কি ডেনাই ক্লিক করেছেন?"
},
"adblockerIssueWhitelist": {
"message": "আপনি যদি এটি সমাধান করতে অক্ষম হন তবে সেটিংস এ গিয়ে 'এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন' বন্ধ করুন, কারণ স্পনসরব্লক এই ভিডিওটির জন্য চ্যানেলের তথ্য পুনরুদ্ধার করতে অক্ষম"
},
"forceChannelCheck": {
"message": "এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন"
},
"whatForceChannelCheck": {
"message": "সাধারণত, এটি চ্যানেলটি কী তা জানার আগেই এটি এখনই বিভাগগুলি এড়িয়ে যাবে। সাধারণত, ভিডিওর শুরুতে কিছু বিভাগগুলি সাদা তালিকাভুক্ত চ্যানেলগুলিতে এড়িয়ে যেতে পারে। এই বিকল্পটি সক্ষম করা এটিকে প্রতিরোধ করবে তবে চ্যানেলআইডি পেতে কিছুটা সময় নিতে পারে বলে সমস্ত এড়িয়ে যাওয়া কিছুটা বিলম্বিত করে। আপনার যদি দ্রুত ইন্টারনেট থাকে তবে এই বিলম্বটি অদৃশ্য হতে পারে।"
},
"forceChannelCheckPopup": {
"message": "\"এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন\" সেটিংস টি চালু করার বিষয়টি বিবেচনা করুন"
},
"downvoteDescription": {
"message": "সময় ভুল দেওয়া হয়েছে"
},
"incorrectCategory": {
"message": "বিভাগ পরিবর্তন করুন"
},
"nonMusicCategoryOnMusic": {
"message": "এই ভিডিওটি সংগীত হিসাবে শ্রেণীবদ্ধ করা হয়েছে। আপনি কি নিশ্চিত যে এটি একটি স্পনসর আছে? যদি এটি আসলে একটি \"অ-সংগীত বিভাগ\" হয় তবে এক্সটেনশন এর অপশন এ যান এবং এই বিভাগটি চালু করুন। তারপরে, আপনি এই বিভাগটিকে স্পনসর পরিবর্তে \"অ-সংগীত\" হিসাবে জমা দিতে পারেন। আপনি বিভ্রান্ত হলে দয়া করে নিয়মকানুনপড়ুন।"
},
"multipleSegments": {
"message": "অনেকগুলো অংশ"
},
"guidelines": {
"message": "নিয়মকানুন"
},
"readTheGuidelines": {
"message": "নিয়মকানুন পড়ুন!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "বিভাগ ফিচার এসেছে!"
},
"categoryUpdate2": {
"message": "ইন্ট্রোস, আউট্রোস, মার্চ ইত্যাদি এড়িয়ে যাওয়ার জন্য অপশন খুলুন।"
},
"help": {
"message": "সাহায্য"
},
"GotIt": {
"message": "বুঝেছি",
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "এই বিভাগটি বিশাল। যদি পুরো ভিডিওটি একটি বিষয় নিয়ে হয় তবে \"Skip\" থেকে \"Full Video\" এ পরিবর্তন করুন। আরও তথ্যের জন্য নিয়মকানুন দেখুন।"
},
"categoryPillTitleText": {
"message": "এই পুরো ভিডিওটি এই বিভাগ হিসাবে লেবেলযুক্ত এবং পৃথক করা সম্ভব না কারন এটি খুব ঘন ঘন সংযুক্ত করা হয়েছে"
},
"experiementOptOut": {
"message": "ভবিষ্যতের সমস্ত পরীক্ষা-নিরীক্ষা পাওয়া থেকে বিরত থাকুন",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "চিরকালের জন্য এই বিষয়বস্তু লুকান"
},
"warningChatInfo": {
"message": "আপনি একটি সতর্কতা পেয়েছেন এবং অস্থায়ীভাবে বিভাগগুলি জমা দিতে পারবেন না। এর অর্থ হ'ল আমরা লক্ষ্য করেছি যে আপনি কিছু সাধারণ ভুল করছেন যা দূষিত নয়, দয়া করে কেবল নিশ্চিত করুন যে আপনি নিয়মগুলি বুঝতে পেরেছেন এবং আমরা সতর্কতাটি সরিয়ে দেব। আপনি আমাদের চ্যাটটি discord.gg/SponsorBlock or matrix.to/#/#sponsor:ajay.app ব্যবহার করে যোগ দিতে পারেন"
},
"voteRejectedWarning": {
"message": "একটি সতর্কতার কারণে ভোট প্রত্যাখ্যান করা হয়েছে। এটি সমাধানের জন্য চ্যাট খুলতে ক্লিক করুন বা আপনার এখন সময় না থাকলে পরে আবার ফিরে আসুন।",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "অনুদান"
},
"considerDonating": {
"message": "অনুদানের মাধ্যমে ভবিষ্যতেে এর উন্নয়নের কাজে সাহায্য হবে"
},
"hideDonationLink": {
"message": "অনুদানের লিঙ্ক লুকান"
},
"darkModeOptionsPage": {
"message": "অপশন পেজে ডার্ক মোড "
},
"helpPageThanksForInstalling": {
"message": "স্পনসরব্লক ইনস্টল করার জন্য আপনাকে ধন্যবাদ."
},
"helpPageReviewOptions": {
"message": "নীচের অপশনগুলি পর্যালোচনা করুন"
},
"helpPageFeatureDisclaimer": {
"message": "অনেকগুলি বৈশিষ্ট্য সাধারণত অক্ষম থাকে। আপনি যদি ইন্ট্রোস, আউট্রোস এড়িয়ে যেতে চান, Invidious ইত্যাদি ব্যবহার করতে চান তবে সেগুলি নীচে সক্ষম করুন। আপনি UI উপাদানগুলিও লুকাতে/দেখাতে পারেন।"
},
"helpPageHowSkippingWorks": {
"message": "এটি কীভাবে কাজ করে"
},
"helpPageHowSkippingWorks1": {
"message": "ভিডিও এর অংশ ডাটাবেসে পাওয়া গেলে সেগুলি স্বয়ংক্রিয়ভাবে এড়িয়ে যাবে। তারা কীরকম তা পূর্বরূপ দেখতেআপনি এক্সটেনশন আইকনে ক্লিক করে পপআপটি খুলতে পারেন।"
},
"helpPageHowSkippingWorks2": {
"message": "আপনি যখনই কোনও বিভাগ এড়িয়ে যান, আপনি একটা নোটিস পাবেন। সময়টি যদি ভুল বলে মনে হয় তবে ডাউনভোটে ক্লিক করে ভোট দিন! আপনি পপআপ থেকেও ভোট দিতে পারেন।"
},
"Submitting": {
"message": "নতুন অংশ জমা দেওয়া"
},
"helpPageSubmitting1": {
"message": "জমা দেওয়া যায় পপআপে \"অংশ এখন শুরু হয়\" বোতামটি টিপ মেরে বা প্লেয়ারের বোতামগুলি সহ ভিডিও প্লেয়ারে টিপ মেরে করে।"
},
"helpPageSubmitting2": {
"message": "প্লে বোতামটি ক্লিক করা একটি বিভাগের শুরু নির্দেশ করে এবং স্টপ আইকনটি ক্লিক করা শেষটি নির্দেশ করে। আপনি জমা দেওয়ার আগে একাধিক স্পনসর প্রস্তুত করতে পারেন। আপলোড বোতামটি ক্লিক করা জমা দেওয়া হবে। আবর্জনায় ক্লিক করে বাদ দিতে পারেন এটি।"
},
"Editing": {
"message": "সম্পাদন করা"
},
"helpPageEditing1": {
"message": "যদি আপনি ভুল করে বসেন তবে আপনি উপড়ের তীর বোতামটি ক্লিক করার পরে আপনার বিভাগগুলি সম্পাদনা বা মুছতে পারেন।"
},
"helpPageTooSlow": {
"message": "গতি অত্যন্ত ধীর।"
},
"helpPageTooSlow1": {
"message": "আপনি যদি ব্যবহার করতে চান তাইলে হটকি রয়েছে। স্পনসর বিভাগের শুরু/শেষ নির্দেশ করতে সেমিকোলন কী টিপুন এবং জমা দেওয়ার জন্য অ্যাপোস্ট্রোফে ক্লিক করুন। এগুলি পরিবর্তন করা যেতে পারে। আপনি যদি QWERTY ব্যবহার না করেন তবে আপনার সম্ভবত কীবাইন্ডিং পরিবর্তন করা উচিত।"
},
"helpPageCopyOfDatabase": {
"message": "আমি কি ডাটাবেসের একটি অনুলিপি পেতে পারি? আপনি হারিয়ে গেলে হলে কি হবে?"
},
"helpPageCopyOfDatabase1": {
"message": "ডাটাবেসটি সবার জন্য প্রকাশিত এবং পাওয়া যাবে এখানেঃ "
},
"helpPageCopyOfDatabase2": {
"message": "এটির সোর্স কোড অবাধে উপলব্ধ। সুতরাং, যদি আমার কিছু ঘটেও যায় তবে আপনার জমাকৃত অংশগুলি হারিয়ে যাবে না।"
},
"helpPageNews": {
"message": "খবর এবং এটি কীভাবে তৈরি হয়"
},
"helpPageSourceCode": {
"message": "আমি সোর্স কোডটি কোথায় পেতে পারি?"
},
"Credits": {
"message": "কৃতিত্ব"
},
"LearnMore": {
"message": "আরও জানুন"
},
"CopyDownvoteButtonInfo": {
"message": "ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে"
},
"OpenCategoryWikiPage": {
"message": "এই বিভাগের উইকি পাতা খুলুন."
},
"CopyAndDownvote": {
"message": "কপি এবং ডাউনভোট"
},
"ContinueVoting": {
"message": "ভোট করা চালিয়ে যান"
},
"ChangeCategoryTooltip": {
"message": "এটি তাৎক্ষনিকভাবে আপনার অংশে দেওয়া হবে"
},
"downvote": {
"message": "ডাউনভোট"
},
"upvote": {
"message": "আপভোট"
},
"hideSegment": {
"message": "অংশ আড়াল করুন"
},
"SponsorTimeEditScrollNewFeature": {
"message": "দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।"
},
"categoryPillNewFeature": {
"message": "নতুন! দেখুন যখন কোনও ভিডিও সম্পূর্ণ স্পনসর করা বা স্ব-প্রচার হয়"
},
"dayAbbreviation": {
"message": " দিন",
"description": "100d"
},
"hourAbbreviation": {
"message": " ঘণ্টা",
"description": "100h"
},
"optionsTabBehavior": {
"message": "আচরণ",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "ইন্টারফেস",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "কীবোর্ড শর্টকাট",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "ব্যাকআপ এবং পুনঃস্থাপন",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "বিবিধ",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "নোটিশ প্রদর্শন করা বন্ধ করুন",
"description": "Option label"
},
"unbind": {
"message": "বাদ দিন",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "নির্ধারণ করা হয়নি"
},
"change": {
"message": "বদল করুন"
},
"youtubeKeybindWarning": {
"message": "এটি একটি অন্তর্নির্মিত ইউটিউব শর্টকাট। আপনি কি নিশ্চিত যে আপনি এটি ব্যবহার করতে চান?"
},
"betaServerWarning": {
"message": "বেটা সার্ভার চালু করা হয়েছে!"
},
"openOptionsPage": {
"message": "বিকল্প পাতা খুলুন"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopírovat veřejné uživatelské ID"
},
"copySegmentID": {
"message": "Zkopírovat ID segmentu"
},
"discordAdvert": {
"message": "Připojte se k oficiálnímu Discord serveru k podání návrhů a zpětné vazby!"
},
@@ -586,13 +589,13 @@
"message": "Titulky nebo když se objeví konečné karty YouTube. Není pro závěry s informacemi."
},
"category_preview": {
"message": "Náhled/shrnutí"
"message": "Náhled / shrnutí"
},
"category_preview_description": {
"message": "Rychlé shrnutí předchozích epizod nebo náhled toho, co se objeví v aktuálním videu. Myšleno pro upravené sloučené klipy, ne pro mluvená shrnutí."
},
"category_filler": {
"message": "Výplň/vtipy"
"message": "Výplň / vtipy"
},
"category_filler_description": {
"message": "Výplňové scény přidané jen jako přídavek nebo humor, které nejsou vyžadovány pro pochopení hlavního obsahu videa. Toto by nemělo zahrnovat segmenty poskytující kontext nebo podrobnosti na pozadí."
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Toto bude okamžitě platit pro vaše segmenty"
},
"downvote": {
"message": "Hlas proti"
},
"upvote": {
"message": "Hlas pro"
},
"hideSegment": {
"message": "Skrýt segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Použijte kolečko myši při přechodu přes editační okno pro rychlou úpravu času. Kombinace kláves Ctrl nebo Shift mohou být použity k doladění změn."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Toto je vestavěná zkratka YouTube. Opravdu ji chcete použít?"
},
"betaServerWarning": {
"message": "BETA server je povolen!"
},
"openOptionsPage": {
"message": "Otevřít stránku s možnostmi"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopier Offentligt Bruger-ID"
},
"copySegmentID": {
"message": "Kopier Segment-Id"
},
"discordAdvert": {
"message": "Kom til den officielle Discord-server for at give forslag og feedback!"
},
@@ -209,6 +212,15 @@
"enableViewTrackingInPrivate": {
"message": "Aktiver Optælling Af Antal Spring Over I Private-/Inkognitovinduer"
},
"enableTrackDownvotes": {
"message": "Gem segment nedstemmer"
},
"whatTrackDownvotes": {
"message": "Ethvert segment, du nedstemmer vil forblive skjult selv efter genindlæsning"
},
"trackDownvotesWarning": {
"message": "Advarsel: Deaktivering af dette vil slette alle tidligere gemte nedstemmer"
},
"enableQueryByHashPrefix": {
"message": "Forespørg Efter Hashpræfiks"
},
@@ -582,6 +594,9 @@
"category_preview_description": {
"message": "Hurtig opsummering af tidligere episoder eller en forsmag på, hvad der kommer senere i den aktuelle video. Er beregnet til sammenklippede klip, ikke til talte resuméer."
},
"category_filler": {
"message": "Fyldningstangent/Jokes"
},
"category_filler_description": {
"message": "Tangential scener kun tilføjet for fyldstof eller humor, som ikke er nødvendige for at forstå videoens hovedindhold. Dette bør ikke omfatte segmenter, der gtiver kontekst eller bagrundsoplysninger."
},
@@ -689,11 +704,14 @@
"message": "(Slut)"
},
"hiddenDueToDownvote": {
"message": "skjult: downvote"
"message": "skjult: nedstem"
},
"hiddenDueToDuration": {
"message": "skjult: for kort"
},
"manuallyHidden": {
"message": "manuelt skjult"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "Kanal-ID er ikke indlæst endnu. Hvis du bruger en integreret video, så prøv i stedet at bruge YouTube-hjemmesiden. Dette kunne også være forårsaget af ændringer i YouTube-layout. Hvis du mener det, så lav en kommentar her:"
@@ -780,6 +798,9 @@
"Donate": {
"message": "Doner"
},
"considerDonating": {
"message": "Hjælp til at finansiere udvikling"
},
"hideDonationLink": {
"message": "Skjul Donationslink"
},
@@ -802,7 +823,7 @@
"message": "Videosegmenter vil automatisk blive sprunget over, hvis de findes i databasen. Du kan åbne popup-vinduet ved at klikke på ikonet for udvidelsen for at få et eksempel på, hvad de er."
},
"helpPageHowSkippingWorks2": {
"message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på downvote! Du kan også stemme i popup-vinduet."
"message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på nedstem! Du kan også stemme i popup-vinduet."
},
"Submitting": {
"message": "Indsendelse"
@@ -811,7 +832,7 @@
"message": "Indsendelse kan enten ske i popup-vinduet ved at trykke på \"Segment Begynder Nu\"-knappen eller i videoafspilleren med knapperne på afspilleren."
},
"helpPageSubmitting2": {
"message": "Ved at klikke på play-knappen vises starten af et segment, og ved at klikke på stop-ikonet vises slutningen. Du kan forberede flere sponsorer, før du trykker på Send. Hvis du klikker på upload-knappen, sendes det. Hvis du klikker på skraldespanden, slettes den."
"message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete."
},
"Editing": {
"message": "Redigering"
@@ -861,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Dette vil øjeblikkeligt gælde for dine indsendelser"
},
"downvote": {
"message": "Downvote"
},
"upvote": {
"message": "Upvote"
},
"hideSegment": {
"message": "Skjul segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Brug musehjulet, mens du holder musen over redigeringsfeltet for hurtigt at justere tiden. Kombinationer af ctrl eller shift-tastenerne kan bruges til at finjustere ændringerne."
},
@@ -911,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Dette er en indbygget Youtube-genvej. Er du sikker på, at du vil bruge den?"
},
"betaServerWarning": {
"message": "BETA Server er aktiveret!"
},
"openOptionsPage": {
"message": "Åbn indstillinger"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Öffentliche Benutzer-ID kopieren"
},
"copySegmentID": {
"message": "Segment-ID kopieren"
},
"discordAdvert": {
"message": "Tritt dem offiziellen Discord-Server bei und teile Anregungen und Feedback!"
},
@@ -183,7 +186,7 @@
"message": "Versteckt die Schaltflächen im YouTube-Videoplayer, um Segmente einzusenden."
},
"showSkipButton": {
"message": "\"Zum Highlight springen\"-Button im Player behalten"
"message": "\"Zum Highlight springen\"-Button im Youtube-Player anzeigen"
},
"showInfoButton": {
"message": "Zeige Info-Knopf im Youtube-Videoplayer"
@@ -210,13 +213,13 @@
"message": "Aktiviere den Übersprungen Zähler in Privaten/Incognito Tabs"
},
"enableTrackDownvotes": {
"message": "Speichere Abschnitts-downvotes"
"message": "Speichere Downvotes von Segmenten"
},
"whatTrackDownvotes": {
"message": "Alle Segmente welche du negativ bewertest werden versteckt, selbst nach einer aktualisierung"
"message": "Alle Segmente, welche du downvotest, werden verborgen und bleiben es auch dauerhaft"
},
"trackDownvotesWarning": {
"message": "Warnung: Das deaktivieren wird alle vorher gespeicherten Downvotes löschen"
"message": "Warnung: Das Deaktivieren wird alle vorher gespeicherten Downvotes löschen"
},
"enableQueryByHashPrefix": {
"message": "Abfrage nach Hash-Präfix"
@@ -312,7 +315,7 @@
"message": "Ton aus"
},
"full": {
"message": "Vollständiges Video",
"message": "Ganzes Video",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
@@ -437,7 +440,7 @@
"message": "Videosegmente, die kürzer als der festgelegte Wert sind, werden nicht übersprungen oder im Player angezeigt."
},
"skipNoticeDuration": {
"message": "Dauer der Überspringenbenachrichtigung (Sekunden):"
"message": "Dauer der Überspringen-Meldung (Sekunden):"
},
"skipNoticeDurationDescription": {
"message": "Die überspringen Benachrichtigung wird mindestens für so viele Sekunden angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein."
@@ -533,7 +536,7 @@
"message": "Die Debug-Informationen wurden in die Zwischenablage kopiert. Du kannst alle Informationen entfernen, die du nicht teilen möchtest. Verwende einen Texteditor um die Informationen in einer Textdatei zu speichern (um diese ggf. einem Fehlerbericht hinzuzufügen)."
},
"keyAlreadyUsed": {
"message": "Diese Verknüpfung ist an eine andere Aktion gebunden. Bitte wählen Sie eine andere."
"message": "Diese Verknüpfung ist an eine andere Aktion gebunden. Bitte wähle eine andere."
},
"to": {
"message": "bis",
@@ -796,7 +799,7 @@
"message": "Spenden"
},
"considerDonating": {
"message": "Hilf beim finanzieren der Entwicklung"
"message": "Unterstütze die Entwicklung mit einer Spende"
},
"hideDonationLink": {
"message": "Verstecke Spendenlink"
@@ -865,7 +868,7 @@
"message": "Erfahre mehr"
},
"CopyDownvoteButtonInfo": {
"message": "Abwerten, und eine lokale Kopie zum erneuten Einreichen erstellen"
"message": "Downvotet, und erstellt eine lokale Kopie zum erneuten Einreichen"
},
"OpenCategoryWikiPage": {
"message": "Öffne den Wiki-Artikel dieser Kategorie."
@@ -879,11 +882,20 @@
"ChangeCategoryTooltip": {
"message": "Dies wirkt sich sofort auf eigene Segmente aus"
},
"downvote": {
"message": "Negativ bewertet"
},
"upvote": {
"message": "Positiv bewerten"
},
"hideSegment": {
"message": "Segment verbergen"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Benutze das Mausrad während der Mauszeiger über dem Eingabefeld schwebt um die Zeit schnell anzupassen. Benutze Strg bzw. Shift für gröbere/genauere Änderungen."
},
"categoryPillNewFeature": {
"message": "Neu! Sehe, ob ein Video ausschließlich Sponsor oder Eigenwerbung ist"
"message": "Neu! Sieh, ob ein Video ausschließlich Sponsor oder Eigenwerbung ist"
},
"dayAbbreviation": {
"message": "T",
@@ -914,7 +926,7 @@
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Überspringen-Benachrichtigungs aussehen",
"message": "Aussehen der Überspringen-Meldung",
"description": "Option label"
},
"unbind": {
@@ -928,6 +940,12 @@
"message": "Ändern"
},
"youtubeKeybindWarning": {
"message": "Dies ist ein vorhandenes YouTube-Kürzel. Sind Sie sicher, dass Sie diese verwenden möchten?"
"message": "Dies ist ein vorhandenes YouTube-Kürzel. Bist du sicher, dass du es verwenden möchtest?"
},
"betaServerWarning": {
"message": "BETA Server wurde aktiviert!"
},
"openOptionsPage": {
"message": "Einstellungen öffnen"
}
}

View File

@@ -162,7 +162,7 @@
"message": "Ορισμός ονόματος χρήστη"
},
"copyPublicID": {
"message": "Αντιγραφή δημόσιου αναγνωριστικού"
"message": "Αντιγραφή δημόσιου αναγνωριστικού χρήστη"
},
"discordAdvert": {
"message": "Μπείτε στον επίσημο διακομιστή μας στο Discord για ανατροφοδότηση και προτάσεις!"
@@ -715,5 +715,34 @@
},
"helpPageHowSkippingWorks2": {
"message": "Κάθε φορά που παραλείπετε κάποιο τμήμα, θα λαμβάνετε ειδοποίηση. Εάν ο συγχρονισμός σας φαίνεται λάθος, ψηφίστε αρνητικά πατώντας το εικονίδιο! Μπορείτε επίσης να ψηφίσετε μέσω του αναδυόμενου παράθυρου."
},
"Submitting": {
"message": "Υποβολή"
},
"helpPageSubmitting1": {
"message": "Η υποβολή μπορεί είτε να γίνει στο αναδυόμενο παράθυρο πατώντας το κουμπί «Το τμήμα ξεκινάει εδώ» είτε στα κουμπιά κάτω από την μπάρα χρόνου κατά την αναπαραγωγή βίντεο."
},
"helpPageSubmitting2": {
"message": "Πατώντας το κουμπί αναπαραγωγής δείχνετε την αρχή του τμήματος και πατώντας το κουμπί της διακοπής δείχνετε το τέλος του τμήματος. Μπορείτε να ετοιμάσετε πολλαπλά τμήματα χορηγιών πρώτου πατήσετε υποβολή. Πατώντας το κουμπί της αποστολής τα τμήματα υποβάλλονται, ενώ πατώντας το εικονίδιο του κάδου απορριμάτων τα διαγραφεί."
},
"Editing": {
"message": "Επεξεργασία"
},
"helpPageEditing1": {
"message": "Αν κάνατε κάτι λάθος, μπορείτε να διορθώσετε ή να διαγράψετε τα τμήματα σας πατώντας το εικονίδιο πάνω βελάκι."
},
"helpPageSourceCode": {
"message": "Πού μπορώ να βρω τον πηγαίο κώδικα;"
},
"LearnMore": {
"message": "Μάθετε περισσότερα"
},
"optionsTabBehavior": {
"message": "Συμπεριφορά",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Διάφορα",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
}
}

View File

@@ -101,7 +101,7 @@
"message": "It seems the server is down. Contact the dev immediately."
},
"connectionError": {
"message": "A connection error has occured. Error code: "
"message": "A connection error has occurred. Error code: "
},
"clearTimes": {
"message": "Clear Segments"
@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Copy Public UserID"
},
"copySegmentID": {
"message": "Copy Segment ID"
},
"discordAdvert": {
"message": "Come join the official discord server to give suggestions and feedback!"
},
@@ -236,6 +239,9 @@
"showSkipNotice": {
"message": "Show Notice After A Segment Is Skipped"
},
"showCategoryGuidelines": {
"message": "Show Category Help"
},
"noticeVisibilityMode0": {
"message": "Full Size Skip Notices"
},
@@ -353,7 +359,7 @@
"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\"."
"message": "This time appears in brackets next to the current time on below the Seek Bar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seek Bar\"."
},
"youHaveSkipped": {
"message": "You've skipped "
@@ -407,7 +413,7 @@
"message": "Supported Sites: "
},
"optionsInfo": {
"message": "Enable Invidious support, disable autoskip, hide buttons and more."
"message": "Enable Invidious support, disable auto skip, hide buttons and more."
},
"addInvidiousInstance": {
"message": "Add 3rd-Party Client Instance"
@@ -496,7 +502,7 @@
"incorrectlyFormattedOptions": {
"message": "This JSON is not formatted correctly. Your options have not been changed."
},
"confirmNoticeTitle" : {
"confirmNoticeTitle": {
"message": "Submit Segment"
},
"submit": {
@@ -539,18 +545,39 @@
"message": "to",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Include segue transitions"
},
"generic_guideline2": {
"message": "Plays as if nothing was skipped"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like."
},
"category_sponsor_guideline1": {
"message": "Paid promotions"
},
"category_sponsor_guideline2": {
"message": "Not for donations or custom merch"
},
"category_selfpromo": {
"message": "Unpaid/Self Promotion"
},
"category_selfpromo_description": {
"message": "Similar to \"sponsor\" except for unpaid or self promotion. This includes sections about merchandise, donations, or information about who they collaborated with."
},
"category_selfpromo_guideline1": {
"message": "Donations, memberships and custom merch"
},
"category_selfpromo_guideline2": {
"message": "Free shoutouts that don't add to the video"
},
"category_selfpromo_guideline3": {
"message": "Not for corporate designed products and merch"
},
"category_exclusive_access": {
"message": "Exclusive Access"
},
@@ -561,12 +588,24 @@
"message": "This video showcases a product, service or location that they've received free or subsidized access to",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Entire video showcases something where recieved free or subsidized access"
},
"category_interaction": {
"message": "Interaction Reminder (Subscribe)"
},
"category_interaction_description": {
"message": "When there is a short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should be under self promotion instead."
},
"category_interaction_guideline1": {
"message": "Short reminders to like, subscribe or follow"
},
"category_interaction_guideline2": {
"message": "Includes indirect reminders to comment"
},
"category_interaction_guideline3": {
"message": "Not for general promotion, only calls to action"
},
"category_interaction_short": {
"message": "Interaction Reminder"
},
@@ -579,18 +618,36 @@
"category_intro_short": {
"message": "Intermission"
},
"category_intro_guideline1": {
"message": "Interval without actual content"
},
"category_intro_guideline2": {
"message": "Not for transitions with information"
},
"category_outro": {
"message": "Endcards/Credits"
},
"category_outro_description": {
"message": "Credits or when the YouTube endcards appear. Not for conclusions with information."
},
"category_outro_guideline1": {
"message": "Don't include content, even if endcards are on screen"
},
"category_preview": {
"message": "Preview/Recap"
},
"category_preview_description": {
"message": "Quick recap of previous episodes, or a preview of what's coming up later in the current video. Meant for edited together clips, not for spoken summaries."
},
"category_preview_guideline1": {
"message": "Clips that appear later, or in a future video"
},
"category_preview_guideline2": {
"message": "Recap of a previous video"
},
"category_preview_guideline3": {
"message": "Not for sections that add additional content"
},
"category_filler": {
"message": "Filler Tangent/Jokes"
},
@@ -600,6 +657,15 @@
"category_filler_short": {
"message": "Filler"
},
"category_filler_guideline1": {
"message": "Tangential scenes only for filler or humor"
},
"category_filler_guideline2": {
"message": "Distractions, bloopers, replays"
},
"category_filler_guideline3": {
"message": "Not for scenes required to understand the topic"
},
"category_music_offtopic": {
"message": "Music: Non-Music Section"
},
@@ -609,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Non-Music"
},
"category_music_offtopic_guideline1": {
"message": "Sections not in official releases"
},
"category_music_offtopic_guideline2": {
"message": "Non-music in a live performance"
},
"category_poi_highlight": {
"message": "Highlight"
},
"category_poi_highlight_description": {
"message": "The part of the video that most people are looking for. Similar to \"Video starts at x\" comments."
},
"category_poi_highlight_guideline1": {
"message": "Section most people are looking for"
},
"category_poi_highlight_guideline2": {
"message": "Can help skip past context"
},
"category_poi_highlight_guideline3": {
"message": "Can skip to the title or thumbnail"
},
"category_livestream_messages": {
"message": "Livestream: Donation/Message Readings"
},
@@ -864,21 +945,33 @@
"LearnMore": {
"message": "Learn More"
},
"CopyDownvoteButtonInfo": {
"FullDetails": {
"message": "Full Details"
},
"CopyDownvoteButtonInfo": {
"message": "Downvotes and creates a local copy for you to resubmit"
},
"OpenCategoryWikiPage": {
"message": "Open this category's wiki page."
},
"CopyAndDownvote": {
"OpenCategoryWikiPage": {
"message": "Open this category's wiki page."
},
"CopyAndDownvote": {
"message": "Copy and downvote"
},
"ContinueVoting": {
"ContinueVoting": {
"message": "Continue Voting"
},
"ChangeCategoryTooltip": {
"ChangeCategoryTooltip": {
"message": "This will instantly apply to your segments"
},
"downvote": {
"message": "Downvote"
},
"upvote": {
"message": "Upvote"
},
"hideSegment": {
"message": "Hide segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Use your mousewheel while hovering over the edit box to quickly adjust the time. Combinations of the ctrl or shift key can be used to fine tune the changes."
},
@@ -929,5 +1022,17 @@
},
"youtubeKeybindWarning": {
"message": "This is a built-in YouTube shortcut. Are you sure you want to use it?"
},
"betaServerWarning": {
"message": "BETA Server is enabled!"
},
"openOptionsPage": {
"message": "Open options page"
},
"resetToDefault": {
"message": "Reset settings to default"
},
"confirmResetToDefault": {
"message": "Are you sure you want to reset all settings to their default values? This cannot be undone."
}
}

View File

@@ -17,7 +17,7 @@
"message": "Esto ya ha sido enviado antes"
},
"channelWhitelisted": {
"message": "Canal Permitido!"
"message": "¡Canal Permitido!"
},
"Segment": {
"message": "segmento"
@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Copiar el ID de usuario público"
},
"copySegmentID": {
"message": "Copiar ID de Segmento"
},
"discordAdvert": {
"message": "¡Únete al servidor oficial de discord para darnos sugerencias y comentarios!"
},
@@ -562,13 +565,13 @@
"description": "Short description for this category"
},
"category_interaction": {
"message": "Recordatorio de interacción (subscribir)"
"message": "Recordatorio de Interacción (Suscribir)"
},
"category_interaction_description": {
"message": "Cuando hay un breve recordatorio para dar like, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo autopromoción en su lugar."
},
"category_interaction_short": {
"message": "Recordatorio de interacción"
"message": "Recordatorio de Interacción"
},
"category_intro": {
"message": "Intermisión/Animación de Introducción"
@@ -732,13 +735,13 @@
"message": "Si no puede resolverlo, desactive la opción \"Forzar Comprobación de Canal antes de Saltar\", ya que SponsorBlock no puede recuperar la información del canal de este video"
},
"forceChannelCheck": {
"message": "Comprobación forzada del canal antes de saltarse"
"message": "Forzar Comprobación de Canal antes de Saltar"
},
"whatForceChannelCheck": {
"message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso, ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."
},
"forceChannelCheckPopup": {
"message": "Considere la posibilidad de activar \"Comprobación del canal de fuerza antes de saltar\""
"message": "Considere la posibilidad de activar \"Forzar Comprobación de Canal antes de Saltar\""
},
"downvoteDescription": {
"message": "Tiempo incorrecto/equivocado"
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Esto se aplicará instantáneamente a tus segmentos"
},
"downvote": {
"message": "Voto negativo"
},
"upvote": {
"message": "Voto positivo"
},
"hideSegment": {
"message": "Ocultar segmento"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Utilice la rueda del ratón mientras pasa el cursor por encima del cuadro de edición para ajustar el tiempo. Se pueden utilizar combinaciones de la tecla ctrl o shift para afinar los cambios."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Este un atajo incorporado de YouTube. ¿Estás seguro de que quieres usarlo?"
},
"betaServerWarning": {
"message": "¡El servidor BETA está activado!"
},
"openOptionsPage": {
"message": "Abrir página de opciones"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopeeri avalik UserID"
},
"copySegmentID": {
"message": "Kopeeri segmendi ID"
},
"discordAdvert": {
"message": "Tule liitu ametliku Discordi serveriga, et anda soovitusi ja tagasisidet!"
},
@@ -846,9 +849,21 @@
"ChangeCategoryTooltip": {
"message": "See rakendub sinu segmentidele koheselt"
},
"downvote": {
"message": "Vastuhääl"
},
"upvote": {
"message": "Poolthääl"
},
"hideSegment": {
"message": "Peida segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Kiireks aja reguleerimiseks keri hiirega muutmiskasti kohal. Täpsemaks reguleerimiseks hoia kerimise ajal all Ctrl või Shift klahvi."
},
"categoryPillNewFeature": {
"message": "Uus! Näe, kui video on täielikult sponsoreeritud või enesepromo"
},
"dayAbbreviation": {
"message": "p",
"description": "100d"
@@ -890,5 +905,11 @@
},
"change": {
"message": "Muuda"
},
"betaServerWarning": {
"message": "BEETAserver on lubatud!"
},
"openOptionsPage": {
"message": "Ava valikute leht"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopio julkinen UserID"
},
"copySegmentID": {
"message": "Kopioi osion ID"
},
"discordAdvert": {
"message": "Liity viralliselle Discord-palvelimelle antaaksesi ehdotuksia ja palautetta!"
},
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Tämä vaikuttaa sinun osioihin välittömästi"
},
"downvote": {
"message": "Äänestä puolesta"
},
"upvote": {
"message": "Äänestä vastaan"
},
"hideSegment": {
"message": "Piilota osio"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Käytä hiiren rullaa samalla kun osoitin on muokkauslaatikon päällä säätääksesi aikaa nopeasti. Ctrl- tai Shift-näppäimen yhdistelmiä voi käyttää muutoksien hienosäätelyyn."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Tämä on YouTuben sisäänrakennettu pikanäppäin. Haluatko varmasti käyttää sitä?"
},
"betaServerWarning": {
"message": "BETA-palvelin on käytössä!"
},
"openOptionsPage": {
"message": "Avaa asetussivu"
}
}

View File

@@ -14,7 +14,7 @@
"message": "Vous cherchez à envoyer beaucoup de segments, y en a-t-il vraiment autant ?"
},
"409": {
"message": "Déja soumis"
"message": "Ce segment a déjà été soumis auparavant"
},
"channelWhitelisted": {
"message": "Chaîne mise sur liste blanche !"
@@ -32,7 +32,7 @@
"message": "Signaler"
},
"reportButtonInfo": {
"message": "Signaler que ce segment commercial est incorrect."
"message": "Signaler que cette soumission est incorrecte."
},
"Dismiss": {
"message": "Fermer"
@@ -98,7 +98,7 @@
"message": "A voté !"
},
"serverDown": {
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
"message": "Il semblerait que le serveur soit hors service. Contactez le développeur."
},
"connectionError": {
"message": "Erreur de connexion. Code d'erreur : "
@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Copier l'ID utilisateur"
},
"copySegmentID": {
"message": "Copier l'identifiant du segment"
},
"discordAdvert": {
"message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!"
},
@@ -171,7 +174,7 @@
"message": "Cacher"
},
"Options": {
"message": "Paramètres"
"message": "Options"
},
"showButtons": {
"message": "Montrer les boutons sur le lecteur YouTube"
@@ -180,7 +183,7 @@
"message": "Cacher les boutons sur le lecteur YouTube"
},
"hideButtonsDescription": {
"message": "Cela permet de cacher du lecteur YouTube les boutons utilisés pour soumettre des segments commerciaux. Je peux \ncomprendre que certaines personnes les trouvent perturbants. Au lieu d'utiliser ces boutons, cette fenêtre peut être utilisée \npour soumettre des segments commerciaux. Pour cacher la notification, utilisez le bouton \"Ne plus montrer\" sur la notification. Vous pouvez toujours réactiver ces paramètres plus tard."
"message": "Ceci enlève du lecteur YouTube les boutons permettant de soumettre des segments."
},
"showSkipButton": {
"message": "Conserver le bouton \"Aller au point essentiel\" sur le lecteur"
@@ -192,7 +195,7 @@
"message": "Cacher le bouton Info sur le lecteur YouTube"
},
"autoHideInfoButton": {
"message": "Masquer Automatiquement Le Button Info"
"message": "Masquer automatiquement le bouton Info"
},
"hideDeleteButton": {
"message": "Cacher le bouton Supprimer sur le lecteur YouTube"
@@ -210,13 +213,13 @@
"message": "Activer le suivi du nombre de sauts dans les onglets privés/incognito"
},
"enableTrackDownvotes": {
"message": "Enregistrer les segments votés contre"
"message": "Enregistrer les segments contre lesquels vous avez voté"
},
"whatTrackDownvotes": {
"message": "Tous les segments que vous votez contre vous resteront cachés même après rafraîchissement"
"message": "Tous les segments que contre lesquels vous votez resteront cachés même après rafraîchissement de la page"
},
"trackDownvotesWarning": {
"message": "Attention : Désactiver ceci supprimera tous les votes contre précédemment enregistrés"
"message": "Attention : la désactivation supprimera tous vos votes précédemment enregistrés"
},
"enableQueryByHashPrefix": {
"message": "Requête par préfixe du hash"
@@ -228,7 +231,7 @@
"message": "Récupérer les segments sur les nouvelles vidéos"
},
"whatRefetchWhenNotFound": {
"message": "Si la vidéo est nouvelle et qu'aucun segment n'a été trouvé, ils seront réactualisés toutes les quelques minutes pendant le visionnage."
"message": "Si la vidéo vient de sortir et qu'aucun segment n'a été encore trouvé, SponsorBlock en cherchera durant la lecture de la vidéo."
},
"showNotice": {
"message": "Afficher la notification"
@@ -272,7 +275,7 @@
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "Sauter le segment",
"message": "Passer le segment",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
@@ -284,7 +287,7 @@
"description": "Keybind label"
},
"keybindDescription": {
"message": "Sélectionnez une touche en la tapant et choisissez n'importe quelles touches de modification que vous souhaitez utiliser."
"message": "Sélectionnez une touche en utilisant le clavier et choisissez les touches de modification que vous souhaitez utiliser."
},
"0": {
"message": "Délai de connexion dépassé. Vérifiez votre connexion internet. Si votre connexion internet fonctionne, le serveur est probablement surchargé ou hors service."
@@ -446,7 +449,7 @@
"message": "Le segment suivant est plus court que votre option de durée minimale. Cela pourrait signifier qu'il est déjà soumis, et just ignoré par cette option. Êtes-vous sûr de vouloir soumettre ?"
},
"liveOrPremiere": {
"message": "La soumission sur un livestream actif ou une première n'est pas autorisée. Veuillez attendre qu'il termine, puis actualisez la page et vérifiez que les segments sont toujours valides."
"message": "La soumission de segments sur un direct en cours ou une première n'est pas autorisée. Veuillez attendre qu'il soit terminé puis actualisez la page et vérifiez que les segments sont toujours valides."
},
"showUploadButton": {
"message": "Afficher le bouton de téléchargement"
@@ -485,7 +488,7 @@
"message": "Charger à partir du fichier"
},
"whatExportOptions": {
"message": "C'est votre configuration complète au format JSON. Elle inclut votre identifiant utilisateur, gardez-la pour vous."
"message": "Contient toute votre configuration au format JSON. Inclut votre UserID privé, donc ne partagez pas ce fichier."
},
"setOptions": {
"message": "Définir les options"
@@ -527,20 +530,20 @@
"message": "Impossible de copier dans le presse-papiers"
},
"copyDebugInformationOptions": {
"message": "Copie les informations dans le presse-papiers pour les fournir aux développeurs lors d'un rapport de bug ou lorsqu'un développeur le demande. Les informations sensibles telles que l'ID d'utilisateur, les chaînes sur liste blanche ou l'adresse du serveur personnalisé ont été supprimées. Cependant, ça contient des informations telles que votre user-agent, votre navigateur, votre système d'exploitation et le numéro de version d'extension. "
"message": "Copie les informations dans le presse-papiers de manière à les fournir à l'équipe de développement dans un rapport de bug ou si on vous le demande. Les informations personnelles telles que le UserID privé, les chaînes sur liste blanche ou l'adresse du serveur personnalisé sont retirées des données copiées. Cependant, des informations telles que votre user-agent, votre navigateur web, votre système d'exploitation ou le numéro de version d'extension de SponsorBlock font partie des données copiées. "
},
"copyDebugInformationComplete": {
"message": "Les informations de débogage ont été copiées dans le presse-papiers. N'hésitez pas à supprimer toute information que vous ne préférez pas partager. Enregistrez-les dans un fichier texte ou collez-les dans le rapport de bug."
"message": "Les informations de débogage ont été copiées dans le presse-papiers. N'hésitez pas à supprimer toute information que vous ne souhaitez pas partager. Enregistrez-les dans un fichier texte ou collez-les dans le rapport de bug."
},
"keyAlreadyUsed": {
"message": "Ce raccourci est lié à une autre action. Veuillez en sélectionner un autre."
"message": "Ce raccourci est lié à une autre action. Veuillez en choisir un autre."
},
"to": {
"message": "à",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "Message commercial"
"message": "Message sponsorisé"
},
"category_sponsor_description": {
"message": "Promotion rémunérée, parrainage rémunéré et publicité directe. Pas pour l'autopromotion ou les présentations gratuites de causes, de créateurs, de sites web ou de produits qu'ils aiment."
@@ -555,10 +558,10 @@
"message": "Accès exclusif"
},
"category_exclusive_access_description": {
"message": "Seulement pour étiqueter des vidéos entières. Utilisé quand une vidéo présente un produit, un service ou un emplacement auquel ils ont reçu un accès gratuit ou subventionné."
"message": "Sert uniquement à étiqueter les vidéos entièrement sponsorisées. Utilisé quand une vidéo présente un produit, un service ou un emplacement pour lesquels un accès gratuit ou subventionné a été reçu."
},
"category_exclusive_access_pill": {
"message": "Cette vidéo présente un produit, un service ou un emplacement auquel ils ont reçu un accès gratuit ou subventionné",
"message": "Cette vidéo présente un produit, un service ou un lieu pour lequel un accès gratuit ou subventionné a été reçu",
"description": "Short description for this category"
},
"category_interaction": {
@@ -574,7 +577,7 @@
"message": "Entracte/Animation d'intro"
},
"category_intro_description": {
"message": "Un intervalle sans réel contenu, comme une pause, une image statique ou une animation répétitive. Ne doit pas être utilisé pour les transitions avec des informations."
"message": "Un intervalle sans réel contenu, par exemple une pause, une image statique ou une animation répétitive. N'utilisez pas cette catégorie pour les transitions contenant de l'information."
},
"category_intro_short": {
"message": "Entracte"
@@ -595,7 +598,7 @@
"message": "Digressions/Blagues"
},
"category_filler_description": {
"message": "Des digressions ajoutées uniquement pour le remplissage ou l'humour qui ne sont pas requis pour comprendre le contenu principal de la vidéo. Cela ne devrait pas inclure des segments fournissant du contexte ou des détails de fond."
"message": "Digressions ajoutées uniquement dans un but de remplissage ou de l'humour non requis pour comprendre le sujet principal de la vidéo. Ne doit pas inclure des segments fournissant du contexte ou des détails de fond."
},
"category_filler_short": {
"message": "Remplissage"
@@ -692,7 +695,7 @@
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Avertissement: Ce type de segment peut avoir au maximum un seul actif à la fois. En soumettant plusieurs segments, un seul aléatoire sera affiché."
"message": "Attention : un seul segment de ce type de segment peut être actif à la fois. En soumettant plusieurs segments, un seul d'entre eux sera aléatoirement affiché."
},
"youMustSelectACategory": {
"message": "Vous devez sélectionner une catégorie pour tous les segments que vous soumettez !"
@@ -707,7 +710,7 @@
"message": "masqué : trop court"
},
"manuallyHidden": {
"message": "masquer manuellement"
"message": "masqué manuellement"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
@@ -735,7 +738,7 @@
"message": "Forcer la vérification du canal avant de passer"
},
"whatForceChannelCheck": {
"message": "Par défaut, passer les segments avant même de savoir à quelle chaîne appartient la vidéo. Par défaut, les segments en début des vidéos des chaînes sur liste blanche peuvent être passés. Activer cette option empêchera cela mais passer les segments aura un délai, car obtenir l'id des chaînes peut prendre du temps. Ce délai sera imperceptible si votre connexion est rapide."
"message": "Par défaut, les segments sont passés avant même de savoir à quelle chaîne la vidéo appartient. Par défaut, certains segments en début de vidéo des chaînes sur liste blanche peuvent être involontairement passés. Activer cette option évitera ce problème mais le passage des segments aura un léger retard, du fait que l'obtention du ChannelID prend du temps. Ce retard devrait être imperceptible si vous avez un haut débit internet."
},
"forceChannelCheckPopup": {
"message": "Envisagez d'activer \"Forcez la vérification de la chaîne avant de passer\""
@@ -773,10 +776,10 @@
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "Ce segment est long. Si toute la vidéo parle d'un seul sujet, changer \"Passer\" en \"Toute la vidéo\". Voir les directives pour plus d'informations."
"message": "Ce segment est long. Si toute la vidéo parle d'un seul sujet, changer de \"Passer\" à \"Toute la vidéo\". Voir les instructions pour plus d'informations."
},
"categoryPillTitleText": {
"message": "Cette vidéo entière est étiquetée avec cette catégorie qui est trop intégrée pour l'en séparer"
"message": "L'intégralité de cette vidéo est classée dans cette catégorie ce qui la rend trop intriquée pour l'en séparer"
},
"experiementOptOut": {
"message": "Se désinscrire de toutes les futures expériences",
@@ -786,7 +789,7 @@
"message": "Cacher pour toujours"
},
"warningChatInfo": {
"message": "Vous avez reçu un avertissement et ne pouvez pas soumettre de segments temporairement. Cela signifie que nous avons remarqué que vous commettiez des erreurs courantes qui ne sont pas malveillantes. Veuillez simplement confirmer que vous comprenez les règles et nous supprimerons l'avertissement. Vous pouvez également rejoindre cette discussion en utilisant discord.gg/SponsorBlock ou matrix.to/#/#sponsor:ajay.app"
"message": "Vous avez reçu un avertissement et ne pouvez temporairement pas soumettre de segments. Cela signifie que nous avons remarqué que vous commettiez des erreurs courantes non malveillantes. Veuillez confirmer que vous comprenez le règlement et nous supprimerons l'avertissement. Vous pouvez également rejoindre cette discussion en utilisant discord.gg/SponsorBlock ou matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Le vote a été rejeté en raison d'un avertissement. Cliquez pour ouvrir un chat et y mettre fin , ou revenez plus tard lorsque vous avez le temps.",
@@ -802,7 +805,7 @@
"message": "Cacher le lien de don"
},
"darkModeOptionsPage": {
"message": "Mode sombre sur la page options"
"message": "Page options affichée en mode sombre"
},
"helpPageThanksForInstalling": {
"message": "Merci d'avoir installé SponsorBlock."
@@ -865,10 +868,10 @@
"message": "En savoir plus"
},
"CopyDownvoteButtonInfo": {
"message": "Voter contre et crée une copie locale pour la resoumettre"
"message": "Vote contre et crée une copie locale à soumettre à nouveau"
},
"OpenCategoryWikiPage": {
"message": "Ouvrez la page wiki de cette catégorie."
"message": "Ouvrir la page wiki de cette catégorie."
},
"CopyAndDownvote": {
"message": "Copier et voter contre"
@@ -879,11 +882,20 @@
"ChangeCategoryTooltip": {
"message": "Cela s'appliquera instantanément à vos segments"
},
"downvote": {
"message": "Voter contre"
},
"upvote": {
"message": "Voter pour"
},
"hideSegment": {
"message": "Cacher le segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches Ctrl ou Shift peuvent être utilisées pour affiner les modifications."
"message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches ctrl ou maj peuvent être utilisées pour affiner les modifications."
},
"categoryPillNewFeature": {
"message": "Nouveau! Voir quand une vidéo est entièrement sponsorisée ou de l'autopromotion"
"message": "Nouveau ! Soyez prévenu-e quand une vidéo est entièrement sponsorisée ou autopromotionnelle"
},
"dayAbbreviation": {
"message": "j",
@@ -914,7 +926,7 @@
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Apparence d'avis de saut",
"message": "Sauter l'affichage de l'avertissement",
"description": "Option label"
},
"unbind": {
@@ -928,6 +940,12 @@
"message": "Changer"
},
"youtubeKeybindWarning": {
"message": "Il s'agit d'un raccourci YouTube intégré. Êtes-vous sûr de vouloir l'utiliser ?"
"message": "Il s'agit d'un raccourci intégré à YouTube. Êtes-vous sûr de vouloir l'utiliser ?"
},
"betaServerWarning": {
"message": "Le serveur BETA est actif !"
},
"openOptionsPage": {
"message": "Ouvrir la page d'options"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "דלג קדימה"
},
"unmute": {
"message": "ביטול השתקה"
},
"paused": {
"message": "מושהה"
},
@@ -79,9 +82,15 @@
"sponsorEnd": {
"message": "מקטע נגמר עכשיו"
},
"sponsorCancel": {
"message": "ביטול יצירת מקטע"
},
"noVideoID": {
"message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה."
},
"refreshSegments": {
"message": "רענן מקטעים"
},
"success": {
"message": "הצלחה!"
},
@@ -137,21 +146,63 @@
"popupHint": {
"message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים"
},
"clearTimesButton": {
"message": "נקה זמנים"
},
"submitTimesButton": {
"message": "הגש זמנים"
},
"publicStats": {
"message": "זה משומש בעמוד הסטטים הפומביים כדי להראות כמה תרמת. צפה בזה"
},
"Username": {
"message": "שם משתמש"
},
"setUsername": {
"message": "הגדר שם משתמש"
},
"copyPublicID": {
"message": "העתק קוד משתמש פומבי"
},
"discordAdvert": {
"message": "הצטרף לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!"
},
"hideThis": {
"message": "הסתר"
},
"Options": {
"message": "אפשרויות"
},
"showButtons": {
"message": "הראה כפתורים על הנגן של יוטיוב"
},
"hideButtons": {
"message": "הסתר כפתורים על הנגן של יוטיוב"
},
"hideButtonsDescription": {
"message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג."
},
"showSkipButton": {
"message": "השאר את כפתור הדילוג לשיא הסרטון על הנגן באופן קבוע"
},
"showInfoButton": {
"message": "הראה כפתור מידע בנגן YouTube"
},
"hideInfoButton": {
"message": "החבא כפתור מידע בנגן YouTube"
},
"autoHideInfoButton": {
"message": "הסתר אוטומטית כפתורי אינפורמציה"
},
"hideDeleteButton": {
"message": "הסתר כפתור מחיקה על הנגן של יוטיוב"
},
"showDeleteButton": {
"message": "הצג כפתור מחיקה על הנגן של יוטיוב"
},
"whatViewTracking": {
"message": "הפיצ'ר הזה עוקב אחרי מקטעים שדילגת עליהם בכדי ליידע משתמשים אחרים כמה ההגשות שלך עזרו לאחרים ושומשו כמטריקה יחד עם ההצבעות בעד בכדי להבטיח שלא ייכנס ספאם אל תוך המערכת. ההרחבה שולחת הודעה לשרת בכל פעם שאתה מדלג על מקטע. התקווה היא שרוב האנשים לא ישנו את ההגדרה הזו כדי שהמספרי צפייה יהיו מדוייקים :)"
},
"website": {
"message": "אתר",
"description": "Used on Firefox Store Page"
@@ -163,6 +214,15 @@
"errorCode": {
"message": "קוד שגיאה: "
},
"skip": {
"message": "דלג"
},
"mute": {
"message": "השתק"
},
"mute_category": {
"message": "השתק {0}?"
},
"minLower": {
"message": "דקה"
},
@@ -186,10 +246,225 @@
"createdBy": {
"message": "נוצר על ידי"
},
"supportedSites": {
"message": "אתרים נתמכים: "
},
"add": {
"message": "הוסף"
},
"save": {
"message": "שמור"
},
"reset": {
"message": "אתחל"
},
"exportOptionsCopy": {
"message": "ערוך/העתק"
},
"exportOptionsDownload": {
"message": "שמור לקובץ"
},
"exportOptionsUpload": {
"message": "טען מקובץ"
},
"setOptions": {
"message": "הגדר אפשרויות"
},
"confirmNoticeTitle": {
"message": "הגש מקטע"
},
"submit": {
"message": "הגש"
},
"cancel": {
"message": "ביטול"
},
"delete": {
"message": "מחק"
},
"preview": {
"message": "תצוגה מקדימה"
},
"unsubmitted": {
"message": "לא מוגש"
},
"inspect": {
"message": "סקור"
},
"edit": {
"message": "עריכה"
},
"to": {
"message": "עד ל",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "נותן חסות"
},
"category_exclusive_access": {
"message": "גישה אקסקלוסיבית"
},
"category_music_offtopic": {
"message": "מוזיקה: קטעים ללא מוזיקה"
},
"category_music_offtopic_short": {
"message": "ללא מוזיקה"
},
"category_poi_highlight": {
"message": "קטע חשוב"
},
"autoSkip": {
"message": "דילוג אוטומטי"
},
"manualSkip": {
"message": "דלג ידנית"
},
"showOverlay": {
"message": "הראה בטיימליין"
},
"showOverlay_POI": {
"message": "הראה בטיימליין"
},
"category": {
"message": "קטגוריה"
},
"skipOption": {
"message": "אפשרות דילוג",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"bracketNow": {
"message": "(עכשיו)"
},
"moreCategories": {
"message": "עוד קטגוריות"
},
"chooseACategory": {
"message": "בחר קטגוריה"
},
"bracketEnd": {
"message": "(סוף)"
},
"downvoteDescription": {
"message": "זמן שגוי/לא נכון"
},
"incorrectCategory": {
"message": "שנה קטגוריה"
},
"multipleSegments": {
"message": "מספר מקטעים"
},
"guidelines": {
"message": "הנחיות"
},
"readTheGuidelines": {
"message": "קראו את ההנחיות!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "קטגוריות נמצאות כאן!"
},
"help": {
"message": "עזרה"
},
"GotIt": {
"message": "הבנתי",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "לא מעוניין להשתתף בניסויים עתידיים",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "הסתר לעד"
},
"Donate": {
"message": "תרום"
},
"considerDonating": {
"message": "עזרו לממן את הפיתוח"
},
"hideDonationLink": {
"message": "הסתר כפתור תרומה"
},
"helpPageThanksForInstalling": {
"message": "תודה שהתקנת את ספונסרבלוק."
},
"helpPageReviewOptions": {
"message": "אנא סקור את האפשרויות הבאות"
},
"helpPageHowSkippingWorks": {
"message": "כיצד דילוג עובד"
},
"Submitting": {
"message": "שולח"
},
"Editing": {
"message": "עריכה"
},
"helpPageTooSlow": {
"message": "הקצב איטי מדי"
},
"helpPageCopyOfDatabase2": {
"message": "קוד המקור זמין באופן חופשי ובחינם. אז, אפילו אם משהו יקרה לי, המקטעים שהגשתם לא יאבדו."
},
"helpPageNews": {
"message": "חדשות וכיצד זה נעשה"
},
"helpPageSourceCode": {
"message": "היכן אוכל להשיג את קוד המקור?"
},
"Credits": {
"message": "קרדיטים"
},
"LearnMore": {
"message": "למידע נוסף"
},
"CopyAndDownvote": {
"message": "העתק ועשה דיסלייק"
},
"ContinueVoting": {
"message": "המשך להצביע"
},
"ChangeCategoryTooltip": {
"message": "זה מיידית ישפיע על כל המקטעים שלך"
},
"SponsorTimeEditScrollNewFeature": {
"message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי."
},
"categoryPillNewFeature": {
"message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי"
},
"dayAbbreviation": {
"message": "ימים",
"description": "100d"
},
"hourAbbreviation": {
"message": "שעות",
"description": "100h"
},
"optionsTabBehavior": {
"message": "התנהגות",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "ממשק",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "קיצורי מקלדת",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "גיבוי/שחזור",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"notSet": {
"message": "לא הוגדר"
},
"change": {
"message": "שנה"
},
"youtubeKeybindWarning": {
"message": "זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Nyilvános UserID másolása"
},
"copySegmentID": {
"message": "Szegmens ID másolása"
},
"discordAdvert": {
"message": "Gyere, csatlakozz a hivatalos discord szerverhez, hogy javaslatokat és visszajelzést adhass!"
},
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Ez azonnal érvényes lesz a szegmenseidre"
},
"downvote": {
"message": "Leszavazás"
},
"upvote": {
"message": "Felszavazás"
},
"hideSegment": {
"message": "Szegmens elrejtése"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Használd egérgörgődet a szerkesztő mező fölött, hogy gyorsan módosíthasd az időt. A ctrl vagy shift billentyűk kombinációjával finomhangolhatod a változás mértékét."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Ez egy beépített YouTube gyorsbillentyű. Biztosan ezt szeretnéd használni?"
},
"betaServerWarning": {
"message": "BÉTA szerver engedélyezve van!"
},
"openOptionsPage": {
"message": "Beállítások megnyitása"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Salin UserID Publik"
},
"copySegmentID": {
"message": "Salin ID Segmen"
},
"discordAdvert": {
"message": "Gabung dengan server resmi discord untuk memberikan kritik dan saran!"
},
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Ini akan menerapkan ke segmen Anda"
},
"downvote": {
"message": "Jempol bawah"
},
"upvote": {
"message": "Jempol atas"
},
"hideSegment": {
"message": "Sembunyikan segmen"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Gunakan roda mouse ketika berada di kotak edit untuk mengatur waktu dengan cepat. Kombinasi dengan tombol [Ctrl + Shift] bisa digunakan untuk perubahan yang halus."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Ini adalah pintasan YouTube. Apakah Anda yakin untuk menggunakannya?"
},
"betaServerWarning": {
"message": "Server BETA diaktifkan!"
},
"openOptionsPage": {
"message": "Buka laman opsi"
}
}

View File

@@ -562,7 +562,7 @@
"description": "Short description for this category"
},
"category_interaction": {
"message": "Promemoria di Interazione (Sottoscrizione)"
"message": "Promemoria d'Interazione (Iscrizione)"
},
"category_interaction_description": {
"message": "Quando nel punto centrale del contenuto è presente un breve promemoria per aggiunta di mi piace, iscrizione o seguito. Se dovesse risultare esteso o riguardare qualcosa di specifico, potrebbe essere un'autopromozione."
@@ -586,7 +586,7 @@
"message": "I titoli di coda o quando vengono mostrate annotazioni a fine video su YouTube. Non per conclusioni provviste di informazioni."
},
"category_preview": {
"message": "Anteprima"
"message": "Anteprima/Riepilogo"
},
"category_preview_description": {
"message": "Riepilogo rapido degli episodi precedenti, o un'anteprima di ciò che sta arrivando più tardi nel video attuale. Inteso per clip, non per riassunti a voce."
@@ -929,5 +929,11 @@
},
"youtubeKeybindWarning": {
"message": "Questa è una scorciatoia integrata da YouTube. Sei sicuro di volerla usare?"
},
"betaServerWarning": {
"message": "Il server BETA è abilitato!"
},
"openOptionsPage": {
"message": "Apri la pagina delle opzioni"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "パブリックユーザIDをコピー"
},
"copySegmentID": {
"message": "セグメントIDをコピー"
},
"discordAdvert": {
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください"
},
@@ -838,7 +841,7 @@
"message": "もし間違えてしまっても、上矢印ボタンをクリックでセグメントを編集・削除することができます。"
},
"helpPageTooSlow": {
"message": "操作面倒"
"message": "こんな操作面倒"
},
"helpPageTooSlow1": {
"message": "ショートカットキーが利用可能です。セミコロンキーでスポンサーセグメントを開始/終了し、アポストロフィキーで送信できます。またこれらはオプションで変更できます。QWERTYキーを使わない場合は、キー割り当てを変更したほうがいいでしょう。"
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "この変更はすぐにあなたのセグメントに適用されます"
},
"downvote": {
"message": "低評価"
},
"upvote": {
"message": "高評価"
},
"hideSegment": {
"message": "セグメントを表示しない"
},
"SponsorTimeEditScrollNewFeature": {
"message": "編集ボックスにカーソルを合わせながらマウスホイールを使用すると、時間をすばやく調整できます。 CtrlキーまたはShiftキーの組み合わせを使用して変更を微調整できます。"
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "これはYouTubeにデフォルトで使用されているショートカットです。本当にこれを使用しますか"
},
"betaServerWarning": {
"message": "ベータサーバーが有効です!"
},
"openOptionsPage": {
"message": "オプションページを開く"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "공개 사용자 ID 복사"
},
"copySegmentID": {
"message": "구간 ID 복사"
},
"discordAdvert": {
"message": "공식 디스코드 서버에 들어와서 기능 제안을 해주시거나 피드백을 남겨주세요!"
},
@@ -692,7 +695,7 @@
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "경고: 이 유형의 세그먼트는 한 번에 최대 하나씩 활성화될 수 있습니다. 여러 개를 제출하면 무작위 표시됩니다."
"message": "경고: 이 유형의 구간은 한 번에 최대 하나씩 활성화될 수 있습니다. 여러 개를 제출하면 무작위 하나가 표시됩니다."
},
"youMustSelectACategory": {
"message": "제출 해야하는 모든 구간의 카테고리를 설정해야합니다!"
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "당신의 구간에 즉시 적용될 것입니다"
},
"downvote": {
"message": "비추천"
},
"upvote": {
"message": "추천"
},
"hideSegment": {
"message": "구간 숨기기"
},
"SponsorTimeEditScrollNewFeature": {
"message": "편집 상자 위에 커서를 올린 채 스크롤하면 시간을 빠르게 조정할 수 있습니다. Ctrl이나 Shift 키를 누른 채로 스크롤하면 세밀한 조정이 가능합니다."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "기본 YouTube 단축키와 겹칩니다. 그래도 사용하시겠습니까?"
},
"betaServerWarning": {
"message": "베타 서버가 활성화되었습니다!"
},
"openOptionsPage": {
"message": "설정 페이지 열기"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Publieke gebruikers-ID kopiëren"
},
"copySegmentID": {
"message": "Segment-ID kopiëren"
},
"discordAdvert": {
"message": "Word lid van de officiële Discord-server om suggesties en feedback te geven!"
},
@@ -210,13 +213,13 @@
"message": "Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen"
},
"enableTrackDownvotes": {
"message": "Segment-downvotes opslaan"
"message": "Segment-tegenstemmen opslaan"
},
"whatTrackDownvotes": {
"message": "Segmenten waarop u een downvote doet, blijven verborgen, zelfs na vernieuwen"
"message": "Segmenten waarop u een tegenstem doet, blijven verborgen, zelfs na vernieuwen"
},
"trackDownvotesWarning": {
"message": "Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen downvotes verwijderd"
"message": "Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen tegenstemmen verwijderd"
},
"enableQueryByHashPrefix": {
"message": "Opvragen via hash-voorvoegsel"
@@ -701,7 +704,7 @@
"message": "(einde)"
},
"hiddenDueToDownvote": {
"message": "verborgen: downvote"
"message": "verborgen: tegenstem"
},
"hiddenDueToDuration": {
"message": "verborgen: te kort"
@@ -796,7 +799,7 @@
"message": "Doneren"
},
"considerDonating": {
"message": "Ontwikkeling helpen"
"message": "Ontwikkeling steunen"
},
"hideDonationLink": {
"message": "Donatiekoppeling verbergen"
@@ -820,7 +823,7 @@
"message": "Videosegmenten zullen automatisch worden overgeslagen als ze in de database worden gevonden. U kunt de popup openen door op het pictogram van de extensie te klikken om een voorbeeld te krijgen van wat ze zijn."
},
"helpPageHowSkippingWorks2": {
"message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op downvote te klikken! U kunt ook stemmen in de popup."
"message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op tegenstemmen te klikken! U kunt ook stemmen in de popup."
},
"Submitting": {
"message": "Indienen"
@@ -865,13 +868,13 @@
"message": "Meer informatie"
},
"CopyDownvoteButtonInfo": {
"message": "Doet een downvote en maakt een lokale kopie aan die u opnieuw kunt indienen"
"message": "Doet een tegenstem en maakt een lokale kopie aan die u opnieuw kunt indienen"
},
"OpenCategoryWikiPage": {
"message": "Wikipagina van deze categorie openen."
},
"CopyAndDownvote": {
"message": "Kopiëren en downvote doen"
"message": "Kopiëren en tegenstemmen"
},
"ContinueVoting": {
"message": "Doorgaan met stemmen"
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Dit is direct van toepassing op uw segmenten"
},
"downvote": {
"message": "Tegenstemmen"
},
"upvote": {
"message": "Stemmen"
},
"hideSegment": {
"message": "Segment verbergen"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Gebruik het muiswiel terwijl u over het invoerveld beweegt om de tijd snel aan te passen. Combinaties van de ctrl- of shift-toets kunnen worden gebruikt om de wijzigingen te verfijnen."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Dit is een ingebouwde YouTube-snelkoppeling. Weet u zeker dat u deze wilt gebruiken?"
},
"betaServerWarning": {
"message": "BETAserver is ingeschakeld!"
},
"openOptionsPage": {
"message": "Pagina met opties openen"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopiuj publiczny identyfikator użytkownika"
},
"copySegmentID": {
"message": "Kopiuj ID segmentu"
},
"discordAdvert": {
"message": "Dołącz do oficjalnego serwera na discordzie i podziel się wrażeniami i sugestiami!"
},
@@ -591,6 +594,9 @@
"category_preview_description": {
"message": "Szybkie podsumowanie poprzednich odcinków lub podgląd tego, co pojawia się później w bieżącym filmie. Dotyczy zmontowanych klipów, a nie ustnych podsumowań."
},
"category_filler": {
"message": "Wypełniacz Nietematyczny/Żart"
},
"category_filler_description": {
"message": "Sceny nietematyczne dodawane tylko jako wypełniacz lub dla humoru, które nie są wymagane do zrozumienia głównej treści filmu. Nie powinno to obejmować segmentów zawierających informacje kontekstowe lub szczegółowe."
},
@@ -873,6 +879,9 @@
"ChangeCategoryTooltip": {
"message": "To natychmiastowo zostanie zastosowane do twoich segmentów"
},
"hideSegment": {
"message": "Ukryj segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany."
},
@@ -923,5 +932,8 @@
},
"youtubeKeybindWarning": {
"message": "To jest wbudowany skrót YouTube. Czy na pewno chcesz go użyć?"
},
"betaServerWarning": {
"message": "Serwer BETA jest włączony!"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Copiar ID Pública de Usuário"
},
"copySegmentID": {
"message": "Copiar ID do segmento"
},
"discordAdvert": {
"message": "Junte-se ao servidor do discord oficial para dar dicas e sugestões!"
},
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Isto irá aplicar instantaneamente seus segmentos"
},
"downvote": {
"message": "Voto negativo"
},
"upvote": {
"message": "Voto positivo"
},
"hideSegment": {
"message": "Ocultar segmento"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Este já é um atalho padrão do YouTube. Tem certeza que deseja utilizá-lo?"
},
"betaServerWarning": {
"message": "Os Servidores BETA estão ativos!"
},
"openOptionsPage": {
"message": "Abrir página de opções"
}
}

View File

@@ -118,6 +118,34 @@
"submitCheck": {
"message": "Tem a certeza que pretende submeter?"
},
"whitelistChannel": {
"message": "Meter canal na Lista Branca"
},
"removeFromWhitelist": {
"message": "Remover canal da Lista Branca"
},
"voteOnTime": {
"message": "Votar em um segmento"
},
"Submissions": {
"message": "Submissões"
},
"savedPeopleFrom": {
"message": "Salvaste pessoas de "
},
"viewLeaderboard": {
"message": "Tabela de Classificação"
},
"recordTimesDescription": {
"message": "Enviar"
},
"submissionEditHint": {
"message": "A edição da seção aparecerá depois que você clicar em enviar",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Dica: Você pode configurar atalhos de teclado para enviar nas opções"
},
"clearTimesButton": {
"message": "Limpar Intervalos"
},
@@ -127,9 +155,15 @@
"publicStats": {
"message": "Isto é usado na página pública de estatísticas que mostra o quanto já contríbuíu. Veje-a"
},
"Username": {
"message": "Nome de Utilizador"
},
"setUsername": {
"message": "Criar nomde de utilizador"
},
"copyPublicID": {
"message": "Copiar UserID Publico"
},
"discordAdvert": {
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
},
@@ -148,18 +182,48 @@
"hideButtonsDescription": {
"message": "Isto esconde os botões que aparecem no player do Youtube para submeter patrocínios. Entendemos que possa ser\n incómodo a algumas pessoas. Em vez de usar esses botões pode usar os do popup. Para esconder a mensagem que aparece, \n ususe o botão na mesma que diz \"Don't show this again\". Pode sempre reactivar estas definições novamente."
},
"showSkipButton": {
"message": "Mantenha o Botão Saltar para Destaque no Player"
},
"showInfoButton": {
"message": "Mostrar botão de Informações no player do Youtube"
},
"hideInfoButton": {
"message": "Esconder botão de Informações no player do Youtube"
},
"autoHideInfoButton": {
"message": "Ocultar automaticamente o Botão de Informação"
},
"hideDeleteButton": {
"message": "Esconder botão de Apagar no player do Youtube"
},
"showDeleteButton": {
"message": "Mostrar botão de Apagar no player do Youtube"
},
"enableViewTracking": {
"message": "Ativar Rastreamento de Contagem de Saltos"
},
"whatViewTracking": {
"message": "Esse recurso rastreia quais segmentos você pulou para permitir que os usuários saibam o quanto seu envio ajudou outras pessoas e é usado como métrica junto com votos positivos para garantir que o spam não entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espero que a maioria das pessoas não altere essa configuração para que os números de visualização sejam precisos. :)"
},
"enableViewTrackingInPrivate": {
"message": "Ativar o Rastreamento de Contagem de Saltos nas Guias Privadas/Anônimas"
},
"enableTrackDownvotes": {
"message": "Guardar segmentos de votos negativos"
},
"whatTrackDownvotes": {
"message": "Quaisquer segmentos que você votar negativo permanecerão ocultos mesmo após a atualização"
},
"trackDownvotesWarning": {
"message": "Aviso: Ao desabilitar isso excluirá todos os votos negativos armazenados anteriormente"
},
"enableQueryByHashPrefix": {
"message": "Consulta por Prefixo de Hash"
},
"whatQueryByHashPrefix": {
"message": "Em vez de solicitar segmentos do servidor usando o ID do Vídeo, são enviados os primeiros 4 caracteres do hash do ID do Vídeo. Este servidor enviará de volta dados para todos os vídeos com hashes semelhantes."
},
"showNotice": {
"message": "Mostrar notificação outra vez"
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Sari peste"
},
"unmute": {
"message": "Activare sunet"
},
"paused": {
"message": "Pauză"
},
@@ -79,9 +82,15 @@
"sponsorEnd": {
"message": "Segmentul se termină acum"
},
"sponsorCancel": {
"message": "Anulare creare segment"
},
"noVideoID": {
"message": "Nu s-a găsit niciun videoclip YouTube.\nDacă acest lucru este incorect, actualizați fila."
},
"refreshSegments": {
"message": "Reîmprospătare segmente"
},
"success": {
"message": "Succes!"
},
@@ -152,6 +161,9 @@
"setUsername": {
"message": "Setează Numele De Utilizator"
},
"copyPublicID": {
"message": "Copiază ID-Utilizator Public"
},
"discordAdvert": {
"message": "Vino și alătură-te serverului oficial de discord pentru a oferi sugestii și feedback!"
},

View File

@@ -144,7 +144,7 @@
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Подсказка: Вы можете настроить сочетания клавиш для отправки в опциях"
"message": "Подсказка: Вы можете настроить сочетания клавиш для отправки в настройках"
},
"clearTimesButton": {
"message": "Очистить время"
@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Копировать публичный UserID"
},
"copySegmentID": {
"message": "Копировать ID сегмента"
},
"discordAdvert": {
"message": "Присоединяйтесь к официальному серверу Discord, чтобы оставить предложения и обратную связь!"
},
@@ -735,7 +738,7 @@
"message": "Принудительная проверка каналов перед пропуском"
},
"whatForceChannelCheck": {
"message": "По умолчанию расширение пропускает сегменты сразу же, не проверяя то, какой это канал. По умолчанию некоторые сегменты в начале видео могут быть пропущены на каналах из белого списка. Включение этой опции предотвратит это, но все пропуски будут иметь небольшую задержку, так как получение ID канала может занять некоторое время. Эта задержка может быть незаметной, если у вас быстрый интернет."
"message": "По умолчанию расширение пропускает сегменты сразу же, не проверяя то, какой это канал. По умолчанию некоторые сегменты в начале видео могут быть пропущены на каналах из белого списка. Включение этой настройки предотвратит это, но все пропуски будут иметь небольшую задержку, так как получение ID канала может занять некоторое время. Эта задержка может быть незаметной, если у вас быстрый интернет."
},
"forceChannelCheckPopup": {
"message": "Рекомендуем включить \"Принудительная проверка каналов перед пропуском\""
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Это мгновенно применится к вашим сегментам"
},
"downvote": {
"message": "Голос «против»"
},
"upvote": {
"message": "Голос «за»"
},
"hideSegment": {
"message": "Скрыть сегмент"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Наведите курсор на поле редактирования и используйте колесо мыши для быстрой настройки времени. Клавиши Ctrl или Shift могут быть использованы для точной настройки."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Это сочетание используется на сайте YouTube. Вы уверены, что хотите его использовать?"
},
"betaServerWarning": {
"message": "Используется BETA сервер!"
},
"openOptionsPage": {
"message": "Открыть страницу настроек"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Skopírovať verejné ID používateľa"
},
"copySegmentID": {
"message": "Skopírovať ID segmentu"
},
"discordAdvert": {
"message": "Pripojte sa k oficiálnemu Discord serveru a zanechajte nám pripomienky!"
},
@@ -831,6 +834,15 @@
"ChangeCategoryTooltip": {
"message": "Týmto ihneď vykonáte zmeny v segmentoch"
},
"downvote": {
"message": "Hlasovať proti"
},
"upvote": {
"message": "Hlasovať za"
},
"hideSegment": {
"message": "Skryť segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Čas môžete rýchlo zmeniť kolieskom myši, ak je kurzor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift."
},
@@ -844,5 +856,11 @@
"hourAbbreviation": {
"message": "h",
"description": "100h"
},
"betaServerWarning": {
"message": "Je zapnutý BETA server!"
},
"openOptionsPage": {
"message": "Otvoriť stránku s nastaveniami"
}
}

View File

@@ -1,20 +1,20 @@
{
"fullName": {
"message": "SponsorBlock for YouTube - Skip Sponsorships",
"message": "SponsorBlock för YouTube - Hoppa över sponsringar",
"description": "Name of the extension."
},
"Description": {
"message": "Hoppa över sponsring, prenumerationstiggande och mer på YouTube-videor. Rapportera sponsorer på videor du tittar på för att spara andras tid.",
"message": "Hoppa över sponsringar, prenumerationstiggande och mer på YouTube-videor. Rapportera sponsorer på videor du tittar på för att spara andras tid.",
"description": "Description of the extension."
},
"400": {
"message": "Servern sa att denna begäran var ogiltig"
},
"429": {
"message": "Du har rapporterat för många sponsormeddelanden för den här videon, är du säker att det finns så många?"
"message": "Du har skickat in för många sponsormeddelanden för den här videon. Är du säker att det finns så många?"
},
"409": {
"message": "Den här har redan blivit rapporterad"
"message": "Den här har redan skickats in"
},
"channelWhitelisted": {
"message": "Kanalen är vitlistad!"
@@ -44,7 +44,7 @@
"message": "Visa aldrig"
},
"hitGoBack": {
"message": "Tryck på Tillbaka för att ångra åtgärden."
"message": "Tryck på Hoppa inte över för att återgå till där du kom i från."
},
"unskip": {
"message": "Hoppa inte över"
@@ -116,7 +116,7 @@
"message": "Skicka in segment"
},
"submitCheck": {
"message": "Är du säker på att du vill rapportera detta?"
"message": "Är du säker på att du vill skicka in detta?"
},
"whitelistChannel": {
"message": "Vitlistkanal"
@@ -150,7 +150,7 @@
"message": "Rensa tider"
},
"submitTimesButton": {
"message": "Skicka tider"
"message": "Skicka in tider"
},
"publicStats": {
"message": "Detta kommer att användas på den publika statistiksidan för att visa hur mycket du har bidragit. Spana in den"
@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopiera publikt Användar-ID"
},
"copySegmentID": {
"message": "Kopiera Segment-ID"
},
"discordAdvert": {
"message": "Gå med i den officiella discordservern för att ge förslag och feedback!"
},
@@ -183,7 +186,7 @@
"message": "Detta döljer knapparna på YouTube-spelaren som du kan skicka in segment med som ska hoppas över."
},
"showSkipButton": {
"message": "Behåll knappen hoppa till markerat på spelaren"
"message": "Behåll knappen hoppa till höjdpunkt på spelaren"
},
"showInfoButton": {
"message": "Visa Infoknapp På YouTube-spelaren"
@@ -280,7 +283,7 @@
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Skicka in segment",
"message": "Skicka segment",
"description": "Keybind label"
},
"keybindDescription": {
@@ -497,7 +500,7 @@
"message": "Denna JSON är inte korrekt formaterad. Dina alternativ har inte ändrats."
},
"confirmNoticeTitle": {
"message": "Skicka in segment"
"message": "Skicka segment"
},
"submit": {
"message": "Skicka"
@@ -610,7 +613,7 @@
"message": "Icke-musik"
},
"category_poi_highlight": {
"message": "Markera"
"message": "Höjdpunkt"
},
"category_poi_highlight_description": {
"message": "Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"."
@@ -688,7 +691,7 @@
"message": "Välj en kategori"
},
"enableThisCategoryFirst": {
"message": "För att skicka segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.",
"message": "För att skicka in segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
@@ -865,7 +868,7 @@
"message": "Läs mer"
},
"CopyDownvoteButtonInfo": {
"message": "Rösta ner och skapar en lokal kopia för dig att skicka igen"
"message": "Rösta ner och skapar en lokal kopia för dig att skicka in igen"
},
"OpenCategoryWikiPage": {
"message": "Öppna denna kategoris wiki-sida."
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Detta kommer omedelbart att verkställas till dina segment"
},
"downvote": {
"message": "Rösta ner"
},
"upvote": {
"message": "Rösta upp"
},
"hideSegment": {
"message": "Dölj segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Använd mushjulet medan du håller muspekaren över redigeringsrutan för att snabbt justera tiden. Kombinationer av CTRL- eller SKIFT-tangenten kan användas för att finjustera tiden."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Detta är en inbyggd YouTube-genväg. Är du säker på att du vill använda den?"
},
"betaServerWarning": {
"message": "BETA-servern är aktiverad!"
},
"openOptionsPage": {
"message": "Öppna alternativsidan"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "பொது பயனர் IDயை நகலெடுக்கவும்"
},
"copySegmentID": {
"message": "துண்டத்தின் IDஐ நகலெடு"
},
"discordAdvert": {
"message": "பரிந்துரைகள் மற்றும் கருத்துக்களை வழங்க அதிகாரப்பூர்வ டிஸ்கார்ட் சேவையகத்தில் சேர வாருங்கள்!"
},
@@ -209,6 +212,15 @@
"enableViewTrackingInPrivate": {
"message": "தனிப்பட்ட/மறைநிலை தாவல்களில் ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கவும்"
},
"enableTrackDownvotes": {
"message": "துண்டத்தின் வாக்கிறக்கங்களைச் சேமி"
},
"whatTrackDownvotes": {
"message": "புதுப்பித்தப் பின் நீங்கள் வாக்கிறக்கிய துண்டங்கள் மறைந்தே இருக்கும்"
},
"trackDownvotesWarning": {
"message": "எச்சரிக்கை: இதை முடக்குதல் முன்னர் சேமித்த எல்லா வாக்கிறக்கங்களையும் அழிக்கும்"
},
"enableQueryByHashPrefix": {
"message": "ஹாஷ் முன்னொட்டு மூலம் வினவல்"
},
@@ -262,6 +274,18 @@
"message": "உங்களுக்கு இன்னும் பிடிக்கவில்லை என்றால், ஒருபோதும் காண்பி பொத்தானை அழுத்தவும்.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "துண்டத்தைக் கெந்து",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "துண்டத்தை ஆரம்பி/நிறுத்து",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "துண்டங்களைச் சமர்ப்பி",
"description": "Keybind label"
},
"0": {
"message": "இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்."
},
@@ -287,6 +311,10 @@
"mute": {
"message": "ஒலியடக்கு"
},
"full": {
"message": "முழு காணொளி",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "{0} ஐ தவிர்?"
},
@@ -444,6 +472,15 @@
"exportOptions": {
"message": "அனைத்து விருப்பங்களையும் இறக்குமதி / ஏற்றுமதி"
},
"exportOptionsCopy": {
"message": "திருத்து/நகலெடு"
},
"exportOptionsDownload": {
"message": "கோப்பிற்கு சேமி"
},
"exportOptionsUpload": {
"message": "கோப்பிலிருந்து ஏற்று"
},
"whatExportOptions": {
"message": "இது JSON இல் உங்கள் முழு உள்ளமைவு. இது உங்கள் பயனர் ஐடியை உள்ளடக்கியது, எனவே இதை புத்திசாலித்தனமாக பகிர்ந்து கொள்ளுங்கள்."
},
@@ -508,6 +545,9 @@
"category_selfpromo_description": {
"message": "செலுத்தப்படாத அல்லது சுய விளம்பரத்தைத் தவிர \"ஸ்பான்சர்\" போன்றது. பொருட்கள், நன்கொடைகள் அல்லது அவர்கள் யாருடன் ஒத்துழைத்தார்கள் என்பது பற்றிய தகவல்கள் இதில் அடங்கும்."
},
"category_exclusive_access": {
"message": "பிரத்யேக அணுகல்"
},
"category_interaction": {
"message": "தொடர்பு நினைவூட்டல் (குழுசேர்)"
},
@@ -538,6 +578,9 @@
"category_preview_description": {
"message": "முந்தைய எபிசோடுகளின் விரைவான மறுபரிசீலனை அல்லது தற்போதைய வீடியோவில் பின்னர் என்ன வரப்போகிறது என்பதற்கான முன்னோட்டம். ஒன்றாக தொகுக்கப்பட்ட கிளிப்புகள், பேசப்பட்ட சுருக்கங்களுக்கு அல்ல."
},
"category_filler_short": {
"message": "நிரப்பி"
},
"category_music_offtopic": {
"message": "இசை: இசை அல்லாத பிரிவு"
},
@@ -571,6 +614,16 @@
"disable": {
"message": "முடக்கு"
},
"autoSkip_POI": {
"message": "துவக்கத்திற்கு தானாகக் கெந்து"
},
"manualSkip_POI": {
"message": "காணொளி ஏறுகையில் கேள்"
},
"previewColor": {
"message": "சமர்ப்பிக்கப்படாதவை நிறம்",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "பார் வண்ணத்தைத் தேடுங்கள்"
},
@@ -615,6 +668,15 @@
"hiddenDueToDuration": {
"message": "மறைக்கப்பட்ட: மிகக் குறுகிய"
},
"manuallyHidden": {
"message": "கைமுறையாக மறைக்கப்பட்டது"
},
"acceptPermission": {
"message": "அனுமதியை ஏற்றுக்கொள்"
},
"permissionRequestSuccess": {
"message": "அனுமதி கோரிக்கை வெற்றி!"
},
"forceChannelCheck": {
"message": "தவிர்ப்பதற்கு முன் சேனல் சோதனை கட்டாயப்படுத்தவும்"
},
@@ -627,6 +689,9 @@
"downvoteDescription": {
"message": "தவறான / தவறான நேரம்"
},
"incorrectCategory": {
"message": "வகையை மாற்று"
},
"nonMusicCategoryOnMusic": {
"message": "இந்த வீடியோ இசை என வகைப்படுத்தப்பட்டுள்ளது. இதற்கு ஒரு ஸ்பான்சர் இருப்பதை நீங்கள் உறுதியாக நம்புகிறீர்களா? இது உண்மையில் \"இசை அல்லாத பிரிவு\" என்றால், நீட்டிப்பு விருப்பங்களைத் திறந்து இந்த வகையை இயக்கவும். பின்னர், நீங்கள் இந்த பகுதியை ஸ்பான்சருக்கு பதிலாக \"இசை அல்லாதது\" என்று சமர்ப்பிக்கலாம். நீங்கள் குழப்பமாக இருந்தால் வழிகாட்டுதல்களைப் படிக்கவும்."
},
@@ -645,5 +710,82 @@
},
"categoryUpdate2": {
"message": "அறிமுகங்கள், அவுட்ரோஸ், மெர்ச் போன்றவற்றைத் தவிர்க்க விருப்பங்களைத் திறக்கவும்."
},
"help": {
"message": "உதவி"
},
"GotIt": {
"message": "புரிந்தது",
"description": "Used as the button to dismiss a tooltip"
},
"hideForever": {
"message": "என்றென்றும் மறை"
},
"Donate": {
"message": "கொடையளி"
},
"hideDonationLink": {
"message": "நன்கொடை இணைப்பை மறை"
},
"darkModeOptionsPage": {
"message": "தெரிவுகள் பக்கத்தில் இருண்ட பயன்முறை"
},
"helpPageThanksForInstalling": {
"message": "ஸ்பான்சர்ப்ளாக் நிறுவியதற்கு நன்றி."
},
"ContinueVoting": {
"message": "தொடர்ந்து வாக்களி"
},
"ChangeCategoryTooltip": {
"message": "இது உம் துண்டங்களை உடனடியாகச் செயல்படுத்தும்"
},
"downvote": {
"message": "வாக்கிறக்கு"
},
"upvote": {
"message": "வாக்கேற்று"
},
"hideSegment": {
"message": "துண்டத்தை மறை"
},
"dayAbbreviation": {
"message": "நா",
"description": "100d"
},
"hourAbbreviation": {
"message": "ம",
"description": "100h"
},
"optionsTabBehavior": {
"message": "நடத்தை",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "இடைமுகம்",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "விசைப்பலகை குறுக்குவழிகள்",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "காப்புநகல்/மீட்டெடுப்பு",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "இதர",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"notSet": {
"message": "அமைக்கவில்லை"
},
"change": {
"message": "மாற்று"
},
"betaServerWarning": {
"message": "பீட்டா சேவையகம் இயக்கப்பட்டுள்ளது!"
},
"openOptionsPage": {
"message": "தெரிவுகள் பக்கத்தைத் திற"
}
}

View File

@@ -817,19 +817,19 @@
"message": "Atlama nasıl çalışıyor"
},
"helpPageHowSkippingWorks1": {
"message": "Video kısımları veri tabanında mevcut ise otomatikman atlanır. Eklentinin simgesine tıklayınca açılan pencereden, video için mevcut olan kısımları görebilirsiniz."
"message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya."
},
"helpPageHowSkippingWorks2": {
"message": "Bir kısmı atladığınızda size bildirim gönderilir. Eğer kısım hatalıysa bunu eksi oylayınız. Eklentinin penceresinde de oy verebilirsiniz."
"message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på downvote! Du kan også stemme i popup-vinduet."
},
"Submitting": {
"message": "Gönderme"
"message": "Submitting"
},
"helpPageSubmitting1": {
"message": "Gönderi, açılır pencerede \"Kısım Şimdi Başlıyor\" düğmesine basılarak veya oynatıcıdaki düğmelerle video oynatıcıda yapılabilir."
"message": "Indsendelse kan enten ske i popup-vinduet ved at trykke på \"Segment Begynder Nu\"-knappen eller i videoafspilleren med knapperne på afspilleren."
},
"helpPageSubmitting2": {
"message": "Oynat düğmesine tıklamak bir kısımın başlangıcını, durdurma simgesine tıklamak ise bitişini gösterir. Gönder düğmesine basmadan önce birden fazla sponsor hazırlayabilirsiniz. Yükle düğmesine tıklamak kısımları gönderir. Çöp kutusuna tıkladığınızda silinir."
"message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete."
},
"Editing": {
"message": "Düzenleme"
@@ -929,5 +929,8 @@
},
"youtubeKeybindWarning": {
"message": "Bu kısayol YouTube tarafından kullanılıyor. Bunu kullanmak istediğinize emin misiniz?"
},
"openOptionsPage": {
"message": "Seçenekler sayfasını aç"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Копіювати публічний UserID"
},
"copySegmentID": {
"message": "Копіювати ID сегменту"
},
"discordAdvert": {
"message": "Приєднуйтесь до офіційного сервера Discord, щоб залишити пропозиції і зворотний зв'язок!"
},
@@ -879,6 +882,15 @@
"ChangeCategoryTooltip": {
"message": "Це миттєво буде застосовано до ваших сегментів"
},
"downvote": {
"message": "Голос \"проти\""
},
"upvote": {
"message": "Голос \"за\""
},
"hideSegment": {
"message": "Приховати сегмент"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін."
},
@@ -929,5 +941,11 @@
},
"youtubeKeybindWarning": {
"message": "Це вбудована комбінація YouTube. Ви впевнені що хочете її використовувати?"
},
"betaServerWarning": {
"message": "BETA сервер увімкнено!"
},
"openOptionsPage": {
"message": "Відкрити сторінку налаштувань"
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Sao chép Public UserID"
},
"copySegmentID": {
"message": "Sao chép ID phân đoạn"
},
"discordAdvert": {
"message": "Hãy tham gia server Discord chính thức để đưa ra gợi ý và phản hồi!"
},
@@ -209,6 +212,15 @@
"enableViewTrackingInPrivate": {
"message": "Bật việc theo dõi số lượng người bỏ qua phân đoạn trong tab Riêng tư/Ẩn danh"
},
"enableTrackDownvotes": {
"message": "Lưu trữ phiếu phản đối phân đoạn"
},
"whatTrackDownvotes": {
"message": "Bất kỳ phân đoạn nào bạn phản đối sẽ vẫn bị ẩn ngay cả sau khi làm mới"
},
"trackDownvotesWarning": {
"message": "Cảnh báo: Tắt tính năng này sẽ xóa tất cả các phiếu phản đối đã lưu trữ trước đó"
},
"enableQueryByHashPrefix": {
"message": "Truy vấn theo Hash Prefix"
},
@@ -262,6 +274,21 @@
"message": "Nếu bạn vẫn không thích, hãy nhấn nút không hiển thị lại.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "Bỏ qua phân đoạn",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "Bắt đầu/dừng phân đoạn",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Gửi phân đoạn",
"description": "Keybind label"
},
"keybindDescription": {
"message": "Chọn một phím bằng cách nhập nó và chọn bất kỳ phím bổ trợ nào bạn muốn sử dụng."
},
"0": {
"message": "Kết nối quá hạn thời gian. Hãy kiểm tra đường truyền mạng của bạn. Nếu mạng của bạn vẫn hoạt động, có thể máy chủ đang bị quá tải hoặc không hoạt động."
},
@@ -421,6 +448,9 @@
"shortCheck": {
"message": "Đoạn quảng cáo sau ngắn hơn tùy chọn độ dài ngắn nhất của bạn. Điều này có thể có nghĩa là nó đã được đăng rồi, và không được bỏ qua vì tùy chọn này. Bạn có chắc muốn đăng nó không?"
},
"liveOrPremiere": {
"message": "Không được phép gửi trên một buổi phát trực tiếp hoặc buổi ra mắt đang hoạt động. Vui lòng đợi cho đến khi kết thúc, sau đó làm mới trang xác minh rằng các phân đoạn vẫn hợp lệ."
},
"showUploadButton": {
"message": "Hiển thị nút tải lên"
},
@@ -448,6 +478,15 @@
"exportOptions": {
"message": "Nhập/xuất tất cả tùy chọn"
},
"exportOptionsCopy": {
"message": "Chỉnh sửa/sao chép"
},
"exportOptionsDownload": {
"message": "Lưu vào tệp"
},
"exportOptionsUpload": {
"message": "Tải từ tệp"
},
"whatExportOptions": {
"message": "Đây là toàn bộ cấu hình của bạn trong tệp JSON. Nó chứa cả mã người dùng của bạn, nên hãy chia sẻ cẩn thận."
},
@@ -496,6 +535,9 @@
"copyDebugInformationComplete": {
"message": "Thông tin gỡ lỗi đã được sao chép vào bộ nhớ tạm. Hãy thoải mái xóa thông tin mà bạn không muốn chia sẻ. Lưu thông tin này vào một tập tin văn bản hoặc dán nó vào bản báo cáo lỗi."
},
"keyAlreadyUsed": {
"message": "Phím tắt này liên kết với một hành động khác. Vui lòng chọn một cái khác."
},
"to": {
"message": "đến",
"description": "Used between segments. Example: 1:20 to 1:30"
@@ -515,6 +557,13 @@
"category_exclusive_access": {
"message": "Truy cập riêng"
},
"category_exclusive_access_description": {
"message": "Chỉ để dán nhãn cho toàn bộ video. Được sử dụng khi video giới thiệu một sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp."
},
"category_exclusive_access_pill": {
"message": "Video này giới thiệu sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp",
"description": "Short description for this category"
},
"category_interaction": {
"message": "Nhắc tương tác (Đăng ký)"
},
@@ -593,12 +642,19 @@
"showOverlay_POI": {
"message": "Hiện ở thanh xem trước"
},
"showOverlay_full": {
"message": "Hiển thị nhãn"
},
"autoSkipOnMusicVideos": {
"message": "Tự động bỏ qua tất cả các phân đoạn nếu trong video có phân đoạn không phải nhạc"
},
"muteSegments": {
"message": "Cho phép các phân đoạn bị tắt tiếng hay vì bỏ qua"
},
"fullVideoSegments": {
"message": "Hiển thị biểu tượng khi video hoàn toàn là quảng cáo",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
},
"previewColor": {
"message": "Màu khi chưa được gửi đi",
"description": "Referring to submissions that have not been sent to the server yet."
@@ -650,6 +706,9 @@
"hiddenDueToDuration": {
"message": "đã bị ẩn: quá ngắn"
},
"manuallyHidden": {
"message": "ẩn thủ công"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "Không xác định được ID kênh. Nếu bạn đang xem video này trên 1 trang web thứ 3, hãy mở lại video này trên trang chủ Youtube rồi thử lại. Điều này cũng có thể do những thay đổi trong mã nguồn trang web YouTube, nếu bạn nghĩ vậy, hãy bình luận tại đây:"
@@ -713,6 +772,9 @@
"message": "Đã hiểu",
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "Phân đoạn này là lớn. Nếu toàn bộ video nói về một chủ đề, hãy chuyển từ \"Bỏ qua\" thành \"Toàn bộ video\". Xem hướng dẫn để biết thêm thông tin."
},
"categoryPillTitleText": {
"message": "Toàn bộ video này được gắn thẻ vào thể loại này và được tích hợp quá chặt chẽ để có thể tách ra"
},
@@ -733,9 +795,15 @@
"Donate": {
"message": "Ủng hộ"
},
"considerDonating": {
"message": "Hỗ trợ phát triển cấp quỹ"
},
"hideDonationLink": {
"message": "Ẩn link donate"
},
"darkModeOptionsPage": {
"message": "Chế độ tối trên trang tùy chọn"
},
"helpPageThanksForInstalling": {
"message": "Cảm ơn bạn đã cài đặt SponsorBlock."
},
@@ -811,6 +879,15 @@
"ChangeCategoryTooltip": {
"message": "Điều này sẽ ngay lập tức áp dụng cho phân đoạn của bạn"
},
"downvote": {
"message": "Phản đối"
},
"upvote": {
"message": "Bình chọn"
},
"hideSegment": {
"message": "Ẩn phân đoạn"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Sử dụng con lăn chuột của bạn khi di chuột qua hộp chỉnh sửa để nhanh chóng điều chỉnh thời gian. Kết hợp phím ctrl hoặc shift có thể được sử dụng để tinh chỉnh các thay đổi."
},
@@ -824,5 +901,48 @@
"hourAbbreviation": {
"message": "h",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Hành vi",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "Giao diện",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "Phím tắt bàn phím",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "Sao lưu/Khôi phục",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Điều khoản khác",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Bỏ qua thông báo xuất hiện",
"description": "Option label"
},
"unbind": {
"message": "Gỡ liên kết",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Chưa thiết lập"
},
"change": {
"message": "Thay đổi"
},
"youtubeKeybindWarning": {
"message": "Đây là lối tắt YouTube được tích hợp sẵn. Bạn có chắc chắn muốn sử dụng nó không?"
},
"betaServerWarning": {
"message": "Máy chủ BETA đã được kích hoạt!"
},
"openOptionsPage": {
"message": "Mở trang tùy chọn"
}
}

View File

@@ -161,6 +161,12 @@
"setUsername": {
"message": "設定使用者名稱"
},
"copyPublicID": {
"message": "複製公開使用者ID"
},
"copySegmentID": {
"message": "複製片段ID"
},
"discordAdvert": {
"message": "快加入官方 Discord 伺服器來給予建議和反應!"
},
@@ -179,6 +185,9 @@
"hideButtonsDescription": {
"message": "這會隱藏 YouTube 播放器上提交片段的按鈕"
},
"showSkipButton": {
"message": "在播放器保留跳至精華按鈕"
},
"showInfoButton": {
"message": "在 YouTube 播放器上顯示資訊按鈕"
},
@@ -203,6 +212,15 @@
"enableViewTrackingInPrivate": {
"message": "在私人/無痕分頁啟用跳過次數追蹤"
},
"enableTrackDownvotes": {
"message": "儲存片段倒讚"
},
"whatTrackDownvotes": {
"message": "所有你按倒讚的片段在重新整理後仍會保留"
},
"trackDownvotesWarning": {
"message": "警告:停用此將刪除所有之前儲存的倒讚"
},
"enableQueryByHashPrefix": {
"message": "使用雜湊前綴查詢"
},
@@ -221,6 +239,21 @@
"showSkipNotice": {
"message": "在跳過片段後顯示通知"
},
"noticeVisibilityMode0": {
"message": "完整大小的略過提醒"
},
"noticeVisibilityMode1": {
"message": "小的自動略過提醒"
},
"noticeVisibilityMode2": {
"message": "所有小的略過提醒"
},
"noticeVisibilityMode3": {
"message": "消逝的自動跳過提醒"
},
"noticeVisibilityMode4": {
"message": "所有消逝的略過提醒"
},
"longDescription": {
"message": "SponsorBlock 讓您可以跳過贊助工商,開場動畫,結束動畫,訂閱提醒等煩人的 YouTube 影片片段。SponsorBlock 是個大眾外包的網頁瀏覽器擴充功能,能讓任何人提交贊助片段的始與末。當一個人提交這個片段後,所有使用這個擴充功能的人都可以跳過該片段。您也可以跳過在音樂中的非音樂片段",
"description": "Full description of the extension on the store pages."
@@ -241,6 +274,21 @@
"message": "如果您還是不喜歡它,請按下永不顯示按鈕",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "略過片段",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "開始/停止片段",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "提交片段",
"description": "Keybind label"
},
"keybindDescription": {
"message": "按下按鍵以選擇並選擇想要使用的修飾鍵"
},
"0": {
"message": "連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線"
},
@@ -263,13 +311,35 @@
"skip": {
"message": "略過"
},
"mute": {
"message": "靜音"
},
"full": {
"message": "整部影片",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "跳過 {0}"
},
"mute_category": {
"message": "要靜音 {0} 嗎?"
},
"skip_to_category": {
"message": "跳到 {0}",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} 已略過",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} 已靜音",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "已跳到 {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "停用自動跳過"
},
@@ -317,6 +387,9 @@
"changeUserID": {
"message": "匯入/匯出您的使用者 ID"
},
"whatChangeUserID": {
"message": "密鑰應被保密。它就像是密碼不應與他人分享。若密鑰落入他人手中他人將可以冒充你。若你在尋找你的公開使用者ID點擊彈出視窗上的剪貼簿圖示"
},
"setUserID": {
"message": "設定使用者 ID"
},
@@ -342,6 +415,9 @@
"addInvidiousInstance": {
"message": "新增第三方的客戶端實例"
},
"addInvidiousInstanceDescription": {
"message": "添加一個自定進程。它必須只有域名。例如invidious.ajay.app"
},
"add": {
"message": "新增"
},
@@ -372,6 +448,9 @@
"shortCheck": {
"message": "以下的提交小於您的最小時間設定。這表是它們可能已經被提交,只是被該設定忽略了。您確定要提交嗎?"
},
"liveOrPremiere": {
"message": "在進行中的直播或首播提交片段是不被允許的。請等到該直播完成後,重新整理頁面再重新確認片段並提交。"
},
"showUploadButton": {
"message": "顯示上傳按鈕"
},
@@ -399,6 +478,15 @@
"exportOptions": {
"message": "匯入/匯出所有設定"
},
"exportOptionsCopy": {
"message": "編輯/複製"
},
"exportOptionsDownload": {
"message": "儲存到檔案"
},
"exportOptionsUpload": {
"message": "從檔案載入"
},
"whatExportOptions": {
"message": "這是您全部設定的 JSON 格式。它包含了您的用戶 ID ,所以您一定要謹慎的保管它。"
},
@@ -447,6 +535,9 @@
"copyDebugInformationComplete": {
"message": "除錯資訊已複製到剪貼板中。您可以任意移除任何您不想分享的資訊。請將其另存為文字文件或貼到錯誤報告中。"
},
"keyAlreadyUsed": {
"message": "這個快捷鍵已被綁定到另一個動作,請另擇快捷鍵。"
},
"to": {
"message": "到",
"description": "Used between segments. Example: 1:20 to 1:30"
@@ -463,6 +554,16 @@
"category_selfpromo_description": {
"message": "類似 “贊助商廣告” ,但是非付費或自我推廣。這包括有關商品、捐贈或與他人合作的信息。"
},
"category_exclusive_access": {
"message": "獨家限定"
},
"category_exclusive_access_description": {
"message": "只限於標記整部影片,用於影片在獲得特殊或免費存取後,展示產品、服務或位置時使用。"
},
"category_exclusive_access_pill": {
"message": "此影片展示了獲得特殊或免費存取的產品、服務或位置",
"description": "Short description for this category"
},
"category_interaction": {
"message": "互動提醒 (訂閱)"
},
@@ -493,6 +594,15 @@
"category_preview_description": {
"message": "係指影片的前情提要或內容預告等刻意編輯過的內容"
},
"category_filler": {
"message": "離題閒聊/玩笑"
},
"category_filler_description": {
"message": "與影片主要內容無關的填充詞或笑話,但不應包含與前後或背景有關者"
},
"category_filler_short": {
"message": "填充詞"
},
"category_music_offtopic": {
"message": "音樂:非音樂部分"
},
@@ -505,6 +615,9 @@
"category_poi_highlight": {
"message": "重點"
},
"category_poi_highlight_description": {
"message": "大部分的人在影片尋找的部分。類似「影片在幾分幾秒開始」的留言"
},
"category_livestream_messages": {
"message": "直播:捐贈/訊息閱讀"
},
@@ -523,9 +636,28 @@
"disable": {
"message": "停用"
},
"autoSkip_POI": {
"message": "自動略過至開頭"
},
"manualSkip_POI": {
"message": "在影片載入時詢問"
},
"showOverlay_POI": {
"message": "在時間條顯示"
},
"showOverlay_full": {
"message": "顯示標籤"
},
"autoSkipOnMusicVideos": {
"message": "自動跳過非音樂片段(如果有的話)"
},
"muteSegments": {
"message": "允許靜音式片段"
},
"fullVideoSegments": {
"message": "在整個影片都是廣告時顯示圖示",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
},
"previewColor": {
"message": "未提交的顏色",
"description": "Referring to submissions that have not been sent to the server yet."
@@ -562,6 +694,9 @@
"message": "若想要提交{0} 類的分段,您必須要在選項內將其啟用。您現在將被重新導向至選項頁面。",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "注意:這種片段同時只能有一個啟用,提交多個片段將顯示隨機一個"
},
"youMustSelectACategory": {
"message": "您必須為所有您要提交的片段選擇類別!"
},
@@ -574,6 +709,9 @@
"hiddenDueToDuration": {
"message": "隱藏:太短"
},
"manuallyHidden": {
"message": "手動隱藏"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "未偵測到頻道ID如果您正在使用嵌入式YouTube播放器請移至YouTube網站上觀看本影片。此問題亦有可能是由於YouTube改變了系統架構如果你認為這是造成此問題的原因請留言告訴我們"
@@ -608,6 +746,9 @@
"downvoteDescription": {
"message": "不正確/錯誤的時間"
},
"incorrectCategory": {
"message": "變更類別"
},
"nonMusicCategoryOnMusic": {
"message": "這個影片被分類為音樂。您確定這有贊助內容嗎?如果這其實是\"非音樂片段\"的話,開啟擴充功能設定並啟用這個類別。接下來您即可提交這個片段為\"非音樂片段\"。如果您感到困惑,請閱讀方針"
},
@@ -634,6 +775,12 @@
"message": "知道了",
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "這個片段有點長,如果整部影片都跟一個主題有關,請將「跳過」改為「整部影片」。請參照方針以獲得更多資訊"
},
"categoryPillTitleText": {
"message": "這整部影片都被標示為此類別且過於相關而不可分開"
},
"experiementOptOut": {
"message": "關閉所有未來的實驗性功能",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -641,16 +788,164 @@
"hideForever": {
"message": "永久隱藏"
},
"warningChatInfo": {
"message": "你被記了警告所以暫時不能提交片段。這意味著我們注意到你在犯下常見的但不是可疑的錯誤,請確認你真的瞭解方針之內容後我們就會移除警告。你也可以加入 discord.gg/SponsorBlock 或 matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "投票因警告而被駁回。點擊以打開聊天室並解決之",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "贊助"
},
"considerDonating": {
"message": "資助開發"
},
"hideDonationLink": {
"message": "隱藏贊助選項"
},
"darkModeOptionsPage": {
"message": "選項頁面深色模式"
},
"helpPageThanksForInstalling": {
"message": "感謝你安裝 SponsorBlock。"
},
"helpPageReviewOptions": {
"message": "請確認以下選項"
},
"helpPageFeatureDisclaimer": {
"message": "許多功能預設為停用若欲跳過開頭、結尾或使用Invidious等在下方啟用它們。你也可以隱藏顯示介面內容"
},
"helpPageHowSkippingWorks": {
"message": "略過如何運作"
},
"helpPageHowSkippingWorks1": {
"message": "影片片段如果出現於資料庫將自動被略過,你可以點擊擴充功能圖示以打開浮窗以便預覽"
},
"helpPageHowSkippingWorks2": {
"message": "當你略過片段時,你會被提醒。若你認為跳過時間有誤,請按下倒讚以反對之。你也可以用浮窗投票。"
},
"Submitting": {
"message": "正在提交"
},
"helpPageSubmitting1": {
"message": "提交可以透過在浮窗內點擊「片段由此開始」按鈕或在影片播放器中的按鈕執行"
},
"helpPageSubmitting2": {
"message": "點擊播放按鈕表示片段的開始,停止按鈕表示結束。你可以在提交前設定多個片段。點擊上傳按鈕將會提交片段,點擊垃圾桶按鈕將會刪除片段"
},
"Editing": {
"message": "編輯中"
},
"helpPageEditing1": {
"message": "若你失誤了,你可以按下箭頭向上按鍵以編輯或刪除你的片段"
},
"helpPageTooSlow": {
"message": "這太慢了"
},
"helpPageTooSlow1": {
"message": "快捷鍵是被支援的按下分號以標示片段的開始或結束並按下逗號以提交。你可以在選項裡更改快捷鍵設定。若你不是用QWERTY鍵盤的話你應該更改設定。"
},
"helpPageCopyOfDatabase": {
"message": "我可以下載資料庫嗎?作者消失怎麼辦?"
},
"helpPageCopyOfDatabase1": {
"message": "資料庫是公開的且可以在這取用:"
},
"helpPageCopyOfDatabase2": {
"message": "原始碼是公開的,若作者發生狀況,你的提交將不會化為烏有"
},
"helpPageNews": {
"message": "消息和製作過程"
},
"helpPageSourceCode": {
"message": "我在哪裡可以找到原始碼?"
},
"Credits": {
"message": "致謝"
},
"LearnMore": {
"message": "了解更多"
},
"CopyDownvoteButtonInfo": {
"message": "按倒讚和建立本機副本以便你重新提交"
},
"OpenCategoryWikiPage": {
"message": "打開此類別之維基頁面"
},
"CopyAndDownvote": {
"message": "複製並按倒讚"
},
"ContinueVoting": {
"message": "繼續投票"
},
"ChangeCategoryTooltip": {
"message": "這將會立即套用至你的片段"
},
"downvote": {
"message": "按倒讚"
},
"upvote": {
"message": "按讚"
},
"hideSegment": {
"message": "隱藏片段"
},
"SponsorTimeEditScrollNewFeature": {
"message": "在滑鼠鼠標放在編輯框上時使用滾輪以快速調製時間。Ctrl和Shift可以用於精密調整"
},
"categoryPillNewFeature": {
"message": "新功能》知道整部影片是不是贊助或自我推廣"
},
"dayAbbreviation": {
"message": "天",
"description": "100d"
},
"hourAbbreviation": {
"message": "小時",
"description": "100h"
},
"optionsTabBehavior": {
"message": "行為",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "介面",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "鍵盤快捷鍵",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "備份/還原",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "其他",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "略過通知外觀",
"description": "Option label"
},
"unbind": {
"message": "取消綁定",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "未設定"
},
"change": {
"message": "更改"
},
"youtubeKeybindWarning": {
"message": "這是YouTube內建捷徑你真的要取代它嗎"
},
"betaServerWarning": {
"message": "測試版伺服器已啟用!"
},
"openOptionsPage": {
"message": "打開選項頁面"
}
}

View File

@@ -9,7 +9,7 @@
position: absolute;
width: 100%;
pointer-events: none;
height: 100%;
transform: scaleY(0.6) translateY(-30%) translateY(1.5px);
z-index: 40;
@@ -17,6 +17,10 @@
transition: transform .1s cubic-bezier(0,0,0.2,1);
}
.ytm-progress-bar > #previewbar {
height: 3px;
}
#previewbar.hovered {
transform: scaleY(1)
}
@@ -108,7 +112,7 @@
.sponsorSkipObject {
font-family: Roboto, Arial, Helvetica, sans-serif;
margin-left: 2px;
margin-right: 2px;
}
@@ -152,9 +156,6 @@
}
.sponsorSkipNoticeParent, .sponsorSkipNotice {
min-width: 350px;
max-width: 50%;
border-spacing: 5px 10px;
padding-left: 5px;
padding-right: 5px;
@@ -162,6 +163,15 @@
border-collapse: unset;
}
.sponsorSkipNoticeParent {
min-width: 350px;
max-width: 50%;
}
.sponsorSkipNotice {
width: 100%;
}
.sponsorSkipNoticeTableContainer {
background-color: rgba(28, 28, 28, 0.9);
border-radius: 5px;
@@ -173,7 +183,7 @@
}
.sponsorSkipNoticeLimitWidth {
min-width: calc(100% - 50px);
max-width: calc(100% - 50px);
}
.sponsorSkipNotice .hidden {
@@ -253,7 +263,7 @@
.sponsorSkipNoticeButton:hover {
background-color: rgba(235, 235, 235,0.2);
border-radius: 4px;
transition: background-color 0.4s;
}
@@ -288,7 +298,7 @@
height: 10px;
width: 10px;
box-sizing: unset;
padding: 2px 5px;
margin-left: 2px;
@@ -303,7 +313,7 @@
font-size: 14px;
font-weight: bold;
color: rgb(235, 235, 235);
margin-top: auto;
display: inline-block;
margin-right: 10px;
@@ -343,13 +353,24 @@
color: rgb(235, 235, 235);
}
.voteButton {
height: 24px;
width: 24px;
cursor: pointer;
.sb-guidelines-notice .sponsorTimesInfoMessage td {
padding-left: 5px;
padding-top: 2px;
padding-bottom: 2px;
font-size: 15px;
display: flex;
align-items: center;
}
.voteButton:hover {
filter: brightness(80%);
.sponsorTimesInfoIcon {
width: 30px;
padding-right: 10px;
padding-left: 10px;
}
.segmentSummary {
outline: none !important;
}
.submitButton {
@@ -365,7 +386,7 @@
padding:4px 15px;
text-decoration:none;
text-shadow:0px 0px 0px #662727;
margin-top: 5px;
margin-right: 15px;
}
@@ -401,7 +422,7 @@
padding:4px 15px;
text-decoration:none;
text-shadow:0px 0px 0px #662727;
margin-top: 5px;
margin-right: 15px;
}
@@ -463,7 +484,7 @@
margin-right: 20px;
font-size: 13px;
cursor: pointer;
}
@@ -512,14 +533,14 @@ input::-webkit-inner-spin-button {
height: 25px;
cursor: pointer;
padding: 5px;
margin: auto;
top: 0;
bottom: 0;
position: absolute;
}
.helpButton:hover {
filter: brightness(80%);
opacity: 0.8;
}
.sbChatNotice iframe {
@@ -588,6 +609,7 @@ input::-webkit-inner-spin-button {
line-height: 1.5em;
color: white;
font-size: 12px;
z-index: 1000;
}
.sponsorBlockTooltip a {
@@ -641,10 +663,18 @@ input::-webkit-inner-spin-button {
height: 10px;
width: 10px;
box-sizing: unset;
margin: 0px 0px 0px 5px;
}
.sponsorBlockCategoryPill:hover .categoryPillClose {
display: inherit;
}
}
/* tweak for mobile duration */
#sponsorBlockDurationAfterSkips.ytm-time-display {
padding-left: 4px;
margin: 0px;
color: #fff;
opacity: .7;
}

37
public/icons/bolt.svg Normal file
View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="bolt.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M19.95 42 22 27.9H14.7Q14.15 27.9 13.9 27.4Q13.65 26.9 13.9 26.45L26.15 6H28.2L26.15 20.05H33.35Q33.9 20.05 34.175 20.55Q34.45 21.05 34.2 21.5L22 42Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

37
public/icons/campaign.svg Normal file
View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="campaign.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M36.5 25.5V22.5H44V25.5ZM39 40 32.95 35.5 34.75 33.1 40.8 37.6ZM34.9 14.85 33.1 12.45 39 8 40.8 10.4ZM10.5 38V30H7Q5.75 30 4.875 29.125Q4 28.25 4 27V21Q4 19.75 4.875 18.875Q5.75 18 7 18H16L26 12V36L16 30H13.5V38ZM28 30.7V17.3Q29.35 18.5 30.175 20.225Q31 21.95 31 24Q31 26.05 30.175 27.775Q29.35 29.5 28 30.7Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="24"
height="24"
version="1.1"
id="svg4"
sodipodi:docname="check-smaller.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="26.25"
inkscape:cx="12.038095"
inkscape:cy="12"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
fill="#ffffff"
d="M 17.69347,4.9833775 9.9421192,12.940517 6.3065298,9.5107153 3.7684768,12.048769 9.9421192,18.016623 20.231523,7.5214304 Z"
id="path2"
style="stroke-width:0.68596" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="close-smaller.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1366"
inkscape:window-height="731"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M12.45 37.65 10.35 35.55 21.9 24 10.35 12.45 12.45 10.35 24 21.9 35.55 10.35 37.65 12.45 26.1 24 37.65 35.55 35.55 37.65 24 26.1Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="lightbulb.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M24 44Q22.3 44 21.125 42.825Q19.95 41.65 19.95 39.95H28.05Q28.05 41.65 26.875 42.825Q25.7 44 24 44ZM15.9 36.85V33.85H32.1V36.85ZM16.15 30.8Q12.85 28.65 10.925 25.425Q9 22.2 9 18.15Q9 12.05 13.45 7.6Q17.9 3.15 24 3.15Q30.1 3.15 34.55 7.6Q39 12.05 39 18.15Q39 22.2 37.1 25.425Q35.2 28.65 31.85 30.8Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

37
public/icons/money.svg Normal file
View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="money.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="6.5625"
inkscape:cx="37.942857"
inkscape:cy="29.714286"
inkscape:window-width="1366"
inkscape:window-height="731"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M 22.070204,47.757552 V 42.214123 Q 18.308592,41.554191 15.89984,39.343419 13.491088,37.132647 12.435197,33.766994 l 3.695619,-1.517844 q 1.121884,3.167674 3.233667,4.718514 2.111782,1.55084 5.081476,1.55084 3.167674,0 5.213463,-1.583837 2.045789,-1.583837 2.045789,-4.355551 0,-2.903701 -1.814813,-4.487538 -1.814813,-1.583836 -6.830296,-3.233666 -4.75151,-1.517844 -7.094269,-4.025586 -2.342759,-2.507741 -2.342759,-6.269354 0,-3.629626 2.342759,-6.0713741 2.342759,-2.4417484 6.104371,-2.7717144 V 0.24244792 h 3.959592 V 5.7198835 q 2.969694,0.329966 5.114473,1.9467994 2.144779,1.6168335 3.266663,4.1245751 l -3.695619,1.583837 q -0.923905,-2.111783 -2.474745,-3.068684 -1.55084,-0.9569014 -4.058582,-0.9569014 -3.035687,0 -4.817503,1.3858574 -1.781817,1.385857 -1.781817,3.761612 0,2.507742 1.979796,4.058582 1.979796,1.55084 7.325246,3.20067 4.487537,1.385857 6.632316,3.992589 2.144779,2.606731 2.144779,6.566323 0,4.157572 -2.441748,6.69831 -2.441749,2.540738 -7.193259,3.266663 v 5.477436 z"
id="path2"
style="fill:#ffffff;stroke-width:1.31986" />
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="music-note.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M19.65 42Q16.5 42 14.325 39.825Q12.15 37.65 12.15 34.5Q12.15 31.35 14.325 29.175Q16.5 27 19.65 27Q21.05 27 22.175 27.4Q23.3 27.8 24.15 28.5V6H35.85V12.75H27.15V34.5Q27.15 37.65 24.975 39.825Q22.8 42 19.65 42Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="right-arrow.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24.07619"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M 17.039265,39.62264 14.838095,37.382164 28.320259,23.9 14.838095,10.417836 17.039265,8.1773601 32.761905,23.9 Z"
id="path2"
style="fill:#ffffff;stroke-width:0.786132" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
public/icons/segway.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

37
public/icons/star.svg Normal file
View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="star.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M11.65 44 16.3 28.8 4 20H19.2L24 4L28.8 20H44L31.7 28.8L36.35 44L24 34.6Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
width="48"
version="1.1"
id="svg4"
sodipodi:docname="stopwatch.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs8" />
<sodipodi:namedview
id="namedview6"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="13.125"
inkscape:cx="24"
inkscape:cy="24"
inkscape:window-width="1920"
inkscape:window-height="983"
inkscape:window-x="482"
inkscape:window-y="768"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
d="M14.45 34Q16.3 35.95 18.8 36.975Q21.3 38 24 38Q29.85 38 33.925 33.925Q38 29.85 38 24Q38 18.15 33.925 14.075Q29.85 10 24 10V24ZM24 44Q19.75 44 16.1 42.475Q12.45 40.95 9.75 38.25Q7.05 35.55 5.525 31.9Q4 28.25 4 24Q4 19.8 5.525 16.15Q7.05 12.5 9.75 9.8Q12.45 7.1 16.1 5.55Q19.75 4 24 4Q28.2 4 31.85 5.55Q35.5 7.1 38.2 9.8Q40.9 12.5 42.45 16.15Q44 19.8 44 24Q44 28.25 42.45 31.9Q40.9 35.55 38.2 38.25Q35.5 40.95 31.85 42.475Q28.2 44 24 44Z"
id="path2"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -175,6 +175,18 @@
<option value="4">__MSG_noticeVisibilityMode4__</option>
</select>
</div>
<div data-type="toggle" data-sync="showCategoryGuidelines">
<div class="switch-container">
<label class="switch">
<input id="showCategoryGuidelines" type="checkbox" checked>
<span class="slider round"></span>
</label>
<label class="switch-label" for="showCategoryGuidelines">
__MSG_showCategoryGuidelines__
</label>
</div>
</div>
<div data-type="toggle" data-toggle-type="reverse" data-sync="hideVideoPlayerControls">
<div class="switch-container">
@@ -368,6 +380,12 @@
</div>
</div>
<div data-type="button-press" data-sync="resetToDefault" data-confirm-message="confirmResetToDefault">
<div class="option-button trigger-button">
__MSG_resetToDefault__
</div>
</div>
</div>
<div id="advanced" class="option-group hidden">

View File

@@ -1,411 +1,574 @@
:root {
--sb-main-font-family: "Source Sans Pro", sans-serif;
--sb-main-bg-color: #222626;
--sb-main-fg-color: white;
--sb-gray-fg-color: #444848;
--sb-on-white-bg: black;
--sb-green-bg: #077B27;
--sb-main-fg-color: #fff;
--sb-grey-bg-color: #333;
--sb-red-bg-color: #cc1717;
}
/*
* Container when popup displayed in-page
*/
#sponsorBlockPopupContainer {
position: relative;
margin-bottom: 16px;
}
/*
* Disable popup max height when displayed in-page
*/
#sponsorBlockPopupContainer #sponsorBlockPopupHTML {
max-height: none;
}
/*
* Disable fixed popup width when displayed in-page
*/
#sponsorBlockPopupContainer #sponsorBlockPopupBody {
width: auto;
}
/*
* Main containers
*/
#sponsorBlockPopupHTML {
color-scheme: dark;
max-height: 600px;
overflow-y: auto;
}
#sponsorBlockPopupBody .hidden {
display: none !important;
#sponsorBlockPopupBody {
margin: 0;
width: 374px;
max-width: 100%; /* NOTE: Ensures content doesn't exceed restricted popup widths in Firefox */
font-family: var(--sb-main-font-family);
font-size: 14px;
background-color: var(--sb-main-bg-color);
color: var(--sb-main-fg-color);
color-scheme: dark;
}
#sponsorblockPopup {
text-align: center;
}
#sponsorblockPopup a,
#sponsorblockPopup button {
cursor: pointer;
}
/*
* Disable transition on all elements until the extension has loaded
*/
.sb-preload * {
transition: none !important;
}
/*
* Close popup button when displayed in-page
*/
.sbCloseButton {
background: transparent;
border: 0;
padding: 8px;
cursor: pointer;
position: absolute;
top: 5px;
right: 5px;
opacity: 0.5;
}
.sbCloseButton:hover {
opacity: 1;
}
/*
* Alert indicating that Beta server is enabled
*/
#sbBetaServerWarning {
padding: 8px;
font-size: 1em;
font-weight: 700;
color: var(--sb-main-fg-color);
background-color: var(--sb-red-bg-color);
cursor: pointer;
}
/*
* Header logo
*/
.sbPopupLogo {
display: flex;
align-items: center;
font-size: 32px;
font-weight: bold;
justify-content: center;
user-select: none;
padding: 20px 0 10px;
}
.sbPopupLogo img {
margin-right: 8px;
}
/*
* Refresh segments button
*/
#refreshSegmentsButton {
background: transparent;
border: 0;
border-radius: 50%;
display: flex;
padding: 5px;
margin: 5px auto;
align-items: center;
}
#refreshSegmentsButton:hover {
background-color: var(--sb-grey-bg-color);
}
/*
* <details> wrapper around each segment
*/
.votingButtons {
font-family: Arial, Helvetica, sans-serif;
}
.votingButtons[open] {
padding-bottom: 5px;
}
.votingButtons:hover {
background-color: var(--sb-grey-bg-color);
}
/*
* Individual segments summaries (clickable <summary>)
*/
.segmentSummary {
cursor: pointer;
font-weight: bold;
padding: 7px;
list-style: none;
white-space: nowrap;
}
/*
* Category dot in segment
*/
.sponsorTimesCategoryColorCircle {
margin: 0 8px;
}
.voteButtonsContainer--hide {
display: none;
}
@media only screen and (max-width: 600px) {
#sponsorBlockPopupBody {
width: 100%;
}
}
#sponsorBlockPopupBody {
margin: auto;
width: 374px;
background: var(--sb-main-bg-color);
color-scheme: dark;
}
#sponsorblockPopup {
color: var(--sb-main-fg-color);
font-family: 'Source Sans Pro', sans-serif;
font-size: 14px;
display: flex;
flex-flow: column nowrap;
align-items: center;
width: 330px;
padding: 22px;
text-align: center;
margin-bottom: var(--ytd-margin-6x);
}
#issueReporterTimeButtons > .votingButtons > .segmentTimeButton {
font-weight: bold;
color: var(--sb-main-fg-color);
background: none;
border: none;
padding: 7px;
outline: none;
cursor: pointer;
white-space: nowrap;
}
.dot {
height: 10px;
width: 10px;
height: 10px;
border-radius: 50%;
display: inline-block;
}
/*
* Buttons that appear under a segment on click
*/
.voteButton {
height: 20px;
padding: 0 5px;
cursor: pointer;
}
.voteButton:hover {
opacity: 0.8;
}
/*
* "Voted!" text that appears after voting on a segment
*/
.sponsorTimesThanksForVotingText {
font-size: large;
}
.voteButton {
height: 20px;
padding: 0 5px;
/*
* Main controls menu
*/
.sbControlsMenu {
background-color: var(--sb-grey-bg-color);
display: flex;
justify-content: space-evenly;
margin-top: 10px;
}
.sbControlsMenu-item {
background: transparent;
border: 0;
cursor: pointer;
}
#videoInfo>p, #videoInfo>div>p {
margin: 0;
}
div.logoText {
user-select: none;
padding: 10px 15px;
flex: 1;
display: flex;
flex-flow: row nowrap;
flex-direction: column;
align-items: center;
color: var(--sb-main-fg-color);
justify-content: center;
}
div.logoText>p, .sbHeader {
font-size: 32px;
margin: -4px 0 -2px;
font-weight: bold;
.sbControlsMenu-item:hover {
background-color: #444;
}
.sbHeader.sbSubHeader {
font-size: 20px;
.sbControlsMenu-itemIcon {
margin-bottom: 6px;
}
.largeButton{
background: white;
/*font-weight: bold;*/
padding: 6px 24px;
font-size: 20px;
border-radius: 25px;
border: none;
text-decoration: none;
color: black;
min-height: 26px;
min-width: 152px;
display: block;
overflow: hidden;
text-overflow: ellipsis;
font-family: 'Source Sans Pro', sans-serif;
}
.sponsorBlockPageBody .mediumButton {
background-color:#cc1717;
-moz-border-radius:28px;
-webkit-border-radius:28px;
border-radius:28px;
border: none;
display:inline-block;
cursor:pointer;
color:#ffffff;
font-size:16px;
padding:8px 37px;
text-decoration:none;
text-shadow:0px 0px 0px #662727;
font-family: 'Source Sans Pro', sans-serif;
transition: 0.01s background-color;
}
.sponsorBlockPageBody .mediumButton:hover {
background-color:#ec1c1c;
}
.sponsorBlockPageBody .mediumButton:focus {
outline: none;
background-color:#ec1c1c;
}
.sponsorBlockPageBody .mediumButton:active {
position:relative;
top:1px;
}
/* disable extension */
#disableExtension {
display: flex;
flex-flow: column nowrap;
align-items: center;
}
/* switch button */
/*
* "Skipping is enabled" toggle
*/
.toggleSwitchContainer {
display: flex;
cursor: pointer;
flex-direction: column;
align-items: center;
}
.toggleSwitchContainer-switch {
display: flex;
margin-bottom: 6px;
}
.switchBg {
display: block;
height: 37px;
width: 78px;
width: 50px;
height: 23px;
border-radius: 18.5px;
}
.switchBg.shadow {
background: none;
box-shadow: 0.75px 0.75px 10px 0px rgba(50, 50, 50, 0.5);
opacity: 1;
}
.switchBg.white {
position: absolute;
background: white;
background-color: #ccc;
opacity: 1;
}
.switchBg.green {
position: absolute;
background: #00a205;
background-color: #00a205;
opacity: 0;
transition: opacity .2s ease-out;
transition: opacity 0.2s ease-out;
}
.switchDot {
width: 25px;
height: 25px;
margin: 6px;
background: white;
background-color: var(--sb-main-fg-color);
border-radius: 50%;
width: 15px;
height: 15px;
margin: 4px;
position: absolute;
border-radius: 12.5px;
box-shadow: .75px .75px 3.8px 0px rgba(50, 50, 50, 0.45);
transition: transform .2s ease-out;
box-shadow: 0.75px 0.75px 3.8px 0px rgba(50, 50, 50, 0.45);
transition: transform 0.2s ease-out;
}
.preload * {
transition: none !important;
#toggleSwitch:checked ~ .switchDot {
transform: translateX(27px);
}
#toggleSwitch:checked~.switchDot {
transform: translateX(40px);
#toggleSwitch:checked ~ .switchBg.green {
opacity: 1;
}
#toggleSwitch:checked~.switchBg.green {
opacity: 1 !important;
#toggleSwitch:checked ~ .switchBg.white {
opacity: 0;
transition: opacity 0.2s step-end;
}
#toggleSwitch:checked~.switchBg.white {
opacity: 0 !important;
transition: opacity .2s step-end;
}
/*
* Whitelist add/remove icon
*/
.sidebyside {
display: flex;
flex-flow: row nowrap;
width: 88%;
margin: 0 6% 0 6%;
}
.sidebyside>div {
width: 50%;
justify-content: center;
}
#whitelistButton, #sponsorTimesSkipsDoneContainer, .toggleSwitchContainer {
margin-bottom: 2px !important;
}
#whitelistForceCheck {
font-weight: bold;
text-decoration: underline;
font-size: large;
cursor: pointer;
padding: 10px 0;
}
.sbHeader {
margin-bottom: 5px !important;
}
.logoText {
margin-bottom: 6px !important;
}
#videoInfo, #mainControls, .sidebyside, #sponsorTimesSkipsDoneContainer, .largeButton {
margin-bottom: 12px !important;
}
#mainControls{
flex-flow: column;
align-items: center;
}
#submitTimesContainer{
flex-flow: column;
align-items: center;
}
/* additional buttons */
#additionalButtons {
display: flex;
flex-flow: column nowrap;
align-items: center;
}
.sbSlimButton, #additionalButtons>button, button#setUsernameButton, #submitUsername, #copyUserID {
background: none;
border: none;
color: white;
width: fit-content;
padding-left: 0;
cursor: pointer;
}
button#setUsernameButton {
flex: 0 1;
}
#submitUsername {
padding-left: 5pt;
}
#additionalButtons, #additionalButtons>button {
font-size: 15px;
}
#usernameValue, #usernameInput, #sponsorTimesContributionsDisplay{
font-size: 16px;
flex: 1 0;
}
.SBWhitelistIcon {
min-width: 16px;
min-height: 16px;
margin-top: auto;
margin-bottom: auto;
}
.SBWhitelistIcon>path {
.SBWhitelistIcon > path {
fill: var(--sb-main-fg-color);
}
label>p, #disableExtension>p, #usernameValue, #usernameElement > div > p,#sponsorTimesContributionsContainer > div > p, #usernameElement > div > #setUsername > #setUsernameStatusContainer > p {
margin: 0;
}
#usernameElement > div > p, #sponsorTimesContributionsContainer {
text-align: start;
}
.grayedOut>.SBWhitelistIcon>path {
fill: var(--sb-gray-fg-color);
}
.grayedOut>label {
color: var(--sb-gray-fg-color);
}
.SBWhitelistIcon.rotated {
transform: rotate(45deg);
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.SBWhitelistIconContainer, button#optionsButton {
/*
* Notice that appears when whitelisting a channel, that recommends
* enabling the "Force Channel Check Before Skipping" option
*/
#whitelistForceCheck {
background-color: #fff3cd;
color: #664d03;
display: block;
padding: 10px 15px;
}
#whitelistForceCheck:hover {
background-color: #f2e4b7;
}
/*
* Container around the "Segment Starts Now" and "Submit Times" buttons
*/
#mainControls {
margin-bottom: 12px;
}
.sponsorStartHint {
display: block;
padding: 0 10px 12px;
}
/*
* Generic buttons used for "Segment Starts Now" and "Submit Times"
*/
.sbMediumButton {
background-color: var(--sb-red-bg-color);
border: 0;
-moz-border-radius: 28px;
-webkit-border-radius: 28px;
border-radius: 28px;
display: inline-block;
color: var(--sb-main-fg-color);
font-size: 16px;
padding: 8px 37px;
font-family: var(--sb-main-font-family);
transition: 0.01s background-color;
}
.sbMediumButton:hover,
.sbMediumButton:focus {
outline: none;
background-color: #ec1c1c;
}
.sbMediumButton:active {
position: relative;
top: 1px;
}
/*
* "Submit Times" button
*/
#submitTimes {
margin-top: 12px;
}
/*
* Heading utility class
*/
.sbHeader {
font-size: 20px;
font-weight: bold;
margin: 10px 0 5px;
}
/*
* Side-by-side section of "Your Work"
*/
.sbYourWorkCols {
display: flex;
margin: 0 20px 12px;
}
.sbYourWorkCols > div {
display: flex;
align-items: center;
flex-basis: 50%;
justify-content: center;
}
.SBWhitelistIconContainer, button#optionsButton>img, .logoText>img, #usernameValue {
margin-right: 8px;
/*
* <button> elements that have icons
*/
#setUsernameButton,
#copyUserID,
#submitUsername {
background: transparent;
border: 0;
padding: 0;
color: var(--sb-main-fg-color);
width: fit-content;
}
#whitelistButton>label, #additionalButtons>button, div#setUsernameContainer>button {
/*
* Prevent username from wrapping
*/
#setUsernameButton {
flex: 0 1;
margin-right: 5px;
}
/*
* Set username button
*/
#submitUsername {
padding-left: 7px;
}
/*
* Increase font size of username input and display
*/
#usernameValue,
#usernameInput,
#sponsorTimesContributionsDisplay {
font-size: 16px;
flex: 1 0;
}
/*
* Left align "Username" and "Submissions" labels
*/
#usernameElement > div > p,
#sponsorTimesContributionsContainer {
text-align: start;
}
/*
* Enable flexbox for buttons with SVG icon
*/
#setUsernameContainer > button {
display: flex;
flex-flow: row nowrap;
}
.sbSlimButton, #whitelistButton>label, #additionalButtons>button, div#setUsernameContainer>button {
cursor: pointer;
}
/*
* Improve position of "Copy User ID" button
*/
#copyUserID {
width: 100%;
flex: 0 1;
}
/*
* Container around username display and edit
*/
#setUsernameContainer {
display: flex;
}
#usernameElement > div, #sponsorTimesContributionsContainer > div {
/*
* Improve alignment of username and submissions
*/
#usernameElement > div,
#sponsorTimesContributionsContainer > div {
display: flex;
flex-flow: column nowrap;
align-items: flex-start;
}
.sidebyside > #usernameElement, .sidebyside > #sponsorTimesContributionsContainer {
display: flex;
align-items: center;
}
/*
* Truncate username display
*/
#usernameValue{
#usernameValue {
overflow: hidden;
text-overflow: ellipsis;
max-width: 130px;
margin: 0 8px 0 0;
}
/*
* Set username form container with "expanded" state
*/
#setUsername {
display:flex;
}
#usernameInput {
background: none;
padding: 0;
border: white 1px solid;
color: var(--sb-main-fg-color);
width: calc(100% - 24px);
text-overflow: ellipsis;
display: flex;
}
#setUsername.SBExpanded {
width: 200%;
}
/* footer */
/*
* Set username input
*/
#usernameInput {
background: transparent;
padding: 2px;
border: var(--sb-main-fg-color) 1px solid;
color: var(--sb-main-fg-color);
width: calc(100% - 24px);
text-overflow: ellipsis;
}
/*
* Footer
*/
#sbFooter {
margin-top: 10px;
padding-bottom: 20px;
}
#sbFooter a {
color: var(--sb-main-fg-color);
text-decoration: none;
}
/*
* "Show Notice Again" button
*/
#showNoticeAgain {
margin-top: 30px;
color: var(--sb-main-fg-color);
background: none;
border: 1px solid white;
cursor: pointer;
padding: 5px;
background: transparent;
border: 1px solid #fff;
border-radius: 5px;
color: var(--sb-main-fg-color);
margin-bottom: 20px;
padding: 5px;
}
/*
* Generic utilities
*/
#sponsorBlockPopupBody .u-mZ {
margin: 0 !important;
}
#sponsorBlockPopupBody .hidden {
display: none !important;
}

View File

@@ -1,90 +1,88 @@
<!DOCTYPE html>
<html id="sponsorBlockPopupHTML">
<head>
<meta charset="utf-8" />
<title>__MSG_openPopup__</title>
<link id="sponsorBlockPopupFont" rel="stylesheet" type="text/css" href="/libs/Source+Sans+Pro.css">
<link id="sponsorBlockStyleSheet" rel="stylesheet" type="text/css" href="popup.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link id="sponsorBlockPopupFont" href="/libs/Source+Sans+Pro.css" rel="stylesheet">
<link id="sponsorBlockStyleSheet" href="popup.css" rel="stylesheet">
</head>
<body id="sponsorBlockPopupBody">
<div id="sponsorblockPopup" class="sponsorBlockPageBody preload">
<div class="logoText bottomSpace">
<img src="icons/IconSponsorBlocker256px.png" height="40px" id="sponsorBlockPopupLogo">
<p>SponsorBlock</p>
<div id="sponsorblockPopup" class="sponsorBlockPageBody sb-preload">
<div id="sbBetaServerWarning" class="hidden" title="__MSG_openOptionsPage__">
__MSG_betaServerWarning__
</div>
<div id="videoInfo" class="bottomSpace">
<div class="bottomSpace">
<!-- Loading text -->
<p id="loadingIndicator">__MSG_noVideoID__</p>
<!-- If the video was found in the database -->
<p id="videoFound"></p>
<button class="sbSlimButton" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<img id="refreshSegments" src="/icons/refresh.svg"/>
</button>
</div>
<header class="sbPopupLogo">
<img src="icons/IconSponsorBlocker256px.png" alt="SponsorBlock" width="40" height="40" id="sponsorBlockPopupLogo">
<p class="u-mZ">SponsorBlock</p>
</header>
<div id="videoInfo">
<!-- Loading text -->
<p id="loadingIndicator" class="u-mZ">__MSG_noVideoID__</p>
<!-- If the video was found in the database -->
<p id="videoFound" class="u-mZ"></p>
<button id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<img src="/icons/refresh.svg" alt="Refresh icon" id="refreshSegments" />
</button>
<div id="issueReporterContainer">
<div id="issueReporterTimeButtons"></div>
</div>
</div>
<div class="sidebyside">
<div id="disableExtension">
<!--github: mbledkowski/toggle-switch-->
<label for="toggleSwitch" class="toggleSwitchContainer">
<div class="sbControlsMenu">
<label id="whitelistButton" for="whitelistToggle" class="hidden sbControlsMenu-item">
<input type="checkbox" style="display:none;" id="whitelistToggle">
<svg viewBox="0 0 24 24" width="23" height="23" class="SBWhitelistIcon sbControlsMenu-itemIcon">
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
</svg>
<span id="whitelistChannel">__MSG_whitelistChannel__</span>
<span id="unwhitelistChannel" style="display: none">__MSG_removeFromWhitelist__</span>
</label>
<!--github: mbledkowski/toggle-switch-->
<label id="disableExtension" for="toggleSwitch" class="toggleSwitchContainer sbControlsMenu-item">
<span class="toggleSwitchContainer-switch">
<input type="checkbox" style="display:none;" id="toggleSwitch" checked>
<span class="switchBg shadow"></span>
<span class="switchBg white"></span>
<span class="switchBg green"></span>
<span class="switchDot"></span>
</label>
<p id="disableSkipping">__MSG_disableSkipping__</p>
<p id="enableSkipping" style="display: none">__MSG_enableSkipping__</p>
</div>
<div id="additionalButtons">
<!-- grayedOut until loading complete -->
<div id="whitelistButton" class="hidden bottomSpace" title="__MSG_forceChannelCheckPopup__">
<input type="checkbox" style="display:none;" id="whitelistToggle">
<label for="whitelistToggle" class="whitelistToggleText">
<div class="SBWhitelistIconContainer">
<svg viewBox="0 0 24 24" width="16" height="16" class="SBWhitelistIcon">
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
</svg>
</div>
<p id="whitelistChannel">__MSG_whitelistChannel__</p>
<p id="unwhitelistChannel" style="display: none">__MSG_removeFromWhitelist__</p>
</label>
</div>
<button id="optionsButton" title="__MSG_optionsInfo__">
<img src="/icons/settings.svg" alt="Settings icon" width="16" height="16" id="sbPopupIconSettings">
__MSG_Options__
</button>
</div>
</span>
<span id="disableSkipping">__MSG_disableSkipping__</span>
<span id="enableSkipping" style="display: none">__MSG_enableSkipping__</span>
</label>
<button id="optionsButton" class="sbControlsMenu-item" title="__MSG_optionsInfo__">
<img src="/icons/settings.svg" alt="Settings icon" width="23" height="23" class="sbControlsMenu-itemIcon" id="sbPopupIconSettings" />
__MSG_Options__
</button>
</div>
<div id="whitelistForceCheck" class="hidden">
<a id="whitelistForceCheck" class="hidden">
__MSG_forceChannelCheckPopup__
</div>
</a>
<div id="mainControls" style="display: none">
<p class="sbHeader sbSubHeader">
<p class="sbHeader">
__MSG_recordTimesDescription__
</p>
<sub style="margin-bottom: 12px;">__MSG_popupHint__</sub>
<sub class="sponsorStartHint">__MSG_popupHint__</sub>
<div>
<button id="sponsorStart" class="mediumButton">__MSG_sponsorStart__</button>
<button id="sponsorStart" class="sbMediumButton">__MSG_sponsorStart__</button>
</div>
<div id="submissionSection" style="display: none">
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
<div id="submitTimesContainer" style="margin-top: 12px;">
<button id="submitTimes" class="mediumButton">__MSG_submitTimesButton__</button>
</div>
<button id="submitTimes" class="sbMediumButton">__MSG_submitTimesButton__</button>
</div>
</div>
<h1 class="recordingSubtitle sbHeader sbSubHeader">__MSG_yourWork__</h1>
<div class="sidebyside">
<h1 class="recordingSubtitle sbHeader">__MSG_yourWork__</h1>
<div class="sbYourWorkCols">
<div id="usernameElement">
<div>
<p>__MSG_Username__:</p>
<p class="u-mZ">__MSG_Username__:</p>
<div id="setUsernameContainer">
<p id="usernameValue"></p>
<button id="setUsernameButton" title="__MSG_setUsername__">
@@ -96,9 +94,9 @@
</div>
<div id="setUsername" style="display: none">
<div id="setUsernameStatusContainer" style="display: none">
<p id="setUsernameStatus"></p>
<p id="setUsernameStatus" class="u-mZ"></p>
</div>
<input id="usernameInput" hint="Username"></input>
<input id="usernameInput" placeholder="Username">
<button id="submitUsername">
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
</button>
@@ -107,7 +105,7 @@
</div>
<div id="sponsorTimesContributionsContainer" class="hidden">
<div>
<p>__MSG_Submissions__:</p>
<p class="u-mZ">__MSG_Submissions__:</p>
<span id="sponsorTimesContributionsDisplay">
0
</span>
@@ -115,7 +113,7 @@
</div>
</div>
<span id="sponsorTimesViewsContainer" style="display: none">
<p id="sponsorTimesViewsContainer" style="display: none" class="u-mZ">
__MSG_savedPeopleFrom__
<b><span id="sponsorTimesViewsDisplay">
0
@@ -125,8 +123,8 @@
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
<span>__MSG_youHaveSavedTimeEnd__</span>).
</span>
<div id="sponsorTimesSkipsDoneContainer" style="display: none">
</p>
<p id="sponsorTimesSkipsDoneContainer" style="display: none" class="u-mZ">
__MSG_youHaveSkipped__
<b><span id="sponsorTimesSkipsDoneDisplay">
0
@@ -136,14 +134,15 @@
0
</span>
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
</div>
</p>
<footer id="sbFooter">
<div id="sponsorTimesDonateContainer" style="display: none; align-items: center; justify-content: center;">
<img class="sbHeart" src="/icons/heart.svg"/>
<img class="sbHeart" src="/icons/heart.svg" alt="Heart icon" />
<a id="sbConsiderDonateLink" href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener">
__MSG_considerDonating__
</a>
<img id="sbCloseDonate" src="/icons/close.png" height="8px" style="padding-left: 5px; cursor: pointer;"/>
<img id="sbCloseDonate" src="/icons/close.png" alt="Close icon" height="8" style="padding-left: 5px; cursor: pointer;" />
</div>
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a> |
@@ -152,14 +151,15 @@
<br/>
<a href="https://discord.gg/SponsorBlock" target="_blank" rel="noopener">Discord</a> |
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
<a id="helpButton" style="cursor: pointer;">__MSG_help__</a> |
<a id="helpButton">__MSG_help__</a> |
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
</footer>
<button id="showNoticeAgain" style="display: none" class="dangerButton popupElement">__MSG_showNotice__</button>
<button id="showNoticeAgain" style="display: none">__MSG_showNotice__</button>
</div>
<!-- Scripts that need to load after the html -->
<script src="./js/vendor.js" async></script>
<script src="./js/popup.js" async></script>
</body>
</html>
</html>

View File

@@ -24,6 +24,7 @@ export interface NoticeProps {
smaller?: boolean,
limitWidth?: boolean,
extraClass?: string,
// Callback for when this is closed
closeListener: () => void,
@@ -35,8 +36,6 @@ export interface NoticeProps {
}
export interface NoticeState {
noticeTitle: string,
maxCountdownTime: () => number,
countdownTime: number,
@@ -54,9 +53,13 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
amountOfPreviousNotices: number;
parentRef: React.RefObject<HTMLDivElement>;
constructor(props: NoticeProps) {
super(props);
this.parentRef = React.createRef();
const maxCountdownTime = () => {
if (this.props.maxCountdownTime) return this.props.maxCountdownTime();
else return Config.config.skipNoticeDuration;
@@ -71,8 +74,6 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
// Setup state
this.state = {
noticeTitle: props.noticeTitle,
maxCountdownTime,
//the countdown until this notice closes
@@ -97,9 +98,11 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
return (
<div id={"sponsorSkipNotice" + this.idSuffix}
className={"sponsorSkipObject sponsorSkipNoticeParent"
+ (this.props.showInSecondSlot ? " secondSkipNotice" : "")}
+ (this.props.showInSecondSlot ? " secondSkipNotice" : "")
+ (this.props.extraClass ? ` ${this.props.extraClass}` : "")}
onMouseEnter={(e) => this.onMouseEnter(e) }
onMouseLeave={() => this.timerMouseLeave()}
ref={this.parentRef}
style={noticeStyle} >
<div className={"sponsorSkipNoticeTableContainer"
+ (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")
@@ -123,7 +126,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
style={{float: "left"}}
className="sponsorSkipMessage sponsorSkipObject">
{this.state.noticeTitle}
{this.props.noticeTitle}
</span>
{this.props.firstColumn}
@@ -344,12 +347,6 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
if (!silent) this.props.closeListener();
}
changeNoticeTitle(title: string): void {
this.setState({
noticeTitle: title
});
}
addNoticeInfoMessage(message: string, message2 = ""): void {
//TODO: Replace
@@ -384,6 +381,10 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
document.querySelector("#sponsorSkipNotice" + this.idSuffix + " > tbody").insertBefore(thanksForVotingText2, document.getElementById("sponsorSkipNoticeSpacer" + this.idSuffix));
}
}
getElement(): React.RefObject<HTMLDivElement> {
return this.parentRef;
}
}
export default NoticeComponent;

View File

@@ -1,6 +1,7 @@
import * as React from "react";
export interface NoticeTextSelectionProps {
icon?: string,
text: string,
idSuffix: string,
onClick?: (event: React.MouseEvent) => unknown
@@ -24,12 +25,21 @@ class NoticeTextSelectionComponent extends React.Component<NoticeTextSelectionPr
}
return (
<p id={"sponsorTimesInfoMessage" + this.props.idSuffix}
<tr id={"sponsorTimesInfoMessage" + this.props.idSuffix}
onClick={this.props.onClick}
style={style}
className="sponsorTimesInfoMessage">
{this.props.text}
</p>
<td>
{this.props.icon ?
<img src={chrome.runtime.getURL(this.props.icon)} className="sponsorTimesInfoIcon" />
: null}
<span>
{this.props.text}
</span>
</td>
</tr>
);
}
}

View File

@@ -1,7 +1,7 @@
import * as React from "react";
import * as CompileConfig from "../../config.json";
import Config from "../config"
import { Category, ContentContainer, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
import { Category, ContentContainer, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
import NoticeComponent from "./NoticeComponent";
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
import Utils from "../utils";
@@ -14,10 +14,17 @@ import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
import PencilSvg from "../svg-icons/pencil_svg";
import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
enum SkipButtonState {
Undo, // Unskip
Redo, // Reskip
Start // Skip
}
export interface SkipNoticeProps {
segments: SponsorTime[];
autoSkip: boolean;
startReskip?: boolean;
// Contains functions and variables from the content script needed by the skip notice
contentContainer: ContentContainer;
@@ -38,9 +45,9 @@ export interface SkipNoticeState {
maxCountdownTime?: () => number;
countdownText?: string;
skipButtonText?: string;
skipButtonCallback?: (index: number) => void;
showSkipButton?: boolean;
skipButtonStates?: SkipButtonState[];
skipButtonCallbacks?: Array<(buttonIndex: number, index: number, forceSeek: boolean) => void>;
showSkipButton?: boolean[];
editing?: boolean;
choosingCategory?: boolean;
@@ -65,7 +72,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
amountOfPreviousNotices: number;
showInSecondSlot: boolean;
idSuffix: string;
noticeRef: React.MutableRefObject<NoticeComponent>;
@@ -98,7 +105,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
if (this.segments.length > 1) {
this.segments.sort((a, b) => a.segment[0] - b.segment[0]);
}
// This is the suffix added at the end of every id
for (const segment of this.segments) {
this.idSuffix += segment.UUID;
@@ -109,6 +116,15 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.unselectedColor = Config.config.colorPalette.white;
this.lockedColor = Config.config.colorPalette.locked;
const isMuteSegment = this.segments[0].actionType === ActionType.Mute;
const maxCountdownTime = isMuteSegment ? this.getFullDurationCountdown(0) : () => Config.config.skipNoticeDuration;
const defaultSkipButtonState = this.props.startReskip ? SkipButtonState.Redo : SkipButtonState.Undo;
const skipButtonStates = [defaultSkipButtonState, isMuteSegment ? SkipButtonState.Start : defaultSkipButtonState];
const defaultSkipButtonCallback = this.props.startReskip ? this.reskip.bind(this) : this.unskip.bind(this);
const skipButtonCallbacks = [defaultSkipButtonCallback, isMuteSegment ? this.reskip.bind(this) : defaultSkipButtonCallback];
// Setup state
this.state = {
noticeTitle,
@@ -116,13 +132,13 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
messageOnClick: null,
//the countdown until this notice closes
maxCountdownTime: () => Config.config.skipNoticeDuration,
countdownTime: Config.config.skipNoticeDuration,
maxCountdownTime,
countdownTime: maxCountdownTime(),
countdownText: null,
skipButtonText: this.getUnskipText(),
skipButtonCallback: (index) => this.unskip(index),
showSkipButton: true,
skipButtonStates,
skipButtonCallbacks,
showSkipButton: [true, true],
editing: false,
choosingCategory: false,
@@ -141,7 +157,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
if (!this.autoSkip) {
// Assume manual skip is only skipping 1 submission
Object.assign(this.state, this.getUnskippedModeInfo(0, this.getSkipText()));
Object.assign(this.state, this.getUnskippedModeInfo(null, 0, SkipButtonState.Start));
}
}
@@ -152,10 +168,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
noticeStyle.transform = "scale(0.8) translate(10%, 10%)";
}
// If it started out as smaller, always keep the
// If it started out as smaller, always keep the
// skip button there
const firstColumn = this.props.smaller ? (
this.getSkipButton()
const showFirstSkipButton = this.props.smaller || this.segments[0].actionType === ActionType.Mute;
const firstColumn = showFirstSkipButton ? (
this.getSkipButton(0)
) : null;
return (
@@ -164,7 +181,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
showInSecondSlot={this.showInSecondSlot}
idSuffix={this.idSuffix}
fadeIn={true}
startFaded={Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAll
startFaded={Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAll
|| (Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAutoSkip && this.autoSkip)}
timed={true}
maxCountdownTime={this.state.maxCountdownTime}
@@ -188,7 +205,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
key={0}>
{/* Vote Button Container */}
{!this.state.thanksForVotingText ?
{!this.state.thanksForVotingText ?
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
className="sponsorTimesVoteButtonsContainer">
@@ -247,10 +264,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
{/* Unskip/Skip Button */}
{!this.props.smaller ? this.getSkipButton() : null}
{!this.props.smaller || this.segments[0].actionType === ActionType.Mute
? this.getSkipButton(1) : null}
{/* Never show button if autoSkip is enabled */}
{!this.autoSkip ? "" :
{/* Never show button */}
{!this.autoSkip || this.props.startReskip ? "" :
<td className="sponsorSkipNoticeRightSection"
key={1}>
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
@@ -324,14 +342,17 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
];
}
getSkipButton(): JSX.Element {
if (this.state.showSkipButton && (this.segments.length > 1
getSkipButton(buttonIndex: number): JSX.Element {
if (this.state.showSkipButton[buttonIndex] && (this.segments.length > 1
|| this.segments[0].actionType !== ActionType.Poi
|| this.props.unskipTime)) {
const forceSeek = buttonIndex === 1 && this.segments[0].actionType === ActionType.Mute;
const style: React.CSSProperties = {
marginLeft: "4px",
color: (this.state.actionState === SkipNoticeAction.Unskip) ? this.selectedColor : this.unselectedColor
color: ([SkipNoticeAction.Unskip0, SkipNoticeAction.Unskip1].includes(this.state.actionState))
? this.selectedColor : this.unselectedColor
};
if (this.contentContainer().onMobileYouTube) {
style.padding = "20px";
@@ -343,8 +364,10 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
className="sponsorSkipObject sponsorSkipNoticeButton"
style={style}
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + keybindToString(Config.config.skipKeybind) + ")" : "")}
onClick={() => this.prepAction(buttonIndex === 1 ? SkipNoticeAction.Unskip1 : SkipNoticeAction.Unskip0)}>
{this.getSkipButtonText(buttonIndex, forceSeek ? ActionType.Skip : null)
+ (!forceSeek && this.state.showKeybindHint
? " (" + keybindToString(Config.config.skipKeybind) + ")" : "")}
</button>
</span>
);
@@ -356,7 +379,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
for (let i = 0; i < this.segments.length; i++) {
elements.push(
<button className="sponsorSkipObject sponsorSkipNoticeButton"
style={{opacity: this.getSubmissionChooserOpacity(i),
style={{opacity: this.getSubmissionChooserOpacity(i),
color: this.getSubmissionChooserColor(i)}}
onClick={() => this.performAction(i)}
key={"submission" + i + this.segments[i].category + this.idSuffix}>
@@ -381,7 +404,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
getSubmissionChooserColor(index: number): string {
const isDownvote = this.state.actionState == SkipNoticeAction.Downvote;
const isCopyDownvote = this.state.actionState == SkipNoticeAction.CopyDownvote;
const shouldWarnUser = Config.config.isVip && (isDownvote || isCopyDownvote)
const shouldWarnUser = Config.config.isVip && (isDownvote || isCopyDownvote)
&& this.segments[index].locked === 1;
return shouldWarnUser ? this.lockedColor : this.unselectedColor;
@@ -445,8 +468,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
case SkipNoticeAction.CopyDownvote:
this.resetStateToStart(SkipNoticeAction.CopyDownvote, true);
break;
case SkipNoticeAction.Unskip:
this.resetStateToStart(SkipNoticeAction.Unskip);
case SkipNoticeAction.Unskip0:
this.resetStateToStart(SkipNoticeAction.Unskip0);
break;
case SkipNoticeAction.Unskip1:
this.resetStateToStart(SkipNoticeAction.Unskip1);
break;
}
}
@@ -454,8 +480,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
/**
* Performs the action from the current state
*
* @param index
*
* @param index
*/
performAction(index: number, action?: SkipNoticeAction): void {
switch (action ?? this.state.actionState) {
@@ -474,8 +500,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
case SkipNoticeAction.CopyDownvote:
this.copyDownvote(index);
break;
case SkipNoticeAction.Unskip:
this.unskipAction(index);
case SkipNoticeAction.Unskip0:
this.unskipAction(0, index, false);
break;
case SkipNoticeAction.Unskip1:
this.unskipAction(1, index, true);
break;
default:
this.resetStateToStart();
@@ -537,8 +566,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
});
}
unskipAction(index: number): void {
this.state.skipButtonCallback(index);
unskipAction(buttonIndex: number, index: number, forceSeek: boolean): void {
this.state.skipButtonCallbacks[buttonIndex](buttonIndex, index, forceSeek);
}
openEditingOptions(): void {
@@ -565,28 +594,29 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
return this.props.contentContainer().lockedCategories.includes(category) ? "sponsorBlockLockedColor" : ""
}
unskip(index: number): void {
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime);
unskip(buttonIndex: number, index: number, forceSeek: boolean): void {
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime, forceSeek);
this.unskippedMode(index, this.getReskipText());
this.unskippedMode(buttonIndex, index, SkipButtonState.Redo);
}
reskip(index: number): void {
this.contentContainer().reskipSponsorTime(this.segments[index]);
reskip(buttonIndex: number, index: number, forceSeek: boolean): void {
this.contentContainer().reskipSponsorTime(this.segments[index], forceSeek);
const skipButtonStates = this.state.skipButtonStates;
skipButtonStates[buttonIndex] = SkipButtonState.Undo;
const skipButtonCallbacks = this.state.skipButtonCallbacks;
skipButtonCallbacks[buttonIndex] = this.unskip.bind(this);
const newState: SkipNoticeState = {
skipButtonText: this.getUnskipText(),
skipButtonCallback: this.unskip.bind(this),
skipButtonStates,
skipButtonCallbacks,
maxCountdownTime: () => Config.config.skipNoticeDuration,
countdownTime: Config.config.skipNoticeDuration
};
// See if the title should be changed
if (!this.autoSkip) {
newState.noticeTitle = chrome.i18n.getMessage("noticeTitle");
}
//reset countdown
this.setState(newState, () => {
this.noticeRef.current.resetCountdown();
@@ -594,30 +624,54 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
/** Sets up notice to be not skipped yet */
unskippedMode(index: number, buttonText: string): void {
unskippedMode(buttonIndex: number, index: number, skipButtonState: SkipButtonState): void {
//setup new callback and reset countdown
this.setState(this.getUnskippedModeInfo(index, buttonText), () => {
this.setState(this.getUnskippedModeInfo(buttonIndex, index, skipButtonState), () => {
this.noticeRef.current.resetCountdown();
});
}
getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
getUnskippedModeInfo(buttonIndex: number, index: number, skipButtonState: SkipButtonState): SkipNoticeState {
const changeCountdown = this.segments[index].actionType !== ActionType.Poi;
const maxCountdownTime = changeCountdown ? () => {
const maxCountdownTime = changeCountdown ?
this.getFullDurationCountdown(index) : this.state.maxCountdownTime;
const skipButtonStates = this.state.skipButtonStates;
const skipButtonCallbacks = this.state.skipButtonCallbacks;
if (buttonIndex === null) {
for (let i = 0; i < this.segments.length; i++) {
skipButtonStates[i] = skipButtonState;
skipButtonCallbacks[i] = this.reskip.bind(this);
}
} else {
skipButtonStates[buttonIndex] = skipButtonState;
skipButtonCallbacks[buttonIndex] = this.reskip.bind(this);
if (buttonIndex === 1) {
// Trigger both to move at once
skipButtonStates[0] = SkipButtonState.Redo;
skipButtonCallbacks[0] = this.reskip.bind(this);
}
}
return {
skipButtonStates,
skipButtonCallbacks,
// change max duration to however much of the sponsor is left
maxCountdownTime,
countdownTime: maxCountdownTime(),
showSkipButton: buttonIndex === 1 ? [true, true] : this.state.showSkipButton
} as SkipNoticeState;
}
getFullDurationCountdown(index: number): () => number {
return () => {
const sponsorTime = this.segments[index];
const duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
return Math.max(duration, Config.config.skipNoticeDuration);
} : this.state.maxCountdownTime;
return {
skipButtonText: buttonText,
skipButtonCallback: (index) => this.reskip(index),
// change max duration to however much of the sponsor is left
maxCountdownTime: maxCountdownTime,
countdownTime: maxCountdownTime()
} as SkipNoticeState;
};
}
afterVote(segment: SponsorTime, type: number, category: Category): void {
@@ -664,7 +718,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
messages
});
}
addVoteButtonInfo(message: string): void {
this.setState({
thanksForVotingText: message
@@ -690,12 +744,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
}
unmutedListener(): void {
if (this.props.segments.length === 1
&& this.props.segments[0].actionType === ActionType.Mute
&& this.contentContainer().v.currentTime >= this.props.segments[0].segment[1]) {
unmutedListener(time: number): void {
if (this.props.segments.length === 1
&& this.props.segments[0].actionType === ActionType.Mute
&& time >= this.props.segments[0].segment[1]) {
this.setState({
showSkipButton: false
showSkipButton: [false, true]
});
}
}
@@ -710,36 +764,50 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
});
}
private getUnskipText(): string {
switch (this.props.segments[0].actionType) {
private getSkipButtonText(buttonIndex: number, forceType?: ActionType): string {
switch (this.state.skipButtonStates[buttonIndex]) {
case SkipButtonState.Undo:
return this.getUndoText(forceType);
case SkipButtonState.Redo:
return this.getRedoText(forceType);
case SkipButtonState.Start:
return this.getStartText(forceType);
}
}
private getUndoText(forceType?: ActionType): string {
const actionType = forceType || this.segments[0].actionType;
switch (actionType) {
case ActionType.Mute: {
return chrome.i18n.getMessage("unmute");
}
case ActionType.Skip:
case ActionType.Skip:
default: {
return chrome.i18n.getMessage("unskip");
}
}
}
private getReskipText(): string {
switch (this.props.segments[0].actionType) {
private getRedoText(forceType?: ActionType): string {
const actionType = forceType || this.segments[0].actionType;
switch (actionType) {
case ActionType.Mute: {
return chrome.i18n.getMessage("mute");
}
case ActionType.Skip:
case ActionType.Skip:
default: {
return chrome.i18n.getMessage("reskip");
}
}
}
private getSkipText(): string {
switch (this.props.segments[0].actionType) {
private getStartText(forceType?: ActionType): string {
const actionType = forceType || this.segments[0].actionType;
switch (actionType) {
case ActionType.Mute: {
return chrome.i18n.getMessage("mute");
}
case ActionType.Skip:
case ActionType.Skip:
default: {
return chrome.i18n.getMessage("skip");
}

View File

@@ -18,6 +18,7 @@ export interface SponsorTimeEditProps {
submissionNotice: SubmissionNoticeComponent;
categoryList?: Category[];
categoryChangeListener?: (index: number, category: Category) => void;
}
export interface SponsorTimeEditState {
@@ -365,9 +366,10 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
}
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
const chosenCategory = event.target.value as Category;
// See if show more categories was pressed
if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
const chosenCategory = event.target.value;
event.target.value = DEFAULT_CATEGORY;
// Alert that they have to enable this category first
@@ -381,8 +383,12 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
}
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
this.handleReplacingLostTimes(event.target.value as Category, sponsorTime.actionType, sponsorTime);
this.handleReplacingLostTimes(chosenCategory, sponsorTime.actionType, sponsorTime);
this.saveEditTimes();
if (this.props.categoryChangeListener) {
this.props.categoryChangeListener(this.props.index, chosenCategory);
}
}
actionTypeSelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
@@ -532,6 +538,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
const index = this.props.index;
const skipTime = sponsorTimes[index].segment[0];
// If segment starts at 0:00, start playback at the end of the segment
if (skipTime === 0) {
this.props.contentContainer().previewTime(sponsorTimes[index].segment[1]);
return;
}
let seekTime = 2;
if (ctrlPressed) seekTime = 0.5;

View File

@@ -1,10 +1,13 @@
import * as React from "react";
import Config from "../config"
import { ContentContainer } from "../types";
import GenericNotice from "../render/GenericNotice";
import { Category, ContentContainer } from "../types";
import * as CompileConfig from "../../config.json";
import NoticeComponent from "./NoticeComponent";
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
import SponsorTimeEditComponent from "./SponsorTimeEditComponent";
import { getGuidelineInfo } from "../utils/constants";
export interface SubmissionNoticeProps {
// Contains functions and variables from the content script needed by the skip notice
@@ -32,6 +35,8 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
videoObserver: MutationObserver;
guidelinesReminder: GenericNotice;
constructor(props: SubmissionNoticeProps) {
super(props);
this.noticeRef = React.createRef();
@@ -95,7 +100,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
{/* Guidelines button */}
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
onClick={() => window.open("https://wiki.sponsor.ajay.app/index.php/Guidelines")}>
onClick={() => window.open("https://wiki.sponsor.ajay.app/w/Guidelines")}>
{chrome.i18n.getMessage(Config.config.submissionCountSinceCategories > 3 ? "guidelines" : "readTheGuidelines")}
</button>
@@ -128,6 +133,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
index={i}
contentContainer={this.props.contentContainer}
submissionNotice={this}
categoryChangeListener={this.categoryChangeListener.bind(this)}
ref={timeRef}>
</SponsorTimeEditComponent>
);
@@ -154,6 +160,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
}
cancel(): void {
this.guidelinesReminder?.close();
this.noticeRef.current.close(true);
this.contentContainer().resetSponsorSubmissionNotice();
@@ -190,6 +197,45 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
this.cancel();
}
categoryChangeListener(index: number, category: Category): void {
const dialogWidth = this.noticeRef?.current?.getElement()?.current?.offsetWidth;
if (category !== "chooseACategory" && Config.config.showCategoryGuidelines
&& this.contentContainer().v.offsetWidth > dialogWidth * 2) {
const options = {
title: chrome.i18n.getMessage(`category_${category}`),
textBoxes: getGuidelineInfo(category),
buttons: [{
name: chrome.i18n.getMessage("FullDetails"),
listener: () => window.open(CompileConfig.wikiLinks[category])
},
{
name: chrome.i18n.getMessage("Hide"),
listener: () => {
Config.config.showCategoryGuidelines = false;
this.guidelinesReminder?.close();
this.guidelinesReminder = null;
}
}],
timed: false,
style: {
right: `${dialogWidth + 10}px`,
},
extraClass: "sb-guidelines-notice"
};
if (options.textBoxes) {
if (this.guidelinesReminder) {
this.guidelinesReminder.update(options);
} else {
this.guidelinesReminder = new GenericNotice(null, "GuidelinesReminder", options);
}
} else {
this.guidelinesReminder?.close();
this.guidelinesReminder = null;
}
}
}
}
export default SubmissionNoticeComponent;

View File

@@ -1,6 +1,4 @@
import * as React from "react";
import Config from "../config";
import { Category, SegmentUUID, SponsorTime } from "../types";
export interface TooltipProps {
text: string;

View File

@@ -1,12 +1,11 @@
import * as CompileConfig from "../config.json";
import * as invidiousList from "../ci/invidiouslist.json";
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes, Keybind, HashedValue, VideoID, SponsorHideType } from "./types";
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, Keybind, HashedValue, VideoID, SponsorHideType } from "./types";
import { keybindEquals } from "./utils/configUtils";
interface SBConfig {
userID: string,
isVip: boolean,
lastIsVipUpdate: number,
/* Contains unsubmitted segments that the user has created. */
unsubmittedSegments: Record<string, SponsorTime[]>,
defaultCategory: Category,
@@ -56,6 +55,7 @@ interface SBConfig {
scrollToEditTimeUpdate: boolean,
categoryPillUpdate: boolean,
darkMode: boolean,
showCategoryGuidelines: boolean,
// Used to cache calculated text color info
categoryPillColors: {
@@ -114,6 +114,7 @@ export interface SBObject {
local: SBStorage;
forceSyncUpdate(prop: string): void;
forceLocalUpdate(prop: string): void;
resetToDefault(): void;
}
const Config: SBObject = {
@@ -124,7 +125,6 @@ const Config: SBObject = {
syncDefaults: {
userID: null,
isVip: false,
lastIsVipUpdate: 0,
unsubmittedSegments: {},
defaultCategory: "chooseACategory" as Category,
whitelistedChannels: [],
@@ -168,6 +168,7 @@ const Config: SBObject = {
scrollToEditTimeUpdate: false, // false means the tooltip will be shown
categoryPillUpdate: false,
darkMode: true,
showCategoryGuidelines: true,
categoryPillColors: {},
@@ -291,7 +292,8 @@ const Config: SBObject = {
config: null,
local: null,
forceSyncUpdate,
forceLocalUpdate
forceLocalUpdate,
resetToDefault
};
// Function setup
@@ -302,7 +304,7 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
for (const key in changes) {
Config.cachedSyncConfig[key] = changes[key].newValue;
}
for (const callback of Config.configSyncListeners) {
callback(changes);
}
@@ -312,7 +314,7 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
}
}
});
const syncHandler: ProxyHandler<SBConfig> = {
set<K extends keyof SBConfig>(obj: SBConfig, prop: K, value: SBConfig[K]) {
Config.cachedSyncConfig[prop] = value;
@@ -329,10 +331,10 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
return obj[prop] || data;
},
deleteProperty(obj: SBConfig, prop: keyof SBConfig) {
chrome.storage.sync.remove(<string> prop);
return true;
}
@@ -354,10 +356,10 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
return obj[prop] || data;
},
deleteProperty(obj: SBStorage, prop: keyof SBStorage) {
chrome.storage.local.remove(<string> prop);
return true;
}
@@ -381,7 +383,7 @@ function forceLocalUpdate(prop: string): void {
});
}
async function fetchConfig(): Promise<void> {
async function fetchConfig(): Promise<void> {
await Promise.all([new Promise<void>((resolve) => {
chrome.storage.sync.get(null, function(items) {
Config.cachedSyncConfig = <SBConfig> <unknown> items;
@@ -389,7 +391,7 @@ async function fetchConfig(): Promise<void> {
});
}), new Promise<void>((resolve) => {
chrome.storage.local.get(null, function(items) {
Config.cachedLocalStorage = <SBStorage> <unknown> items;
Config.cachedLocalStorage = <SBStorage> <unknown> items;
resolve();
});
})]);
@@ -433,9 +435,9 @@ function migrateOldSyncFormats(config: SBConfig) {
if (!config["autoSkipOnMusicVideosUpdate"]) {
config["autoSkipOnMusicVideosUpdate"] = true;
for (const selection of config.categorySelections) {
if (selection.name === "music_offtopic"
if (selection.name === "music_offtopic"
&& selection.option === CategorySkipOption.AutoSkip) {
config.autoSkipOnMusicVideos = true;
break;
}
@@ -487,6 +489,10 @@ function migrateOldSyncFormats(config: SBConfig) {
if (!config["supportInvidious"] && config["invidiousInstances"].length !== invidiousList.length) {
config["invidiousInstances"] = invidiousList;
}
if (config["lastIsVipUpdate"]) {
chrome.storage.sync.remove("lastIsVipUpdate");
}
}
async function setupConfig() {
@@ -520,6 +526,16 @@ function addDefaults() {
}
}
function resetToDefault() {
chrome.storage.sync.set({
...Config.syncDefaults,
userID: Config.config.userID,
minutesSaved: Config.config.minutesSaved,
skipCount: Config.config.skipCount,
sponsorTimesContributed: Config.config.sponsorTimesContributed
});
}
// Sync config
setupConfig();

File diff suppressed because it is too large Load Diff

View File

@@ -144,8 +144,10 @@ class PreviewBar {
this.parent = parent;
if (this.onMobileYouTube) {
parent.style.backgroundColor = "rgba(255, 255, 255, 0.3)";
parent.style.opacity = "1";
if (parent.classList.contains("progress-bar-background")) {
parent.style.backgroundColor = "rgba(255, 255, 255, 0.3)";
parent.style.opacity = "1";
}
this.container.style.transform = "none";
} else if (!this.onInvidious) {

View File

@@ -2,10 +2,7 @@ import Config from "../config";
import { SponsorTime } from "../types";
import { getSkippingText } from "../utils/categoryUtils";
import { keybindToString } from "../utils/configUtils";
import Utils from "../utils";
import { AnimationUtils } from "../utils/animationUtils";
const utils = new Utils();
export interface SkipButtonControlBarProps {
skip: (segment: SponsorTime) => void;
@@ -53,7 +50,7 @@ export class SkipButtonControlBar {
this.skipIcon.id = "sbSkipIconControlBarImage";
this.textContainer = document.createElement("div");
this.container.appendChild(this.skipIcon);
this.container.appendChild(this.textContainer);
this.container.addEventListener("click", () => this.toggleSkip());
@@ -73,7 +70,7 @@ export class SkipButtonControlBar {
attachToPage(): void {
const mountingContainer = this.getMountingContainer();
this.chapterText = document.querySelector(".ytp-chapter-container");
if (mountingContainer && !mountingContainer.contains(this.container)) {
if (this.onMobileYouTube) {
mountingContainer.appendChild(this.container);
@@ -151,7 +148,7 @@ export class SkipButtonControlBar {
}
disableText(): void {
if (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls) {
if (Config.config.hideSkipButtonPlayerControls) {
this.disable();
return;
}
@@ -172,10 +169,10 @@ export class SkipButtonControlBar {
const overlay = document.getElementById("player-control-overlay");
if (overlay && this.enabled) {
if (overlay?.classList?.contains("pointer-events-off")) {
this.hideButton();
} else {
if (overlay?.classList?.contains("fadein")) {
this.showButton();
} else {
this.hideButton();
}
}
}
@@ -220,4 +217,3 @@ export class SkipButtonControlBar {
this.container.style.left = this.left + "px";
}
}

View File

@@ -232,12 +232,22 @@ async function init() {
}
case "button-press": {
const actionButton = optionsElements[i].querySelector(".trigger-button");
const confirmMessage = optionsElements[i].getAttribute("data-confirm-message");
switch(optionsElements[i].getAttribute("data-sync")) {
case "copyDebugInformation":
actionButton.addEventListener("click", copyDebugOutputToClipboard);
break;
}
actionButton.addEventListener("click", () => {
if (confirmMessage !== null && !confirm(chrome.i18n.getMessage(confirmMessage))) {
return;
}
switch (optionsElements[i].getAttribute("data-sync")) {
case "copyDebugInformation":
copyDebugOutputToClipboard();
break;
case "resetToDefault":
Config.resetToDefault();
window.location.reload();
break;
}
});
break;
}

View File

@@ -111,7 +111,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
"sbDonate",
"sponsorTimesDonateContainer",
"sbConsiderDonateLink",
"sbCloseDonate"
"sbCloseDonate",
"sbBetaServerWarning"
].forEach(id => PageElements[id] = document.getElementById(id));
// Hide donate button if wanted (Safari, or user choice)
@@ -120,6 +121,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
PageElements.sbDonate.addEventListener("click", () => Config.config.donateClicked = Config.config.donateClicked + 1);
if (Config.config.testingServer) {
PageElements.sbBetaServerWarning.classList.remove("hidden");
PageElements.sbBetaServerWarning.addEventListener("click", function () {
openOptionsAt("advanced");
});
}
//setup click listeners
PageElements.sponsorStart.addEventListener("click", sendSponsorStartMessage);
PageElements.whitelistToggle.addEventListener("change", function () {
@@ -167,56 +175,42 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.showNoticeAgain.style.display = "unset";
}
utils.sendRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID, (res) => {
utils.sendRequestToServer("GET", "/api/userInfo?value=userName&value=viewCount&value=minutesSaved&value=vip&userID=" + Config.config.userID, (res) => {
if (res.status === 200) {
PageElements.usernameValue.innerText = JSON.parse(res.responseText).userName
const userInfo = JSON.parse(res.responseText);
PageElements.usernameValue.innerText = userInfo.userName;
const viewCount = userInfo.viewCount;
if (viewCount != 0) {
if (viewCount > 1) {
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
} else {
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segment");
}
PageElements.sponsorTimesViewsDisplay.innerText = viewCount.toLocaleString();
PageElements.sponsorTimesViewsContainer.style.display = "block";
}
showDonateWidget(viewCount);
const minutesSaved = userInfo.minutesSaved;
if (minutesSaved != 0) {
if (minutesSaved != 1) {
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
} else {
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minLower");
}
PageElements.sponsorTimesOthersTimeSavedDisplay.innerText = getFormattedHours(minutesSaved);
}
Config.config.isVip = userInfo.vip;
}
})
});
//get the amount of times this user has contributed and display it to thank them
if (Config.config.sponsorTimesContributed != undefined) {
PageElements.sponsorTimesContributionsDisplay.innerText = Config.config.sponsorTimesContributed.toLocaleString();
PageElements.sponsorTimesContributionsContainer.classList.remove("hidden");
//get the userID
const userID = Config.config.userID;
if (userID != undefined) {
//there are probably some views on these submissions then
//get the amount of views from the sponsors submitted
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function (response) {
if (response.status == 200) {
const viewCount = JSON.parse(response.responseText).viewCount;
if (viewCount != 0) {
if (viewCount > 1) {
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segments");
} else {
PageElements.sponsorTimesViewsDisplayEndWord.innerText = chrome.i18n.getMessage("Segment");
}
PageElements.sponsorTimesViewsDisplay.innerText = viewCount.toLocaleString();
PageElements.sponsorTimesViewsContainer.style.display = "unset";
}
showDonateWidget(viewCount);
}
});
//get this time in minutes
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function (response) {
if (response.status == 200) {
const minutesSaved = JSON.parse(response.responseText).timeSaved;
if (minutesSaved != 0) {
if (minutesSaved != 1) {
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
} else {
PageElements.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minLower");
}
PageElements.sponsorTimesOthersTimeSavedDisplay.innerText = getFormattedHours(minutesSaved);
}
}
});
}
}
//get the amount of times this user has skipped a sponsor
@@ -228,7 +222,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
PageElements.sponsorTimesSkipsDoneDisplay.innerText = Config.config.skipCount.toLocaleString();
PageElements.sponsorTimesSkipsDoneContainer.style.display = "unset";
PageElements.sponsorTimesSkipsDoneContainer.style.display = "block";
}
//get the amount of time this user has saved.
@@ -254,7 +248,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.sbConsiderDonateLink.addEventListener("click", () => {
Config.config.donateClicked = Config.config.donateClicked + 1;
});
PageElements.sbCloseDonate.addEventListener("click", () => {
PageElements.sponsorTimesDonateContainer.style.display = "none";
Config.config.showPopupDonationCount = 100;
@@ -312,7 +306,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//if request is undefined, then the page currently being browsed is not YouTube
if (request != undefined) {
//remove loading text
PageElements.mainControls.style.display = "flex";
PageElements.mainControls.style.display = "block";
if (request.onMobileYouTube) PageElements.mainControls.classList.add("hidden");
PageElements.whitelistButton.classList.remove("hidden");
PageElements.loadingIndicator.style.display = "none";
@@ -409,8 +403,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const UUID = segmentTimes[i].UUID;
const locked = segmentTimes[i].locked;
const sponsorTimeButton = document.createElement("button");
sponsorTimeButton.className = "segmentTimeButton popupElement";
const segmentSummary = document.createElement("summary");
segmentSummary.className = "segmentSummary";
const categoryColorCircle = document.createElement("span");
categoryColorCircle.id = "sponsorTimesCategoryColorCircle" + UUID;
@@ -434,36 +428,37 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
if (segmentTimes[i].actionType === ActionType.Full) {
segmentTimeFromToNode.innerText = chrome.i18n.getMessage("full");
} else {
segmentTimeFromToNode.innerText = utils.getFormattedTime(segmentTimes[i].segment[0], true) +
segmentTimeFromToNode.innerText = utils.getFormattedTime(segmentTimes[i].segment[0], true) +
(segmentTimes[i].actionType !== ActionType.Poi
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true)
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true)
: "");
}
segmentTimeFromToNode.style.margin = "5px";
sponsorTimeButton.appendChild(categoryColorCircle);
sponsorTimeButton.appendChild(textNode);
sponsorTimeButton.appendChild(segmentTimeFromToNode);
segmentSummary.appendChild(categoryColorCircle);
segmentSummary.appendChild(textNode);
segmentSummary.appendChild(segmentTimeFromToNode);
const votingButtons = document.createElement("div");
const votingButtons = document.createElement("details");
votingButtons.classList.add("votingButtons");
//thumbs up and down buttons
const voteButtonsContainer = document.createElement("div");
voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID;
voteButtonsContainer.setAttribute("align", "center");
voteButtonsContainer.classList.add('voteButtonsContainer--hide');
const upvoteButton = document.createElement("img");
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
upvoteButton.className = "voteButton";
upvoteButton.title = chrome.i18n.getMessage("upvote");
upvoteButton.src = chrome.runtime.getURL("icons/thumbs_up.svg");
upvoteButton.addEventListener("click", () => vote(1, UUID));
const downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
downvoteButton.className = "voteButton";
downvoteButton.title = chrome.i18n.getMessage("downvote");
downvoteButton.src = locked && isVip ? chrome.runtime.getURL("icons/thumbs_down_locked.svg") : chrome.runtime.getURL("icons/thumbs_down.svg");
downvoteButton.addEventListener("click", () => vote(0, UUID));
@@ -471,6 +466,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
uuidButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
uuidButton.className = "voteButton";
uuidButton.src = chrome.runtime.getURL("icons/clipboard.svg");
uuidButton.title = chrome.i18n.getMessage("copySegmentID");
uuidButton.addEventListener("click", () => {
navigator.clipboard.writeText(UUID);
const stopAnimation = AnimationUtils.applyLoadingAnimation(uuidButton, 0.3);
@@ -480,6 +476,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const hideButton = document.createElement("img");
hideButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
hideButton.className = "voteButton";
hideButton.title = chrome.i18n.getMessage("hideSegment");
if (segmentTimes[i].hidden === SponsorHideType.Hidden) {
hideButton.src = chrome.runtime.getURL("icons/not_visible.svg");
} else {
@@ -516,16 +513,11 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
voteButtonsContainer.appendChild(upvoteButton);
voteButtonsContainer.appendChild(downvoteButton);
voteButtonsContainer.appendChild(uuidButton);
if (segmentTimes[i].actionType === ActionType.Skip
if (segmentTimes[i].actionType === ActionType.Skip
&& [SponsorHideType.Visible, SponsorHideType.Hidden].includes(segmentTimes[i].hidden)) {
voteButtonsContainer.appendChild(hideButton);
}
//add click listener to open up vote panel
sponsorTimeButton.addEventListener("click", function () {
voteButtonsContainer.classList.toggle("voteButtonsContainer--hide");
});
// Will contain request status
const voteStatusContainer = document.createElement("div");
voteStatusContainer.id = "sponsorTimesVoteStatusContainer" + UUID;
@@ -537,7 +529,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
thanksForVotingText.classList.add("sponsorTimesThanksForVotingText");
voteStatusContainer.appendChild(thanksForVotingText);
votingButtons.append(sponsorTimeButton);
votingButtons.append(segmentSummary);
votingButtons.append(voteButtonsContainer);
votingButtons.append(voteStatusContainer);
@@ -705,6 +697,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.unwhitelistChannel.style.display = "unset";
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
//show 'consider force channel check' alert
if (!Config.config.forceChannelCheck) PageElements.whitelistForceCheck.classList.remove("hidden");
//save this
@@ -752,6 +745,9 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.unwhitelistChannel.style.display = "none";
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
//hide 'consider force channel check' alert
PageElements.whitelistForceCheck.classList.add("hidden");
//save this
Config.config.whitelistedChannels = whitelistedChannels;
@@ -812,8 +808,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
/**
* Converts time in minutes to 2d 5h 25.1
* If less than 1 hour, just returns minutes
*
* @param {float} minutes
*
* @param {float} minutes
* @returns {string}
*/
function getFormattedHours(minutes) {

View File

@@ -13,12 +13,19 @@ export interface ButtonListener {
listener: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
}
export interface TextBox {
icon: string,
text: string
}
export interface NoticeOptions {
title: string,
textBoxes?: string[],
textBoxes?: TextBox[],
buttons?: ButtonListener[],
fadeIn?: boolean,
timed?: boolean
style?: React.CSSProperties;
extraClass?: string;
}
export default class GenericNotice {
@@ -27,9 +34,11 @@ export default class GenericNotice {
noticeElement: HTMLDivElement;
noticeRef: React.MutableRefObject<NoticeComponent>;
idSuffix: string;
constructor(contentContainer: ContentContainer, idSuffix: string, options: NoticeOptions) {
this.noticeRef = React.createRef();
this.idSuffix = idSuffix;
this.contentContainer = contentContainer;
@@ -40,39 +49,47 @@ export default class GenericNotice {
referenceNode.prepend(this.noticeElement);
this.update(options);
}
update(options: NoticeOptions): void {
ReactDOM.render(
<NoticeComponent
noticeTitle={options.title}
idSuffix={idSuffix}
idSuffix={this.idSuffix}
fadeIn={options.fadeIn ?? true}
timed={options.timed ?? true}
ref={this.noticeRef}
style={options.style}
extraClass={options.extraClass}
closeListener={() => this.close()} >
{this.getMessageBox(idSuffix, options.textBoxes)}
{this.getMessageBox(this.idSuffix, options.textBoxes)}
<tr id={"sponsorSkipNoticeSpacer" + idSuffix}
<tr id={"sponsorSkipNoticeSpacer" + this.idSuffix}
className="sponsorBlockSpacer">
</tr>
<div className="sponsorSkipNoticeRightSection"
<tr className="sponsorSkipNoticeRightSection"
style={{position: "relative"}}>
{this.getButtons(options.buttons)}
</div>
<td>
{this.getButtons(options.buttons)}
</td>
</tr>
</NoticeComponent>,
this.noticeElement
);
}
getMessageBox(idSuffix: string, textBoxes: string[]): JSX.Element[] {
getMessageBox(idSuffix: string, textBoxes: TextBox[]): JSX.Element[] {
if (textBoxes) {
const result = [];
for (let i = 0; i < textBoxes.length; i++) {
result.push(
<NoticeTextSelectionComponent idSuffix={idSuffix}
key={i}
text={textBoxes[i]} />
icon={textBoxes[i].icon}
text={textBoxes[i].text} />
)
}

View File

@@ -19,7 +19,7 @@ class SkipNotice {
skipNoticeRef: React.MutableRefObject<SkipNoticeComponent>;
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer, unskipTime: number = null) {
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer, unskipTime: number = null, startReskip = false) {
this.skipNoticeRef = React.createRef();
this.segments = segments;
@@ -44,6 +44,7 @@ class SkipNotice {
ReactDOM.render(
<SkipNoticeComponent segments={segments}
autoSkip={autoSkip}
startReskip={startReskip}
contentContainer={contentContainer}
ref={this.skipNoticeRef}
closeListener={() => this.close()}
@@ -70,11 +71,11 @@ class SkipNotice {
}
toggleSkip(): void {
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip);
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip0);
}
unmutedListener(): void {
this.skipNoticeRef?.current?.unmutedListener();
unmutedListener(time: number): void {
this.skipNoticeRef?.current?.unmutedListener(time);
}
}

View File

@@ -6,13 +6,13 @@ export interface ContentContainer {
(): {
vote: (type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent) => void,
dontShowNoticeAgain: () => void,
unskipSponsorTime: (segment: SponsorTime, unskipTime: number) => void,
unskipSponsorTime: (segment: SponsorTime, unskipTime: number, forceSeek?: boolean) => void,
sponsorTimes: SponsorTime[],
sponsorTimesSubmitting: SponsorTime[],
skipNotices: SkipNotice[],
v: HTMLVideoElement,
sponsorVideoID,
reskipSponsorTime: (segment: SponsorTime) => void,
reskipSponsorTime: (segment: SponsorTime, forceSeek?: boolean) => void,
updatePreviewBar: () => void,
onMobileYouTube: boolean,
sponsorSubmissionNotice: SubmissionNotice,

View File

@@ -372,13 +372,15 @@ export default class Utils {
findReferenceNode(): HTMLElement {
const selectors = [
"#player-container-id", // Mobile YouTube
"#movie_player",
"#c4-player", // Channel Trailer
"#player-container", // Preview on hover
"#main-panel.ytmusic-player-page", // YouTube music
"#player-container .video-js", // Invidious
".main-video-section > .video-container" // Cloudtube
]
];
let referenceNode = findValidElementFromSelector(selectors)
if (referenceNode == null) {
//for embeds

141
src/utils/constants.ts Normal file
View File

@@ -0,0 +1,141 @@
import { TextBox } from "../render/GenericNotice";
import { Category } from "../types";
export function getGuidelineInfo(category: Category): TextBox[] {
switch (category) {
case "sponsor":
return [{
icon: "icons/money.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "selfpromo":
return [{
icon: "icons/money.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/campaign.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "exclusive_access":
return [{
icon: "icons/money.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}];
case "interaction":
return [{
icon: "icons/lightbulb.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/lightbulb.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "intro":
return [{
icon: "icons/check-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "outro":
return [{
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "preview":
return [{
icon: "icons/check-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/check-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "filler":
return [{
icon: "icons/stopwatch.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/stopwatch.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/close-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
}, {
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "music_offtopic":
return [{
icon: "icons/music-note.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/music-note.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
case "poi_highlight":
return [{
icon: "icons/star.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
}, {
icon: "icons/bolt.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
}, {
icon: "icons/bolt.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
}];
}
}

View File

@@ -28,20 +28,18 @@ async function wait<T>(condition: () => T | false, timeout = 5000, check = 100):
* @returns {string} errorMessage
*/
function getErrorMessage(statusCode: number, responseText: string): string {
let errorMessage = "";
const postFix = (responseText ? "\n\n" + responseText : "");
if([400, 429, 409, 502, 503, 0].includes(statusCode)) {
//treat them the same
const postFix = ((responseText && !responseText.includes(`cf-wrapper`)) ? "\n\n" + responseText : "");
// display response body for 4xx
if([400, 429, 409, 0].includes(statusCode)) {
return chrome.i18n.getMessage(statusCode + "") + " " + chrome.i18n.getMessage("errorCode") + statusCode + postFix;
} else if (statusCode >= 500 && statusCode <= 599) {
// 503 == 502
if (statusCode == 503) statusCode = 502;
errorMessage = chrome.i18n.getMessage(statusCode + "") + " " + chrome.i18n.getMessage("errorCode") + statusCode
+ "\n\n" + chrome.i18n.getMessage("statusReminder");
return chrome.i18n.getMessage(statusCode + "") + " " + chrome.i18n.getMessage("errorCode") + statusCode
+ "\n\n" + chrome.i18n.getMessage("statusReminder");
} else {
errorMessage = chrome.i18n.getMessage("connectionError") + statusCode;
return chrome.i18n.getMessage("connectionError") + statusCode + postFix;
}
return errorMessage + postFix;
}
/* Gets percieved luminance of a color */
@@ -64,7 +62,7 @@ function hexToRgb(hex: string): {r: number, g: number, b: number} {
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
}
export const GenericUtils = {
wait,

12
src/utils/logger.ts Normal file
View File

@@ -0,0 +1,12 @@
window["SBLogs"] = {
debug: [],
warn: []
};
export function logDebug(message: string) {
window["SBLogs"].debug.push(`[${new Date().toISOString()}] ${message}`);
}
export function logWarn(message: string) {
window["SBLogs"].warn.push(`[${new Date().toISOString()}] ${message}`);
}

View File

@@ -7,7 +7,8 @@ export enum SkipNoticeAction {
Downvote,
CategoryVote,
CopyDownvote,
Unskip
Unskip0,
Unskip1
}
export function downvoteButtonColor(segments: SponsorTime[], actionState: SkipNoticeAction, downvoteType: SkipNoticeAction): string {

View File

@@ -1,11 +1,15 @@
/* eslint-disable @typescript-eslint/no-var-requires */
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const webpack = require("webpack");
const path = require('path');
const CopyPlugin = require('copy-webpack-plugin');
const BuildManifest = require('./webpack.manifest');
const srcDir = '../src/';
const fs = require("fs");
import webpack from "webpack"
import path from "path"
import { fileURLToPath } from "url"
import CopyPlugin from "copy-webpack-plugin"
import BuildManifest from "./webpack.manifest.cjs";
const srcDir = "../src/";
import fs from "fs";
import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin";
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
const edgeLanguages = [
"de",
@@ -23,7 +27,7 @@ const edgeLanguages = [
"zh_CN"
]
module.exports = env => ({
export default env => ({
entry: {
popup: path.join(__dirname, srcDir + 'popup.ts'),
background: path.join(__dirname, srcDir + 'background.ts'),
@@ -45,8 +49,12 @@ module.exports = env => ({
rules: [
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
loader: 'ts-loader',
exclude: /node_modules/,
options: {
// disable type checker for user in fork plugin
transpileOnly: true
}
}
]
},
@@ -54,6 +62,8 @@ module.exports = env => ({
extensions: ['.ts', '.tsx', '.js']
},
plugins: [
// fork TS checker
new ForkTsCheckerWebpackPlugin(),
// exclude locale files in moment
new CopyPlugin({
patterns: [

View File

@@ -1,8 +1,7 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
import { merge } from "webpack-merge";
import common from './webpack.common.js';
module.exports = env => merge(common(env), {
export default env => merge(common(env), {
devtool: 'inline-source-map',
mode: 'development'
});

View File

@@ -1,8 +1,7 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const merge = require('webpack-merge');
const common = require('./webpack.common.js');
import { merge } from "webpack-merge";
import common from './webpack.common.js';
module.exports = env => {
export default env => {
let mode = "production";
env.mode = mode;