Compare commits

..

70 Commits

Author SHA1 Message Date
Ajay
91311787df Run headless 2022-06-17 17:06:41 -04:00
Ajay
74e9a98afd Fix selenium tests 2022-06-17 16:42:59 -04:00
Ajay Ramachandran
b369dcc117 Merge pull request #1363 from mchangrh/fix-ci
Fix npm ci failing
2022-06-16 18:01:51 -04:00
Michael C
5a05e01b7d bump package-lock with npm 8.12 2022-06-16 17:48:39 -04:00
Ajay Ramachandran
8097eff9bb Merge pull request #1355 from Argn0/branch3
display "Voted!" message only momentarily
2022-06-15 13:08:02 -04:00
Ajay
c61c97ccad Fix segments with small gaps 2022-06-15 13:05:44 -04:00
Ajay
9a7baa7325 Fix typo 2022-06-15 13:02:53 -04:00
Ajay
5ac577c99b update oss attributions 2022-06-13 14:50:42 -04:00
Ajay
3f421a2fb0 Update node version in workflow 2022-06-13 13:34:39 -04:00
Ajay
e94ce0ffef Fix edit username box too big 2022-06-13 13:28:16 -04:00
Ajay
2dfcf2141f minimum width for username box 2022-06-13 13:26:33 -04:00
Ajay
47220e0abc Fix some popup buttons 2022-06-13 13:16:47 -04:00
Argn0
05eed6ee20 display "Voted!" message only momentarily 2022-06-10 06:13:57 +02:00
Ajay
9eec62d59f Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-06-09 14:02:25 -04:00
Ajay
25c04a49c1 Fix help page not closing from keybind 2022-06-09 14:02:23 -04:00
Ajay Ramachandran
efe6b0483c remove pointer cursor from your work 2022-06-07 22:47:59 -04:00
Ajay
32a3cb2cfe Forward key presses from popup 2022-06-06 17:09:34 -04:00
Ajay
d9970bf110 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-06-06 13:18:21 -04:00
Ajay
6514b41418 Fix only bracket wrapping 2022-06-06 13:18:20 -04:00
Ajay Ramachandran
e480e032f2 bump version 2022-06-05 00:09:21 -04:00
Ajay Ramachandran
995001bd91 New Crowdin updates (#1342) 2022-06-05 00:09:14 -04:00
Ajay
466152ed42 Fix popup copy to clipboard 2022-06-04 01:56:00 -04:00
Ajay
e4855f7427 Fix messed up margin on popup 2022-06-04 01:50:19 -04:00
Ajay
258abd5deb Fix jest errors not displaying in console 2022-06-03 15:12:35 -04:00
Ajay Ramachandran
4e7975a9de bump version 2022-06-03 13:36:40 -04:00
Ajay Ramachandran
ec8d5d88e9 New translations messages.json (Chinese Traditional) (#1341) 2022-06-03 13:35:41 -04:00
Ajay Ramachandran
71653572aa New Crowdin updates (#1332) 2022-06-03 02:21:18 -04:00
Ajay Ramachandran
a18f431e06 Merge pull request #1300 from PickleNik/master
Popup Styling Upgrades
2022-06-03 01:59:56 -04:00
Ajay
56f7b40585 Fix code formatting 2022-06-03 01:57:55 -04:00
Ajay
a5f263dc12 Make logo in same line in popup 2022-06-03 01:53:29 -04:00
Ajay
3415dafb02 Revert changes to options button and close button 2022-06-03 01:45:47 -04:00
Ajay
9664bbea73 Change alignment of some popup elements 2022-06-03 01:38:32 -04:00
Ajay
c7b07ba958 Fix localize function not working for title of direct children 2022-06-02 22:00:06 -04:00
Ajay
20b95887af Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into pr/PickleNik/1300 2022-06-02 21:48:05 -04:00
Ajay Ramachandran
47d4812b92 Merge pull request #1322 from NDevTK/master
Move popup to iframe and restrict embeds
2022-06-02 21:42:19 -04:00
Ajay
6202a4d0a3 Only show close button on in page popup 2022-06-02 21:38:27 -04:00
Ajay
6b584f2111 Faster popup loading on firefox 2022-06-02 21:38:26 -04:00
Ajay
3d9221eb8d improve display while popup loads 2022-06-02 21:38:26 -04:00
Ajay
96173dd901 Fix popup communication on Firefox 2022-06-02 21:38:21 -04:00
Ajay
5820758563 Fix close button layout issues 2022-06-02 21:37:32 -04:00
NDevTK
bfadb1373a Add comment 2022-06-02 21:37:21 -04:00
NDevTK
a7956aacf9 Remove unused sendRequestToCustomServer 2022-06-02 21:37:21 -04:00
NDevTK
afee681575 Removed runThePopup 2022-06-02 21:37:14 -04:00
NDevTK
b5482b6527 Move popup to iframe 2022-06-02 21:36:54 -04:00
Ajay Ramachandran
ff87a42147 Merge pull request #1330 from bershanskiy/history
Use Navigation API when available
2022-06-02 02:30:57 -04:00
Ajay
7e5130c49a Don't wait to add listener 2022-06-02 01:43:31 -04:00
Ajay
a7b18bca87 Fix grammar 2022-05-31 18:29:46 -04:00
Ajay Ramachandran
a2ead6bcc4 Merge pull request #1333 from Argn0/debouncecolor
Debounce setting bar color
2022-05-31 13:40:07 -04:00
Ajay Ramachandran
4a2614349d Merge pull request #1338 from ajayyy/guidelines
Add initial sponsor help page
2022-05-31 13:38:27 -04:00
Ajay
67c63a09fe Delete items if exceeding storage 2022-05-31 13:31:18 -04:00
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
Anton Bershanskiy
9b9ea39260 Use History API when available 2022-05-26 15:38:18 +03:00
Argn0
31b10f9a41 change timeout to 50ms 2022-05-25 20:27:27 +02:00
Argn0
0261d36a47 debounce setting bar color 2022-05-25 15:09:40 +02:00
Nikita Krupin
50aaea0dd2 Merge branch 'master' into master 2022-05-04 18:56:32 -04:00
Nikita Krupin
ccc1f4cad1 popup.css organization in topological order 2022-05-03 00:05:04 -04:00
Nikita Krupin
42511cb667 popup.html code cleanup & simplification 2022-05-02 22:26:51 -04:00
Nikita Krupin
123d7af5eb mainControls better spacing 2022-05-02 21:32:54 -04:00
Nikita Krupin
44f2de42db tooltip spacing unit fixes 2022-05-02 21:28:22 -04:00
Nikita Krupin
e4dd0f1ac6 popup styling requested adjustments 2022-05-02 21:22:25 -04:00
Nikita Krupin
9fdce8e814 popup link transition fix 2022-05-01 23:07:03 -04:00
Nikita Krupin
813b2df1ac popup styling tweaks 2022-05-01 22:50:58 -04:00
69 changed files with 3196 additions and 714 deletions

View File

@@ -13,7 +13,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
- run: npm ci
- name: Copy configuration
run: cp config.json.example config.json

View File

@@ -15,7 +15,7 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
- run: npm ci
- name: Copy configuration
run: cp config.json.example config.json

View File

@@ -3,8 +3,7 @@ name: Tests
on: [push, pull_request]
jobs:
build:
test:
name: Run tests
runs-on: ubuntu-latest
@@ -13,8 +12,11 @@ jobs:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
- run: npm ci
- run: sudo apt-get install chromium-chromedriver
- name: Copy configuration
run: cp config.json.example config.json
- name: Run tests
run: npm run test-without-building
run: npm run test

View File

@@ -16,7 +16,7 @@ jobs:
uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
node-version: '18'
- name: Install and generate attribution
run: |
npm ci

View File

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

View File

@@ -1,7 +1,7 @@
{
"name": "__MSG_fullName__",
"short_name": "SponsorBlock",
"version": "4.4.5",
"version": "4.5.1",
"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",
@@ -68,8 +79,31 @@
"default_icon": {
"16": "icons/IconSponsorBlocker16px.png",
"32": "icons/IconSponsorBlocker32px.png",
"64": "icons/LogoSponsorBlocker64px.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":[

150
package-lock.json generated
View File

@@ -10,7 +10,7 @@
"funding": [
{
"type": "individual",
"url": "hhttps://sponsor.ajay.app/donate"
"url": "https://sponsor.ajay.app/donate"
},
{
"type": "github",
@@ -36,7 +36,7 @@
"@types/jest": "^27.5.1",
"@types/react": "^17.0.43",
"@types/react-dom": "^17.0.14",
"@types/selenium-webdriver": "^4.1.0",
"@types/selenium-webdriver": "^4.1.1",
"@types/wicg-mediasession": "^1.1.3",
"@typescript-eslint/eslint-plugin": "^5.26.0",
"@typescript-eslint/parser": "^5.26.0",
@@ -49,7 +49,7 @@
"jest": "^28.1.0",
"rimraf": "^3.0.2",
"schema-utils": "^4.0.0",
"selenium-webdriver": "^4.1.2",
"selenium-webdriver": "^4.2.0",
"speed-measure-webpack-plugin": "^1.5.0",
"ts-jest": "^28.0.3",
"ts-loader": "^9.3.0",
@@ -1918,9 +1918,9 @@
"dev": true
},
"node_modules/@types/selenium-webdriver": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.0.tgz",
"integrity": "sha512-ehqwZemosqiWVe+W0f5GqcLH7NgtjMBmcknmeaPG6YZHc7EZ69XbD7VVNZcT/L8lyMIL/KG99MsGcvDuFWo3Yw==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.1.tgz",
"integrity": "sha512-NxxZZek50ylIACiXebKQYHD3D4One3WXOasEXWazL6aTfYbZob7ClNKxUpg8I4/oWArX87oPWvj1cHKqfel3Hg==",
"dev": true,
"dependencies": {
"@types/ws": "*"
@@ -3534,16 +3534,6 @@
"node": ">=0.10.0"
}
},
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"dev": true,
"optional": true,
"dependencies": {
"file-uri-to-path": "1.0.0"
}
},
"node_modules/bl": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
@@ -4098,20 +4088,6 @@
"node": ">=8"
}
},
"node_modules/chokidar/node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/chokidar/node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -6908,13 +6884,6 @@
"node": ">=6"
}
},
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"dev": true,
"optional": true
},
"node_modules/filename-reserved-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -7356,25 +7325,6 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"node_modules/fsevents": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"dependencies": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
},
"engines": {
"node": ">= 4.0"
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
@@ -9637,20 +9587,6 @@
"fsevents": "^2.3.2"
}
},
"node_modules/jest-haste-map/node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/jest-haste-map/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -12590,6 +12526,13 @@
"node": ">=0.10.0"
}
},
"node_modules/path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
"integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
"dev": true,
"optional": true
},
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -13552,9 +13495,9 @@
}
},
"node_modules/selenium-webdriver": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz",
"integrity": "sha512-e4Ap8vQvhipgBB8Ry9zBiKGkU6kHKyNnWiavGGLKkrdW81Zv7NVMtFOL/j3yX0G8QScM7XIXijKssNd4EUxSOw==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.2.0.tgz",
"integrity": "sha512-gPPXYSz4jJBM2kANRQ9cZW6KFBzR/ptxqGLtyC75eXtdgOsWWRRRyZz5F2pqdnwNmAjrCSFMMXfisJaZeWVejg==",
"dev": true,
"dependencies": {
"jszip": "^3.6.0",
@@ -18018,9 +17961,9 @@
"dev": true
},
"@types/selenium-webdriver": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.0.tgz",
"integrity": "sha512-ehqwZemosqiWVe+W0f5GqcLH7NgtjMBmcknmeaPG6YZHc7EZ69XbD7VVNZcT/L8lyMIL/KG99MsGcvDuFWo3Yw==",
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-4.1.1.tgz",
"integrity": "sha512-NxxZZek50ylIACiXebKQYHD3D4One3WXOasEXWazL6aTfYbZob7ClNKxUpg8I4/oWArX87oPWvj1cHKqfel3Hg==",
"dev": true,
"requires": {
"@types/ws": "*"
@@ -19225,16 +19168,6 @@
"dev": true,
"optional": true
},
"bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"dev": true,
"optional": true,
"requires": {
"file-uri-to-path": "1.0.0"
}
},
"bl": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz",
@@ -19650,13 +19583,6 @@
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true
},
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -21821,13 +21747,6 @@
"dev": true,
"peer": true
},
"file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"dev": true,
"optional": true
},
"filename-reserved-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
@@ -22156,17 +22075,6 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"fsevents": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
"integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
"dev": true,
"optional": true,
"requires": {
"bindings": "^1.5.0",
"nan": "^2.12.1"
}
},
"function-bind": {
"version": "1.1.1",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
@@ -23812,13 +23720,6 @@
"walker": "^1.0.7"
},
"dependencies": {
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -26095,6 +25996,13 @@
"dev": true,
"optional": true
},
"path-dirname": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
"integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
"dev": true,
"optional": true
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -26842,9 +26750,9 @@
}
},
"selenium-webdriver": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.1.2.tgz",
"integrity": "sha512-e4Ap8vQvhipgBB8Ry9zBiKGkU6kHKyNnWiavGGLKkrdW81Zv7NVMtFOL/j3yX0G8QScM7XIXijKssNd4EUxSOw==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.2.0.tgz",
"integrity": "sha512-gPPXYSz4jJBM2kANRQ9cZW6KFBzR/ptxqGLtyC75eXtdgOsWWRRRyZz5F2pqdnwNmAjrCSFMMXfisJaZeWVejg==",
"dev": true,
"requires": {
"jszip": "^3.6.0",

View File

@@ -14,7 +14,7 @@
"@types/jest": "^27.5.1",
"@types/react": "^17.0.43",
"@types/react-dom": "^17.0.14",
"@types/selenium-webdriver": "^4.1.0",
"@types/selenium-webdriver": "^4.1.1",
"@types/wicg-mediasession": "^1.1.3",
"@typescript-eslint/eslint-plugin": "^5.26.0",
"@typescript-eslint/parser": "^5.26.0",
@@ -27,7 +27,7 @@
"jest": "^28.1.0",
"rimraf": "^3.0.2",
"schema-utils": "^4.0.0",
"selenium-webdriver": "^4.1.2",
"selenium-webdriver": "^4.2.0",
"speed-measure-webpack-plugin": "^1.5.0",
"ts-jest": "^28.0.3",
"ts-loader": "^9.3.0",
@@ -71,7 +71,7 @@
"funding": [
{
"type": "individual",
"url": "hhttps://sponsor.ajay.app/donate"
"url": "https://sponsor.ajay.app/donate"
},
{
"type": "github",

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Показване на известие след пропускане на сегмент"
},
"showCategoryGuidelines": {
"message": "Показване на помощ за категорията"
},
"noticeVisibilityMode0": {
"message": "Известия за пропускане в пълен размер"
},
@@ -542,18 +545,39 @@
"message": "до",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Включване на преходи"
},
"generic_guideline2": {
"message": "Възпроизвежда се, сякаш нищо не е пропуснато"
},
"category_sponsor": {
"message": "Спонсорство"
},
"category_sponsor_description": {
"message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
},
"category_sponsor_guideline1": {
"message": "Платени промоции"
},
"category_sponsor_guideline2": {
"message": "Не за дарения или персонализирани стоки"
},
"category_selfpromo": {
"message": "Неплатена/Самореклама"
},
"category_selfpromo_description": {
"message": "Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."
},
"category_selfpromo_guideline1": {
"message": "Дарения, членства и персонализирани стоки"
},
"category_selfpromo_guideline2": {
"message": "Безплатни възгласи, които не допринасят за видеоклипа"
},
"category_selfpromo_guideline3": {
"message": "Не за продукти и стоки с корпоративен дизайн"
},
"category_exclusive_access": {
"message": "Ексклузивен достъп"
},
@@ -564,12 +588,24 @@
"message": "Този видеоклип представя продукт, услуга или място, до което е получен безплатен или субсидиран достъп",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Целият видеоклип показва нещо, до което е получен безплатен или субсидиран достъп"
},
"category_interaction": {
"message": "Напомняне за действие (абониране)"
},
"category_interaction_description": {
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или за нещо специфично, трябва да е под „самореклама“."
},
"category_interaction_guideline1": {
"message": "Кратки напомняния за харесване, абониране или следване"
},
"category_interaction_guideline2": {
"message": "Включва непреки напомняния за коментиране"
},
"category_interaction_guideline3": {
"message": "Не за общо популяризиране, а само за призиви за действие"
},
"category_interaction_short": {
"message": "Напомняне за взаимодействие"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Антракт"
},
"category_intro_guideline1": {
"message": "Интервал без реално съдържание"
},
"category_intro_guideline2": {
"message": "Не за преходи с информация"
},
"category_outro": {
"message": "Крайни картички/Заслуги"
},
"category_outro_description": {
"message": "Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация."
},
"category_outro_guideline1": {
"message": "Без съдържание, дори ако крайните карти са на екрана"
},
"category_preview": {
"message": "Кратко резюме/Обобщение"
},
"category_preview_description": {
"message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
},
"category_preview_guideline1": {
"message": "Клипове, които се появяват по-късно или в бъдещ видеоклип"
},
"category_preview_guideline2": {
"message": "Резюме на предишен видеоклип"
},
"category_preview_guideline3": {
"message": "Не за части, които добавят допълнително съдържание"
},
"category_filler": {
"message": "Пълнеж/Шеги"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Пълнеж"
},
"category_filler_guideline1": {
"message": "Съпътстващи сцени само за пълнеж или хумор"
},
"category_filler_guideline2": {
"message": "Отвличане на вниманието, гафове, повторения"
},
"category_filler_guideline3": {
"message": "Не за сцени, необходими за разбиране на темата"
},
"category_music_offtopic": {
"message": "Музика: Част без музика"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Без музика"
},
"category_music_offtopic_guideline1": {
"message": "Секции, които не са в официалните издания"
},
"category_music_offtopic_guideline2": {
"message": "Немузикална част от изпълнение на живо"
},
"category_poi_highlight": {
"message": "Акцент"
},
"category_poi_highlight_description": {
"message": "Частта от видеото, която повечето хора търсят. Подобно на коментарите „Видеото започва от х“."
},
"category_poi_highlight_guideline1": {
"message": "Секция, която повечето хора търсят"
},
"category_poi_highlight_guideline2": {
"message": "Може да помогне за прескачане на миналия контекст"
},
"category_poi_highlight_guideline3": {
"message": "Може да прескочи до заглавието или миниатюрата"
},
"category_livestream_messages": {
"message": "Поточно предаване: Четене на съобщения/дарения"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Научете повече"
},
"FullDetails": {
"message": "Пълна информация"
},
"CopyDownvoteButtonInfo": {
"message": "Гласуване против и създаване на локално копие, за да го изпратите отново"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Отваряне на страницата с опции"
},
"resetToDefault": {
"message": "Възстановяване на първоначалните настройки"
},
"confirmResetToDefault": {
"message": "Наистина ли искате да възстановите всички настройки до стойностите им по подразбиране? Това не може да бъде отменено."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Zobrazit upozornění po přeskočení segmentu"
},
"showCategoryGuidelines": {
"message": "Zobrazit nápovědu ke kategorii"
},
"noticeVisibilityMode0": {
"message": "Oznámení o přeskočení v plné velikosti"
},
@@ -542,18 +545,39 @@
"message": "do",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Zahrnout přechody segmentů"
},
"generic_guideline2": {
"message": "Hraje, jako kdyby nebylo nic přeskočeno"
},
"category_sponsor": {
"message": "Sponzor"
},
"category_sponsor_description": {
"message": "Placená propagace, placená doporučení a přímé reklamy. Nezahrnuje sebepropagaci nebo shout-outy uživatelů/tvůrců/webů/produktů, které se tvůrcovi líbí."
},
"category_sponsor_guideline1": {
"message": "Placené propagace"
},
"category_sponsor_guideline2": {
"message": "Není pro dary nebo vlastní merch"
},
"category_selfpromo": {
"message": "Neplacená / vlastní propagace"
},
"category_selfpromo_description": {
"message": "Podobně jako \"sponzor\" s výjimkou neplacených nebo propagačních akcí. Zahrnuje sekce o zboží, dary nebo informace o tom, s kým spolupracují."
},
"category_selfpromo_guideline1": {
"message": "Dary, členství a vlastní merch"
},
"category_selfpromo_guideline2": {
"message": "Bezplatné propagace, které nepřidávají nic k videu"
},
"category_selfpromo_guideline3": {
"message": "Není pro podnikové produkty a merch"
},
"category_exclusive_access": {
"message": "Exkluzivní přístup"
},
@@ -564,12 +588,24 @@
"message": "V tomto videu je zobrazován produkt, služba nebo místo, které autor obdržel zdarma nebo s bezplatným přístupem",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Celé video zobrazuje místo, kam autor obdržel bezplatný nebo dotovaný přístup"
},
"category_interaction": {
"message": "Připomenutí interakce (odběr)"
},
"category_interaction_description": {
"message": "Při krátké připomínce dát like, odběr nebo sledování tvůrce uprostřed obsahu. Pokud je segment dlouhý nebo zahrnuje něco specifického, mělo by být místo toho zařazeno do vlastní propagace."
},
"category_interaction_guideline1": {
"message": "Krátká připomenutí pro lajknutí, odebírání či sledování"
},
"category_interaction_guideline2": {
"message": "Zahrnuje nepřímé připomenutí komentování"
},
"category_interaction_guideline3": {
"message": "Není pro obecnou propagaci, pouze výzvy k akci"
},
"category_interaction_short": {
"message": "Připomenutí interakce"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Přestávka"
},
"category_intro_guideline1": {
"message": "Část bez skutečného obsahu"
},
"category_intro_guideline2": {
"message": "Není pro přechody s informacemi"
},
"category_outro": {
"message": "Koncové karty / titulky"
},
"category_outro_description": {
"message": "Titulky nebo když se objeví konečné karty YouTube. Není pro závěry s informacemi."
},
"category_outro_guideline1": {
"message": "Nezahrnuje obsah, i když jsou na obrazovce závěrečné karty"
},
"category_preview": {
"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_preview_guideline1": {
"message": "Klipy které se objeví později nebo v budoucím videu"
},
"category_preview_guideline2": {
"message": "Shrnutí předchozího videa"
},
"category_preview_guideline3": {
"message": "Není pro sekce, které přidávají další obsah"
},
"category_filler": {
"message": "Výplň / vtipy"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Výplň"
},
"category_filler_guideline1": {
"message": "Tangenciální scény pouze pro výplň nebo humor"
},
"category_filler_guideline2": {
"message": "Rozptýlení, nepovedené scénky, opakování"
},
"category_filler_guideline3": {
"message": "Není pro scény vyžadované k pochopení tématu"
},
"category_music_offtopic": {
"message": "Hudba: nehudební sekce"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Jiné než hudba"
},
"category_music_offtopic_guideline1": {
"message": "Sekce, které nejsou v oficiálních vydáních"
},
"category_music_offtopic_guideline2": {
"message": "Nehudební sekce na živém vystoupení"
},
"category_poi_highlight": {
"message": "Zvýraznění"
},
"category_poi_highlight_description": {
"message": "Část videa, kterou hledá většina lidí. Podobné komentářům typu \"Video začíná v x\"."
},
"category_poi_highlight_guideline1": {
"message": "Sekce, kterou hledá většina lidí"
},
"category_poi_highlight_guideline2": {
"message": "Může pomoci přeskočit předchozí kontext"
},
"category_poi_highlight_guideline3": {
"message": "Může přeskočit k názvu nebo náhledu"
},
"category_livestream_messages": {
"message": "Livestream: Čtení donatů / zpráv"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Zjistit více"
},
"FullDetails": {
"message": "Úplné podrobnosti"
},
"CopyDownvoteButtonInfo": {
"message": "Zahlasuje proti a vytvoří pro vás lokální kopii pro opětovné odeslání"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Otevřít stránku s možnostmi"
},
"resetToDefault": {
"message": "Obnovit nastavení na výchozí hodnoty"
},
"confirmResetToDefault": {
"message": "Opravdu chcete obnovit všechna nastavení na jejich výchozí hodnoty? Tato akce je nevratná."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Zeige Pop-up nach dem Überspringen eines Segments"
},
"showCategoryGuidelines": {
"message": "Zeige Kategorien-Hilfe"
},
"noticeVisibilityMode0": {
"message": "Skip-Meldung in voller größe"
},
@@ -303,7 +306,7 @@
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "Der Server scheint überlastet zu sein. Probiere es in ein paar Sekunden erneut."
"message": "Der Server ist wahrescheinlich überlastet. Probiere es später nochmal."
},
"errorCode": {
"message": "Fehlermeldung: "
@@ -542,18 +545,39 @@
"message": "bis",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Geschmeidige Übergänge einbeziehen"
},
"generic_guideline2": {
"message": "Spielt, als ob nichts übersprungen worden wäre"
},
"category_sponsor": {
"message": "Gesponserte Videosegmente"
},
"category_sponsor_description": {
"message": "Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung, nicht für Eigenwerbung, kostenlose Fremdwerbung oder Empfehlungen für Anlässe/Personen/Webseiten/Produkte."
},
"category_sponsor_guideline1": {
"message": "Bezahlte Aktionen"
},
"category_sponsor_guideline2": {
"message": "Nicht für Spenden oder eigenen Merch"
},
"category_selfpromo": {
"message": "Unbezahlt/Eigenwerbung"
},
"category_selfpromo_description": {
"message": "Ähnlich wie bei \"gesponserte Videosegmente\", mit Ausnahme von unbezahlten oder Selbstpromotionen. Dies beinhaltet Merchandising (Fan-Artikel), Spenden oder Informationen darüber, mit wem für das Video zusammengearbeitet wurde."
},
"category_selfpromo_guideline1": {
"message": "Spenden, Mitgliedschaften und eigener Merch"
},
"category_selfpromo_guideline2": {
"message": "Kostenlose Erwähnungen welche nicht zum Video beitragen"
},
"category_selfpromo_guideline3": {
"message": "Nicht für Produkte und Merch von Firmen"
},
"category_exclusive_access": {
"message": "Exklusiver Zugriff"
},
@@ -564,12 +588,24 @@
"message": "Dieses Video präsentiert ein Produkt, eine Dienstleistung oder einen Ort, zu welchem sie freien oder subventionierten Zugriff erhalten haben",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Das gesamte Video zeigt etwas, zu dem man kostenlosen oder subventionierten Zugang erhalten hat"
},
"category_interaction": {
"message": "Interaktions-Erinnerungen (Abonnieren, etc.)"
},
"category_interaction_description": {
"message": "Wenn es im Video eine kurze Erinnerung gibt, den Kanal zu abonnieren oder das Video mit \"Mag ich\" zu markieren."
},
"category_interaction_guideline1": {
"message": "Kurze Erinnerungen um zu Liken, Abonnieren oder zu Folgen"
},
"category_interaction_guideline2": {
"message": "Enthält indirekte Erinnerungen zu kommentieren"
},
"category_interaction_guideline3": {
"message": "Nicht für allgemeine Förderung, nur Aufruf zum Handeln"
},
"category_interaction_short": {
"message": "Interaktions-Erinnerung"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Unterbrechung"
},
"category_intro_guideline1": {
"message": "Intervall ohne aktuellen Inhalt"
},
"category_intro_guideline2": {
"message": "Nicht für Übergänge mit Informationen"
},
"category_outro": {
"message": "Endkarten/Quellen/Anerkennungen"
},
"category_outro_description": {
"message": "Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für videobeendende Schlussfolgerungen mit Informationen."
},
"category_outro_guideline1": {
"message": "Enthalten keinen Inhalt, selbst wenn Endcards zu sehen sind"
},
"category_preview": {
"message": "Vorschau/Zusammenfassung"
},
"category_preview_description": {
"message": "Kurze Zusammenfassung bisheriger Videos oder eine Vorschau auf das aktuelle Video. Für zusammengeschnittene Clips gedacht, jedoch nicht für mündliche Zusammenfassungen."
},
"category_preview_guideline1": {
"message": "Clips welche später oder in einem zukünftigen Video erscheinen"
},
"category_preview_guideline2": {
"message": "Recap eines vorherigen Videos"
},
"category_preview_guideline3": {
"message": "Nicht für Bereiche, welche zusätzliche Inhalte geben"
},
"category_filler": {
"message": "Füller/Witze"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Füller"
},
"category_filler_guideline1": {
"message": "Tangentielle Szenen nur für Füller oder Humor"
},
"category_filler_guideline2": {
"message": "Ablenkungen, Patzer, Replays"
},
"category_filler_guideline3": {
"message": "Nicht für Szenen, welche zum verstehen des Topics sind"
},
"category_music_offtopic": {
"message": "Musikvideoteile ohne Musik"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Musikvideoteile ohne Musik"
},
"category_music_offtopic_guideline1": {
"message": "Bereiche nicht in offiziellen Veröffentlichungen"
},
"category_music_offtopic_guideline2": {
"message": "Nicht-Musik in einer Live-Performance"
},
"category_poi_highlight": {
"message": "Highlight"
},
"category_poi_highlight_description": {
"message": "Der Teil des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare."
},
"category_poi_highlight_guideline1": {
"message": "Bereiche die die meisten Personen suchen"
},
"category_poi_highlight_guideline2": {
"message": "Kann helfen, vergangene Inhalte zu überspringen"
},
"category_poi_highlight_guideline3": {
"message": "Kann zum Titel oder Thumbnail überspringen"
},
"category_livestream_messages": {
"message": "In Livestreams Spenden/Nachrichten vorlesen"
},
@@ -832,7 +910,7 @@
"message": "Das übermitteln kann entweder im Popup durch das drücken vom \"Segment Started Jetzt\" Knopf oder im Videoplayer mit den Knöpfen im Player gemacht werden."
},
"helpPageSubmitting2": {
"message": "Mit einem Klick auf den Play-Knopf wird der Beginn eines Segments und mit dem klick auf den Stop-Knopf das ende eines Segments markiert. Du kannst mehrere Sponsoren vorbereiten, bevor du auf Absenden klickst. Das klicken des Upload-Knopfes wird die Segmente übermitteln. Das klicken des Mülleimers löscht es."
"message": "Mit einem Klick auf den Play-Button wird der Beginn eines Segments markiert, und mit einem Klick auf den Stop-Button dessen Ende. Du kannst mehrere Segmente anlegen, bevor du durch Klicken des Upload-Buttons zum Einreichen fortfährst. Ein Klick auf die Mülltonne löscht deine angelegten Segmente."
},
"Editing": {
"message": "Bearbeitung"
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Erfahre mehr"
},
"FullDetails": {
"message": "Vollständige Details"
},
"CopyDownvoteButtonInfo": {
"message": "Downvotet, und erstellt eine lokale Kopie zum erneuten Einreichen"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Einstellungen öffnen"
},
"resetToDefault": {
"message": "Einstellungen zurücksetzen"
},
"confirmResetToDefault": {
"message": "Sind Sie sicher, dass Sie alle Einstellungen auf ihre Standardwerte zurücksetzen wollen? Dies kann nicht rückgängig gemacht werden."
}
}

View File

@@ -227,6 +227,9 @@
"showSkipNotice": {
"message": "Εμφάνιση ειδοποιήσεων μετά την παράλειψη κάθε τμήματος"
},
"showCategoryGuidelines": {
"message": "Εμφάνιση βοήθειας κατηγοριών"
},
"noticeVisibilityMode0": {
"message": "Ειδοποιήσεις παράλειψης πλήρους μεγέθους"
},
@@ -737,6 +740,9 @@
"LearnMore": {
"message": "Μάθετε περισσότερα"
},
"ContinueVoting": {
"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)."
@@ -744,5 +750,14 @@
"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)."
},
"openOptionsPage": {
"message": "Άνοιγμα σελίδας επιλογών"
},
"resetToDefault": {
"message": "Επαναφορά των προκαθορισμένων ρυθμίσεων"
},
"confirmResetToDefault": {
"message": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε όλες τις ρυθμίσεις στις προεπιλεγμένες τιμές τους; Αυτό δεν μπορεί να αναιρεθεί."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Show Notice After A Segment Is Skipped"
},
"showCategoryGuidelines": {
"message": "Show Category Help"
},
"noticeVisibilityMode0": {
"message": "Full Size Skip Notices"
},
@@ -542,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"
},
@@ -564,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 with 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"
},
@@ -582,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"
},
@@ -603,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"
},
@@ -612,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 skip context"
},
"category_poi_highlight_guideline3": {
"message": "Can skip to the title or thumbnail"
},
"category_livestream_messages": {
"message": "Livestream: Donation/Message Readings"
},
@@ -867,7 +945,10 @@
"LearnMore": {
"message": "Learn More"
},
"CopyDownvoteButtonInfo": {
"FullDetails": {
"message": "Full Details"
},
"CopyDownvoteButtonInfo": {
"message": "Downvotes and creates a local copy for you to resubmit"
},
"OpenCategoryWikiPage": {

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Mostrar aviso después de que se omita un segmento"
},
"showCategoryGuidelines": {
"message": "Mostrar Ayuda de la Categoría"
},
"noticeVisibilityMode0": {
"message": "Avisos de Omisión de Tamaño Completo"
},
@@ -542,11 +545,20 @@
"message": "a",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline2": {
"message": "Se reproduce como si no se hubiera omitido nada"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o anuncios gratuitos a causas/creadores/sitios web/productos que les gusten."
"message": "Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o agradecimientos gratuitos a causas/creadores/sitios web/productos que les gusten."
},
"category_sponsor_guideline1": {
"message": "Promociones pagadas"
},
"category_sponsor_guideline2": {
"message": "No para donaciones o mercancía personalizada"
},
"category_selfpromo": {
"message": "Promoción Propia/No Remunerada"
@@ -554,6 +566,12 @@
"category_selfpromo_description": {
"message": "Similar a \"sponsor\", excepto que para la promoción propia o no remunerada. Esto incluye secciones sobre mercancía, donaciones o información sobre con quiénes colaboraron."
},
"category_selfpromo_guideline1": {
"message": "Donaciones, membresías y mercancía personalizada"
},
"category_selfpromo_guideline2": {
"message": "Agradecimientos gratuitos que no añaden al video"
},
"category_exclusive_access": {
"message": "Acceso Exclusivo"
},
@@ -947,5 +965,11 @@
},
"openOptionsPage": {
"message": "Abrir página de opciones"
},
"resetToDefault": {
"message": "Restablecer los ajustes por defecto"
},
"confirmResetToDefault": {
"message": "¿Estás seguro de que quieres restablecer todos los ajustes a sus valores por defecto? Esto no se puede deshacer."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Kuva segmendi vahelejätmisel teatis"
},
"showCategoryGuidelines": {
"message": "Kuva kategooria abi"
},
"noticeVisibilityMode0": {
"message": "Täissuuruses vahelejätmise teavitused"
},
@@ -533,18 +536,39 @@
"message": "kuni",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Kasuta sujuvaid üleminekuid"
},
"generic_guideline2": {
"message": "Mängib nii, nagu midagi poleks vahele jäetud"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Tasulised promod, tasulised viited ja otsesed reklaamid. Pole mõeldud enesepromo või tasuta petitsioonide/autorite/veebilehtede/toodete mainimiste puhul."
},
"category_sponsor_guideline1": {
"message": "Tasulised kampaaniad"
},
"category_sponsor_guideline2": {
"message": "Mitte annetuste ja oma loodud kauba jaoks"
},
"category_selfpromo": {
"message": "Tasumata/enesepromo"
},
"category_selfpromo_description": {
"message": "Sarnaneb \"sponsorile\", ent on mõeldud tasumata või enesepromo jaoks. Selle alla kuuluvad jaotised oma müüdava kauba, annetuste ja koostööpartnerite kohta."
},
"category_selfpromo_guideline1": {
"message": "Annetused, liikmesused ja oma loodud kaup"
},
"category_selfpromo_guideline2": {
"message": "Tasuta mainimised, mis ei ole video sisuks olulised"
},
"category_selfpromo_guideline3": {
"message": "Mitte ettevõtete disainitud toodete ja kauba jaoks"
},
"category_exclusive_access": {
"message": "Eksklusiivne ligipääs"
},
@@ -555,12 +579,24 @@
"message": "See video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Kogu video kuvab midagi tasuta või toetusega ligipääsuga"
},
"category_interaction": {
"message": "Tegutsemise meeldetuletus (kanali tellimine)"
},
"category_interaction_description": {
"message": "Lühike sisukeskne meeldetuletus anda videole meeldib, tellida kanalit või jälgida autorit. Kui see on pikk või millegi kindlaga seotud, peaks see olema enesepromo all."
},
"category_interaction_guideline1": {
"message": "Lühikesed meeldetuletused vajutada \"meeldib\", \"telli\" või \"jälgi\""
},
"category_interaction_guideline2": {
"message": "Sisaldab mitteotseseid meeldetuletusi kommenteerimiseks"
},
"category_interaction_guideline3": {
"message": "Mitte üldise promo jaoks, vaid üleskutsed tegevustele"
},
"category_interaction_short": {
"message": "Tegutsemise meeldetuletus"
},
@@ -573,18 +609,36 @@
"category_intro_short": {
"message": "Vaheaeg"
},
"category_intro_guideline1": {
"message": "Intervall ilma tegeliku sisuta"
},
"category_intro_guideline2": {
"message": "Mitte informatsiooniga üleminekute jaoks"
},
"category_outro": {
"message": "Lõpukaardid/-tiitrid"
},
"category_outro_description": {
"message": "Tiitrid või YouTube'i lõpukaardid. Pole mõeldud informatsiooniga järelduste jaoks."
},
"category_outro_guideline1": {
"message": "Ära kaasa sisu, isegi kui lõputiitrid on ekraanil"
},
"category_preview": {
"message": "Eelvaade/kokkuvõte"
},
"category_preview_description": {
"message": "Kiire kokkuvõte eelmistest episoodidest või eelvaade videos hiljem tulevast. Mõeldud valmis töödeldud klippide, mitte suuliste kokkuvõtete jaoks."
},
"category_preview_guideline1": {
"message": "Klipid, mida kuvatakse hiljem või tulevases videos"
},
"category_preview_guideline2": {
"message": "Eelmise video kokkuvõte"
},
"category_preview_guideline3": {
"message": "Mitte jaotistele, mis lisavad täiendavat sisu"
},
"category_filler": {
"message": "Täitesisu/naljad"
},
@@ -594,6 +648,15 @@
"category_filler_short": {
"message": "Täide"
},
"category_filler_guideline1": {
"message": "Sisuga mitteseonduvad täite- või huumoristseenid"
},
"category_filler_guideline2": {
"message": "Tähelepanu hajutajad, saatevead, kordused"
},
"category_filler_guideline3": {
"message": "Mitte stseenid, mida on teema mõistmiseks vaja vaadata"
},
"category_music_offtopic": {
"message": "Muusika: mitte-muusika jaotis"
},
@@ -603,12 +666,27 @@
"category_music_offtopic_short": {
"message": "Mitte-muusika"
},
"category_music_offtopic_guideline1": {
"message": "Jaotised, mida avalikes väljalasetes pole"
},
"category_music_offtopic_guideline2": {
"message": "Mitte-muusika kontserdil"
},
"category_poi_highlight": {
"message": "Esiletõst"
},
"category_poi_highlight_description": {
"message": "Video osa, mida enamus inimesed otsivad. Sarnaneb kommentaaridele stiilis \"video algab ajal x\"."
},
"category_poi_highlight_guideline1": {
"message": "Jaotis, mida inimesed enim otsivad"
},
"category_poi_highlight_guideline2": {
"message": "Aitab konteksti vahele jätta"
},
"category_poi_highlight_guideline3": {
"message": "Aitab pealkirja või pisipildi sisuni viia"
},
"category_livestream_messages": {
"message": "Otseülekanne: annetuste ja sõnumite lugemine"
},
@@ -834,6 +912,9 @@
"LearnMore": {
"message": "Lisateave"
},
"FullDetails": {
"message": "Täielikud üksikasjad"
},
"CopyDownvoteButtonInfo": {
"message": "Annab vastuhääle ja loob kohaliku koopia, mida saad uuesti saata"
},
@@ -906,10 +987,19 @@
"change": {
"message": "Muuda"
},
"youtubeKeybindWarning": {
"message": "See on YouTube'i sisseehitatud otsetee. Kas soovid kindlasti seda kasutada?"
},
"betaServerWarning": {
"message": "BEETAserver on lubatud!"
},
"openOptionsPage": {
"message": "Ava valikute leht"
},
"resetToDefault": {
"message": "Lähtesta sätted vaikeväärtustele"
},
"confirmResetToDefault": {
"message": "Kas soovid kindlasti kõik sätted vaikeväärtustele lähtestada? Seda ei saa tagasi võtta."
}
}

View File

@@ -44,7 +44,7 @@
"message": "Älä näytä koskaan"
},
"hitGoBack": {
"message": "Paina 'älä ohita' palatakasesi kohtaan, jossa olit."
"message": "Paina 'älä ohita' palataksesi kohtaan, jossa olit."
},
"unskip": {
"message": "Älä ohita"
@@ -180,7 +180,7 @@
"message": "Näytä painikkeet YouTuben soittimessa"
},
"hideButtons": {
"message": "Piilota painikkeet YouTuben soittimesta"
"message": "Piilota painikkeet YouTuben soittimessa"
},
"hideButtonsDescription": {
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
@@ -198,7 +198,7 @@
"message": "Piilota info-painike automaattisesti"
},
"hideDeleteButton": {
"message": "Piilota poista-painike YouTuben soittimesta"
"message": "Piilota poista-painike YouTuben soittimessa"
},
"showDeleteButton": {
"message": "Näytä poista-painike YouTuben soittimessa"
@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Näytä ilmoitus ohitetun osion jälkeen"
},
"showCategoryGuidelines": {
"message": "Näytä kategorian ohje"
},
"noticeVisibilityMode0": {
"message": "Täysikokoiset ohitusilmoitukset"
},
@@ -542,11 +545,23 @@
"message": "-",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Sisällytä siirtymät osioon"
},
"generic_guideline2": {
"message": "Video toistuu ikään kuin mitään ei olisi ohitettu"
},
"category_sponsor": {
"message": "Sponsori"
},
"category_sponsor_description": {
"message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai huikkauksille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."
"message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."
},
"category_sponsor_guideline1": {
"message": "Maksetut mainostukset"
},
"category_sponsor_guideline2": {
"message": "Ei lahjoituksille tai omalle kauppatavaralle"
},
"category_selfpromo": {
"message": "Maksamaton/Itsensä mainostus"
@@ -554,6 +569,15 @@
"category_selfpromo_description": {
"message": "Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."
},
"category_selfpromo_guideline1": {
"message": "Lahjoitukset, jäsenyydet ja oma kauppatavara"
},
"category_selfpromo_guideline2": {
"message": "Ilmaiset maininnat, jotka eivät tuo videolle lisäarvoa"
},
"category_selfpromo_guideline3": {
"message": "Ei yritysten luomille tuotteille tai kauppatavaralle"
},
"category_exclusive_access": {
"message": "Yksinoikeudellinen ensikatsaus"
},
@@ -564,12 +588,24 @@
"message": "Tämä video esittelee tuotteen, palvelun tai sijainnin, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Koko video esittelee jotakin, jonka käyttöoikeus on saatu veloituksetta tai tuetusti"
},
"category_interaction": {
"message": "Vuorovaikutusmuistutus (tilaaminen)"
},
"category_interaction_description": {
"message": "Lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai koskee jotain tiettyä asiaa, tulisi se merkitä mielummin itsensä mainostamiseksi."
},
"category_interaction_guideline1": {
"message": "Lyhyet muistutukset tykätä, tilata tai seurata"
},
"category_interaction_guideline2": {
"message": "Sisältää epäsuorat muistutukset kommenttien jättämisestä"
},
"category_interaction_guideline3": {
"message": "Ei yleiselle mainostukselle, vain toimintapyynnöille"
},
"category_interaction_short": {
"message": "Vuorovaikutusmuistutus"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Tauko"
},
"category_intro_guideline1": {
"message": "Tauko ilman varsinaista sisältöä"
},
"category_intro_guideline2": {
"message": "Ei tietoa sisältäville siirtymille"
},
"category_outro": {
"message": "Loppukortit/-tekstit"
},
"category_outro_description": {
"message": "Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille joissa on tietoa."
},
"category_outro_guideline1": {
"message": "Älä sisällytä sisältöä, vaikka loppukortit olisivatkin näytöllä"
},
"category_preview": {
"message": "Esikatselu/Kertaus"
},
"category_preview_description": {
"message": "Nopea kertaus aiemmista jaksoista, tai esikatselu siitä, mitä on tulossa myöhemmin nykyisessä videossa. Tarkoitettu yhteen editoituja klippejä varten, ei puhutuille yhteenvedoille."
},
"category_preview_guideline1": {
"message": "Myöhemmin tai tulevassa videossa ilmestyvät klipit"
},
"category_preview_guideline2": {
"message": "Kertaus edellisestä videosta"
},
"category_preview_guideline3": {
"message": "Ei osioille, jotka lisäävät uutta sisältöä"
},
"category_filler": {
"message": "Epäolennainen täytesisältö/Vitsit"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Täytesisältö"
},
"category_filler_guideline1": {
"message": "Täytteeksi tai huumoriksi lisätyt toissijaiset kohtaukset"
},
"category_filler_guideline2": {
"message": "Häiriöt, blooperit, uusinnat"
},
"category_filler_guideline3": {
"message": "Ei aiheen ymmärtämiseen tarvittavia kohtauksia varten"
},
"category_music_offtopic": {
"message": "Musiikki: Musiikiton osa"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Musiikiton"
},
"category_music_offtopic_guideline1": {
"message": "Osat, jotka eivät ole virallisissa julkaisuissa"
},
"category_music_offtopic_guideline2": {
"message": "Musiikittomat kohdat live-esityksissä"
},
"category_poi_highlight": {
"message": "Kohokohta"
},
"category_poi_highlight_description": {
"message": "Kohta videossa, mitä suurin osa ihmisistä etsivät.\nSamankaltainen \"Video alkaa kohdassa x\" kommenttien kanssa."
},
"category_poi_highlight_guideline1": {
"message": "Kohta mitä useimmat ihmiset etsivät"
},
"category_poi_highlight_guideline2": {
"message": "Voi ohittaa kontekstin"
},
"category_poi_highlight_guideline3": {
"message": "Voi ohittaa otsikon tai pikkukuvan viittaamaan kohtaan"
},
"category_livestream_messages": {
"message": "Livestream: lahjoitusten/viestien lukeminen"
},
@@ -779,7 +857,7 @@
"message": "Tämä osio on suuri. Jos koko video koskee yhtä aihetta, vaihda \"Ohita\" valintaan \"Koko video\". Katso lisätietoja säännöistä."
},
"categoryPillTitleText": {
"message": "Koko video on merkitty tällä luokituksella ja se on liian tiiviisti integroitu eroteltavaksi"
"message": "Koko video on merkitty tällä kategorialla ja on erotettavaksi liian tiiviisti integroitu"
},
"experiementOptOut": {
"message": "Jättäydy pois kaikista tulevista kokeiluista",
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Opi lisää"
},
"FullDetails": {
"message": "Täydet tiedot"
},
"CopyDownvoteButtonInfo": {
"message": "Äänestää alas ja luo paikallisen kopion, jonka voit lähettää uudelleen"
},
@@ -883,10 +964,10 @@
"message": "Tämä vaikuttaa sinun osioihin välittömästi"
},
"downvote": {
"message": "Äänestä puolesta"
"message": "Äänestä alas"
},
"upvote": {
"message": "Äänestä vastaan"
"message": "Äänestä ylös"
},
"hideSegment": {
"message": "Piilota osio"
@@ -930,7 +1011,7 @@
"description": "Option label"
},
"unbind": {
"message": "Poista valinta",
"message": "Poista kytkös",
"description": "Unbind keyboard shortcut"
},
"notSet": {
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Avaa asetussivu"
},
"resetToDefault": {
"message": "Palauta oletusasetukset"
},
"confirmResetToDefault": {
"message": "Haluatko varmasti palauttaa kaikki asetukset oletusarvoihin? Tätä ei voi perua."
}
}

View File

@@ -86,7 +86,7 @@
"message": "Annuler la création de segment"
},
"noVideoID": {
"message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet si il est censé y en avoir une."
"message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet s'il s'agit d'une erreur."
},
"refreshSegments": {
"message": "Rafraîchir les segments"
@@ -552,7 +552,7 @@
"message": "Non rémunéré/autopromotion"
},
"category_selfpromo_description": {
"message": "Semblable au \"sponsor\", excepté pour la promotion non rémunérée ou l'auto-promotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs."
"message": "Semblable aux \"messages commerciaux\", excepté pour la promotion non rémunérée ou l'autopromotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs."
},
"category_exclusive_access": {
"message": "Accès exclusif"
@@ -832,7 +832,7 @@
"message": "La soumission peut être effectuée dans le popup en appuyant sur le bouton \"le segment commence maintenant\" ou dans le lecteur vidéo avec les boutons du lecteur."
},
"helpPageSubmitting2": {
"message": "Cliquer sur le bouton de lecture indique le début d'un segment et cliquer sur l'icône d'arrêt indique la fin. Vous pouvez préparer plusieurs sponsors avant d'appuyer sur Soumettre. Cliquer sur le bouton de soumission enverra le segment. Cliquer sur le poubelle supprimera vos segments."
"message": "Cliquer sur le bouton de lecture indique le début d'un segment et cliquer sur l'icône d'arrêt indique sa fin. Vous pouvez préparer plusieurs messages commerciaux avant d'appuyer sur Soumettre. Cliquer sur le bouton Téléverser soumettra vos segments. Cliquer sur la poubelle supprimera vos segments."
},
"Editing": {
"message": "Édition en cours"
@@ -947,5 +947,11 @@
},
"openOptionsPage": {
"message": "Ouvrir la page d'options"
},
"resetToDefault": {
"message": "Rétablir les paramètres par défaut"
},
"confirmResetToDefault": {
"message": "Êtes-vous sûr de vouloir rétablir tous les paramètres ? Cette action ne peut pas être annulée."
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Kopiraj javni UserID"
},
"copySegmentID": {
"message": "Kopiraj ID odsječka"
},
"discordAdvert": {
"message": "Pridružite nam se u službenoj Discord zajednici i pošaljite svoje prijedloge i povrate informacije!"
},
@@ -214,6 +217,21 @@
"message": "Izvorni kod",
"description": "Used on Firefox Store Page"
},
"setSkipShortcut": {
"message": "Preskoči odsječak",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "Pokreni/prekini odsječak",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Pošalji odsječke",
"description": "Keybind label"
},
"keybindDescription": {
"message": "Odaberi tipku upisom tipke i odaberi modifikatorske tipke koje želiš koristiti."
},
"0": {
"message": "Veza istekla. Provjerite svoju internetski vezu. Ako vaš internet radi, poslužitelj je vjerojatno preopterećen ili nedostupan."
},
@@ -236,6 +254,13 @@
"skip": {
"message": "Preskoči"
},
"mute": {
"message": "Isključi zvuk"
},
"full": {
"message": "Cijeli video",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "Preskočiti {0}?"
},
@@ -246,6 +271,14 @@
"message": "Preskočiti na {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Preskočeno: {0}",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "Isključen zvuk: {0}",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Preskočeno na {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
@@ -256,6 +289,12 @@
"enableAutoSkip": {
"message": "Aktiviraj automatsko preskakanje"
},
"audioNotification": {
"message": "Zvučna obavijest pri preskakanju"
},
"audioNotificationDescription": {
"message": "Zvučna obavijest o preskakanju reproducirat će zvuk kad god se odsječak preskoči. Ako je deaktivirano (ili je automatsko preskakanje deaktivirano), zvuk se neće reproducirati."
},
"minLower": {
"message": "min"
},
@@ -271,6 +310,9 @@
"statusReminder": {
"message": "Provjerite status.sponsor.ajay.app za status poslužitelja."
},
"changeUserID": {
"message": "Uvezi/Izvezi svoj korisnički ID"
},
"setUserID": {
"message": "Postavi UserID"
},
@@ -313,6 +355,9 @@
"skipNoticeDurationDescription": {
"message": "Obavijest o preskakanju ostat će na zaslonu barem ovoliko dugo. Za ručno preskakanje može biti duže vidljivo."
},
"showUploadButton": {
"message": "Prikaži gumb za prijenos"
},
"customServerAddress": {
"message": "Adresa SponsorBlock poslužitelja"
},
@@ -322,9 +367,21 @@
"reset": {
"message": "Resetiraj"
},
"mobileUpdateInfo": {
"message": "Sada se podržava m.youtube.com"
},
"exportOptions": {
"message": "Uvezi/Izvezi sve postavke"
},
"exportOptionsCopy": {
"message": "Uredi/kopiraj"
},
"exportOptionsDownload": {
"message": "Spremi u datoteku"
},
"exportOptionsUpload": {
"message": "Učitaj iz datoteke"
},
"setOptions": {
"message": "Postavi opcije"
},
@@ -371,6 +428,12 @@
"category_selfpromo_description": {
"message": "Slično kao „sponzor”, osim za neplaćenu promociju i samopromociju. To uključuje odlomke marketinga, donacija ili informacija o tome, s kim su surađivali."
},
"category_exclusive_access": {
"message": "Eksluzivni pristup"
},
"category_exclusive_access_description": {
"message": "Samo za označavanje cijelih videa. Koristi se kad video prikazuje proizvod, uslugu ili lokaciju za koje su dobili besplatan ili subvencionirani pristup."
},
"category_interaction": {
"message": "Podsjetnik interakcije (Pretplati se)"
},
@@ -419,6 +482,18 @@
"manualSkip": {
"message": "Ručno preskakanje"
},
"disable": {
"message": "Deaktiviraj"
},
"autoSkip_POI": {
"message": "Automatski skoči na početak"
},
"manualSkip_POI": {
"message": "Pitaj kad se učitava video"
},
"showOverlay_full": {
"message": "Prikaži oznaku"
},
"muteSegments": {
"message": "Dopustite isječke koji isključuju zvuk umjesto da ga preskaču"
},
@@ -436,6 +511,9 @@
"enableTestingServer": {
"message": "Omogućite poslužitelj za beta testiranje"
},
"testingServerWarning": {
"message": "Svi podnesci i glasovi NEĆE BROJATI u glavnom poslužitelju dok se povezuješ s testnim poslužiteljem. Obavezno deaktiviraj ovo kada želiš slati podneske."
},
"bracketNow": {
"message": "(sada)"
},
@@ -446,7 +524,7 @@
"message": "Odaberi kategoriju"
},
"enableThisCategoryFirst": {
"message": "Da biste poslali segmente s kategorijom \"{0}\", morate je omogućiti u postavkama. Sada ćete biti preusmjereni na postavke.",
"message": "Za slanje odsječaka kategorije „{0}, moraš je aktivirati u postavkama. Sada ćemo te preusmjeriti na postavke.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
@@ -455,6 +533,9 @@
"bracketEnd": {
"message": "(kraj)"
},
"manuallyHidden": {
"message": "ručno skriveno"
},
"downvoteDescription": {
"message": "Neispravno/krivo vrijeme"
},
@@ -480,12 +561,28 @@
"categoryUpdate2": {
"message": "Otvori opcije za preskakanje uvoda, kraja, proizvoda itd."
},
"help": {
"message": "Pomoć"
},
"GotIt": {
"message": "Razumijem",
"description": "Used as the button to dismiss a tooltip"
},
"categoryPillTitleText": {
"message": "Ovaj cijeli video označen je kao ova kategorija i previše je integriran da bi se mogao odvojiti"
},
"hideForever": {
"message": "Sakrij zauvijek"
},
"Donate": {
"message": "Doniraj"
},
"helpPageThanksForInstalling": {
"message": "Hvala na instaliranju SponsorBlocka."
},
"helpPageFeatureDisclaimer": {
"message": "Mnoge funkcije su standardno deaktivirane. Ako želiš preskočiti uvode, završne dijelove, koristiti Invidious, itd., aktiviraj ih niže dolje. Također možeš sakriti/prikazati elemente korisničkog sučelja."
},
"Submitting": {
"message": "Slanje"
},
@@ -518,5 +615,61 @@
},
"ChangeCategoryTooltip": {
"message": "Ovo će se odmah primijeniti na vaše isječke"
},
"hideSegment": {
"message": "Sakri odsječak"
},
"dayAbbreviation": {
"message": "d",
"description": "100d"
},
"hourAbbreviation": {
"message": "h",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Ponašanje",
"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": "Sučelje",
"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": "Tipkovni prečaci",
"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": "Sigurnosna kopija/Obnova",
"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": "Razno",
"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": "Izgled napomene preskakanja",
"description": "Option label"
},
"notSet": {
"message": "Nije postavljeno"
},
"change": {
"message": "Promijeni"
},
"youtubeKeybindWarning": {
"message": "Ovo je ugrađeni YouTube prečac. Stvarno ga želiš koristiti?"
},
"betaServerWarning": {
"message": "BETA poslužitelj je aktiviran!"
},
"openOptionsPage": {
"message": "Otvori stranicu opcija"
},
"resetToDefault": {
"message": "Vrati standardne postavke"
},
"confirmResetToDefault": {
"message": "Stvarno želiš vratiti sve postavke na standardne vrijednosti? To je nepovratna radnja."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Jelezzen, ha egy szegmens át lett ugorva"
},
"showCategoryGuidelines": {
"message": "Kategória útmutató megjelenítése"
},
"noticeVisibilityMode0": {
"message": "Teljes méretű átugrási értesítők"
},
@@ -542,11 +545,23 @@
"message": "",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Tartalmazza a felkonferálást/átvezetőket is"
},
"generic_guideline2": {
"message": "Olyan a lejátszás, mintha semmi sem lett volna átugorva"
},
"category_sponsor": {
"message": "Szponzor"
},
"category_sponsor_description": {
"message": "Fizetett promóció, vagy közvetlen reklám. Nem önpromóció vagy ingyenes ajánlat (shoutout) emberekről/termékekről/weboldalakról amik tetszenek nekik."
"message": "Fizetett promóció, vagy közvetlen reklám. Nem önpromóció, vagy ingyenes említése ügyeknek/tartalomkészítőknek/weboldalaknak/termékeknek amik tetszenek nekik."
},
"category_sponsor_guideline1": {
"message": "Fizetett promóciók"
},
"category_sponsor_guideline2": {
"message": "Nem adományok vagy saját termékek"
},
"category_selfpromo": {
"message": "Nem fizetett/önpromóció"
@@ -554,6 +569,15 @@
"category_selfpromo_description": {
"message": "Hasonló a szponzorhoz, de nem fizetett, vagy önpromóció. Beletartozik a saját ruhaáru, adományok, vagy infó arról, hogy kivel működtek együtt."
},
"category_selfpromo_guideline1": {
"message": "Adományok, tagságok és saját termékek"
},
"category_selfpromo_guideline2": {
"message": "Ingyenes köszönetnyilvánítások/említések, amik nem adnak hozzá a videóhoz"
},
"category_selfpromo_guideline3": {
"message": "Nem cégek által tervezett termékekhez"
},
"category_exclusive_access": {
"message": "Exkluzív hozzáférés"
},
@@ -564,12 +588,24 @@
"message": "Ez a videó olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "A teljes videó olyan dolgot mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak"
},
"category_interaction": {
"message": "Emlékeztető (Feliratkozás)"
},
"category_interaction_description": {
"message": "Egy rövid emlékeztető arról, hogy likeoljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik."
},
"category_interaction_guideline1": {
"message": "Rövid emlékeztető lájkolásra, feliratkozásra, vagy követésre"
},
"category_interaction_guideline2": {
"message": "Beletartoznak a közvetett emlékeztetők kommentelésre"
},
"category_interaction_guideline3": {
"message": "Nem általános promóciók, csak felhívások cselekvésre"
},
"category_interaction_short": {
"message": "Emlékeztető"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Megszakítás"
},
"category_intro_guideline1": {
"message": "Tényleges tartalom nélküli szakasz"
},
"category_intro_guideline2": {
"message": "Nem információt is tartalmazó átmenetekhez"
},
"category_outro": {
"message": "Záróképernyő/ Stáblista"
},
"category_outro_description": {
"message": "Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem használandó információt tartalmazó következtetésekkor."
},
"category_outro_guideline1": {
"message": "Ne legyen benne tartalom, akkor sem, ha a zárókártyák már a képernyőn vannak"
},
"category_preview": {
"message": "Előzetes/Ismétlés"
},
"category_preview_description": {
"message": "Az előző részekben történtek rövid ismétlése, vagy a videó további tartalmának előzetese. Összevágott jelenetekhez, nem szóbeli összegzéshez."
},
"category_preview_guideline1": {
"message": "Klipek amik megjelennek később, vagy egy jövőbeli videóban"
},
"category_preview_guideline2": {
"message": "Korábbi videó összefoglalója"
},
"category_preview_guideline3": {
"message": "Nem olyan részekhez, amik új tartalmat adnak a videóhoz"
},
"category_filler": {
"message": "Témától eltérő töltelék/viccek"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Töltelék"
},
"category_filler_guideline1": {
"message": "Témától eltérő jelenetek tölteléknek, vagy humornak"
},
"category_filler_guideline2": {
"message": "Figyelemelterelődés, bakik, újrajátszások"
},
"category_filler_guideline3": {
"message": "Nem olyan jelenetek, amik a téma megértéséhez szükségesek"
},
"category_music_offtopic": {
"message": "Zene: nem-zene szegmens"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Nem-Zene"
},
"category_music_offtopic_guideline1": {
"message": "Olyan részek, amik nincsenek a hivatalos kiadásokban"
},
"category_music_offtopic_guideline2": {
"message": "Nem zene egy élő előadásban"
},
"category_poi_highlight": {
"message": "Kiemelés"
},
"category_poi_highlight_description": {
"message": "A videónak az a része, amelyiket a legtöbb ember látni szeretne. Hasonlít az \"A videó x percnél kezdődik\" jellegű hozzászólásokhoz."
},
"category_poi_highlight_guideline1": {
"message": "A rész, amit a legtöbb ember keres"
},
"category_poi_highlight_guideline2": {
"message": "Segíthet a kontextus átugrásában"
},
"category_poi_highlight_guideline3": {
"message": "A címhez, vagy indexképhez ugorhat"
},
"category_livestream_messages": {
"message": "Élő adás: Adomány / üzenet olvasások"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Tudj meg többet"
},
"FullDetails": {
"message": "Teljes részletek"
},
"CopyDownvoteButtonInfo": {
"message": "Leszavazza és készít egy helyi másolatot, amit beküldhetsz"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Beállítások megnyitása"
},
"resetToDefault": {
"message": "Beállítások visszaállítása alapértelmezettre"
},
"confirmResetToDefault": {
"message": "Biztosan vissza szeretnéd állítani az összes beállítást az alapértelmezett értékekre? A műveletet nem lehet visszavonni."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Tampilkan pemberitahuan setelah melewati segmen"
},
"showCategoryGuidelines": {
"message": "Tampilkan Bantuan Kategori"
},
"noticeVisibilityMode0": {
"message": "Lewati maklumat ukuran penuh"
},
@@ -542,18 +545,39 @@
"message": "sampai",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Tampilkan transisi segue"
},
"generic_guideline2": {
"message": "Memainkan sebagai tidak apa pun yang dilewati"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Promosi dibayar, tautan dibayar dan iklan langsung. Tidak untuk promosi diri sendiri atau dukungan gratis untuk gerakan/kreator/situs/produk yang mereka suka."
},
"category_sponsor_guideline1": {
"message": "Promosi berbayar"
},
"category_sponsor_guideline2": {
"message": "Bukan untuk donasi atau barang dagangan kustom"
},
"category_selfpromo": {
"message": "Promosi Diri Sendiri/Tidak Dibayar"
},
"category_selfpromo_description": {
"message": "Mirip dengan \"sponsor\" kecuali ini tidak dibayar atau promosi diri sendiri. Ini termasuk merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka."
},
"category_selfpromo_guideline1": {
"message": "Donasi, langganan, dan barang dagangan kustom"
},
"category_selfpromo_guideline2": {
"message": "Sebutan gratis yang tidak menambahkan apa pun ke videonya"
},
"category_selfpromo_guideline3": {
"message": "Bukan untuk produk dan barang dagangan yang didesain oleh koperasi"
},
"category_exclusive_access": {
"message": "Akses Eksklusif"
},
@@ -564,12 +588,24 @@
"message": "Video ini mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Seluruh video pertunjukkan sesuatu dengan akses gratis atau berbayar"
},
"category_interaction": {
"message": "Pengingat Interaksi (Berlangganan)"
},
"category_interaction_description": {
"message": "Saat ada pengingat singkat untuk meminta suka, berlangganan atau mengikuti mereka di tengah konten. Jika panjang atau tentang sesuatu yang spesifik, sebaiknya pakai kategori promosi diri sendiri."
},
"category_interaction_guideline1": {
"message": "Pengingat pendek untuk menyukai video, berlangganan, atau ikuti"
},
"category_interaction_guideline2": {
"message": "Menampilkan pengingat tidak langsung untuk berkomentar"
},
"category_interaction_guideline3": {
"message": "Bukan untuk promosi umum, hanya bilang untuk melakukan tindakan"
},
"category_interaction_short": {
"message": "Pengingat Interaksi"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Jeda"
},
"category_intro_guideline1": {
"message": "Interval tanpa konten aslinya"
},
"category_intro_guideline2": {
"message": "Bukan untuk transisi dengan informasi"
},
"category_outro": {
"message": "Kartu Akhir/Kredit"
},
"category_outro_description": {
"message": "Kredit atau saat kartu akhir YouTube muncul. Tidak untuk kesimpulan dengan informasi."
},
"category_outro_guideline1": {
"message": "Jangan tampilkan konten, bahkan jika kartu akhir ada di layar"
},
"category_preview": {
"message": "Pratinjau/Rekap"
},
"category_preview_description": {
"message": "Rekapan singkat dari episode sebelumnya, atau pratinjau tentang apa yang akan terjadi nanti di video. Dimaksudkan untuk klip bersama yang di edit, bukan ringkasan yang diucapkan."
},
"category_preview_guideline1": {
"message": "Klip yang ditampilkan nanti, atau di video di masa mendatang"
},
"category_preview_guideline2": {
"message": "Rekap dari video sebelumnya"
},
"category_preview_guideline3": {
"message": "Bukan untuk bagian yang menambahkan konten tambahan"
},
"category_filler": {
"message": "Pengisi Tak berkaitan/Lawakan"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Isian"
},
"category_filler_guideline1": {
"message": "Scene tangen hanya untuk isian atau humor"
},
"category_filler_guideline2": {
"message": "Gangguan, blooper, replay"
},
"category_filler_guideline3": {
"message": "Bukan untuk scene yang dibutuhkan untuk mengerti topik"
},
"category_music_offtopic": {
"message": "Musik: Bagian Non-Musik"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Non-Musik"
},
"category_music_offtopic_guideline1": {
"message": "Bagian bukan di rilis resmi"
},
"category_music_offtopic_guideline2": {
"message": "Non-musik di pertunjukkan langsung"
},
"category_poi_highlight": {
"message": "Sorotan"
},
"category_poi_highlight_description": {
"message": "Bagian video yang banyak orang lihat. Sama untuk komentar \"Video dimulai di x\"."
},
"category_poi_highlight_guideline1": {
"message": "Bagian banyak orang yang mencari"
},
"category_poi_highlight_guideline2": {
"message": "Dapat melewati topik"
},
"category_poi_highlight_guideline3": {
"message": "Dapat melewati ke judul atau thumbnail"
},
"category_livestream_messages": {
"message": "Livestream: Baca Pesan/Donasi"
},
@@ -789,7 +867,7 @@
"message": "Sembunyikan selamanya"
},
"warningChatInfo": {
"message": "Anda mendapatkan peringatan dan tidak bisa mengirim segmen sementara. Ini dikarenakan kami melihat kamu melakukan beberapa kesalahan yang umum, mohon konfirmasi bahwa kamu mengerti perundangan dan kami akan hapus peringatan. Kamu bisa bergabung ke obrolan menggunakan discord.gg/SponsorBlock atau matrix.io/#/#sponsor:ajay.app"
"message": "Anda mendapatkan peringatan dan tidak bisa mengirim segmen sementara. Ini dikarenakan kami melihat Anda melakukan beberapa kesalahan yang umum, mohon konfirmasi bahwa Anda mengerti perundangan dan kami akan hapus peringatan. Anda dapat bergabung ke obrolan menggunakan discord.gg/SponsorBlock atau matrix.io/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Suara ditolak karena peringatan. Klik untuk buka obrolan untuk menyelesaikannya, atau kembali beberapa saat lagi ketika ada waktu.",
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Pelajari Lebih Lanjut"
},
"FullDetails": {
"message": "Detail Penuh"
},
"CopyDownvoteButtonInfo": {
"message": "Menurunkan suara dan membuat salinan lokal untuk Anda kirim ulang"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Buka laman opsi"
},
"resetToDefault": {
"message": "Atur ulang pengaturan ke bawaan"
},
"confirmResetToDefault": {
"message": "Apakah Anda yakin ingin mengatur ulang semua pengaturan ke nilai bawaan?\nTindakan ini tidak dapat diurungkan."
}
}

View File

@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Copia UserID Pubblico"
},
"copySegmentID": {
"message": "Copia ID Segmento"
},
"discordAdvert": {
"message": "Entra nel server Discord ufficiale per darci suggerimenti e feedback!"
},
@@ -236,6 +239,9 @@
"showSkipNotice": {
"message": "Mostra Avviso Dopo Aver Saltato un Segmento"
},
"showCategoryGuidelines": {
"message": "Mostra Aiuto della Categoria"
},
"noticeVisibilityMode0": {
"message": "Salta Avvisi di Dimensioni Complete"
},
@@ -539,18 +545,33 @@
"message": "a",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline2": {
"message": "Riproduci come se nulla fosse stato saltato"
},
"category_sponsor": {
"message": "Sponsorizzazione"
},
"category_sponsor_description": {
"message": "Promozione a pagamento, referral a pagamento e pubblicità diretta. Non per auto-promozione o ringraziamenti gratuiti a cause/creatori/siti web/ prodotti di loro gradimento."
},
"category_sponsor_guideline1": {
"message": "Promozioni a pagamento"
},
"category_sponsor_guideline2": {
"message": "Non per donazioni o merchandise personalizzato"
},
"category_selfpromo": {
"message": "Promozione non pagata/Autopromozione"
},
"category_selfpromo_description": {
"message": "Simile alle \"sponsorizzazioni\" tranne che per promozioni non pagate o autopromozioni. Ciò include sezioni riguardanti vendita di merce, donazioni o informazioni in merito a collaboratori."
},
"category_selfpromo_guideline1": {
"message": "Donazioni, abbonamenti e merce personalizzata"
},
"category_selfpromo_guideline3": {
"message": "Non per prodotti progettati da aziende e merce"
},
"category_exclusive_access": {
"message": "Accesso Esclusivo"
},
@@ -561,12 +582,24 @@
"message": "Questo video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "L'intero video mostra qualcosa con accesso gratuito o sovvenzionato"
},
"category_interaction": {
"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."
},
"category_interaction_guideline1": {
"message": "Brevi promemoria per mi piace, iscrizioni o follow"
},
"category_interaction_guideline2": {
"message": "Include promemoria indiretti al commento"
},
"category_interaction_guideline3": {
"message": "Non per promozione generale, solo chiamata all'azione"
},
"category_interaction_short": {
"message": "Promemoria di Interazione"
},
@@ -579,12 +612,21 @@
"category_intro_short": {
"message": "Interruzione"
},
"category_intro_guideline1": {
"message": "Intervallo senza contenuto effettivo"
},
"category_intro_guideline2": {
"message": "Non per transizioni con informazioni"
},
"category_outro": {
"message": "Conclusioni/Titoli di Coda"
},
"category_outro_description": {
"message": "I titoli di coda o quando vengono mostrate annotazioni a fine video su YouTube. Non per conclusioni provviste di informazioni."
},
"category_outro_guideline1": {
"message": "Non include contenuti, anche se le schede finali sono a schermo"
},
"category_preview": {
"message": "Anteprima/Riepilogo"
},
@@ -879,6 +921,9 @@
"ChangeCategoryTooltip": {
"message": "Questo si applicherà istantaneamente ai tuoi segmenti"
},
"hideSegment": {
"message": "Nascondi segmento"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Usa la rotellina del mouse passando sulla casella di modifica per regolare rapidamente il tempo. Le combinazioni dei tasti ctrl o shift sono utilizzabili per perfezionare le modifiche."
},
@@ -935,5 +980,11 @@
},
"openOptionsPage": {
"message": "Apri la pagina delle opzioni"
},
"resetToDefault": {
"message": "Ripristina le impostazioni predefinite"
},
"confirmResetToDefault": {
"message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questo non può essere annullato."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "구간을 건너뛴 후 알림 표시"
},
"showCategoryGuidelines": {
"message": "카테고리 도움말 표시"
},
"noticeVisibilityMode0": {
"message": "건너뛰기 알림 크게"
},
@@ -947,5 +950,11 @@
},
"openOptionsPage": {
"message": "설정 페이지 열기"
},
"resetToDefault": {
"message": "기본 설정으로 초기화"
},
"confirmResetToDefault": {
"message": "정말로 모든 설정을 기본값으로 초기화하시겠습니까? 되돌릴 수 없습니다."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Melding weergeven nadat een segment is overgeslagen"
},
"showCategoryGuidelines": {
"message": "Categorie-hulp weergeven"
},
"noticeVisibilityMode0": {
"message": "Volledige grootte overslaan-meldingen"
},
@@ -542,18 +545,39 @@
"message": "tot",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Inclusief vlotte overgangen"
},
"generic_guideline2": {
"message": "Speelt af alsof niets overgeslagen werd"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Betaalde promotie, betaalde aanbevelingen en directe reclame. Niet voor zelfpromotie of gratis uitroepen naar zaken/makers/websites/producten waar ze van houden."
},
"category_sponsor_guideline1": {
"message": "Betaalde promoties"
},
"category_sponsor_guideline2": {
"message": "Niet voor donaties of aangepaste koopwaar"
},
"category_selfpromo": {
"message": "Onbetaalde promotie of zelfpromotie"
},
"category_selfpromo_description": {
"message": "Vergelijkbaar met \"sponsor\", behalve voor onbetaalde of zelfpromotie. Dit is inclusief secties over koopwaar, donaties of informatie over met wie ze hebben samengewerkt."
},
"category_selfpromo_guideline1": {
"message": "Donaties, lidmaatschappen en aangepaste koopwaar"
},
"category_selfpromo_guideline2": {
"message": "Gratis uitroepen die niet aan de video toevoegen"
},
"category_selfpromo_guideline3": {
"message": "Niet voor bedrijfsontworpen producten en koopwaar"
},
"category_exclusive_access": {
"message": "Exclusieve toegang"
},
@@ -564,12 +588,24 @@
"message": "Deze video toont een product, dienst of locatie waartoe men gratis of gesubsidieerd toegang heeft gekregen",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Volledige video laat iets zien met gratis of gesubsidieerde toegang"
},
"category_interaction": {
"message": "Interactieherinnering (abonneren)"
},
"category_interaction_description": {
"message": "Als er een korte herinnering is om ze leuk te vinden, u te abonneren of ze te volgen in het midden van de inhoud. Als het lang is of over iets specifieks gaat, moet het in plaats daarvan onder zelfpromotie vallen."
},
"category_interaction_guideline1": {
"message": "Korte herinneringen om leuk te vinden, te abonneren of te volgen"
},
"category_interaction_guideline2": {
"message": "Bevat indirecte herinneringen voor commentaar"
},
"category_interaction_guideline3": {
"message": "Niet voor algemene promotie, roept alleen op tot actie"
},
"category_interaction_short": {
"message": "Interactieherinnering"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Onderbreking"
},
"category_intro_guideline1": {
"message": "Interval zonder werkelijke inhoud"
},
"category_intro_guideline2": {
"message": "Niet voor overgangen met informatie"
},
"category_outro": {
"message": "Eindkaarten/aftiteling"
},
"category_outro_description": {
"message": "Aftiteling of wanneer de YouTube-eindkaarten verschijnen. Niet voor conclusies met informatie."
},
"category_outro_guideline1": {
"message": "Inhoud niet toevoegen, zelfs niet als eindkaarten op het scherm staan"
},
"category_preview": {
"message": "Voorbeeld/samenvatting"
},
"category_preview_description": {
"message": "Snelle samenvatting van vorige afleveringen of een voorbeeld van wat er later komt in de huidige video. Bedoeld voor samengevoegde clips, niet voor gesproken samenvattingen."
},
"category_preview_guideline1": {
"message": "Clips die later of in een toekomstige video verschijnen"
},
"category_preview_guideline2": {
"message": "Samenvatting van een vorige video"
},
"category_preview_guideline3": {
"message": "Niet voor secties die extra inhoud toevoegen"
},
"category_filler": {
"message": "Opvulling zijspoor/humor"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Opvulling"
},
"category_filler_guideline1": {
"message": "Zijspoor-scènes alleen voor opvulling of humor"
},
"category_filler_guideline2": {
"message": "Afleidingen, bloopers, herhalingen"
},
"category_filler_guideline3": {
"message": "Niet voor scènes vereist om het onderwerp te begrijpen"
},
"category_music_offtopic": {
"message": "Muziek: sectie niet-muziek"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Niet-muziek"
},
"category_music_offtopic_guideline1": {
"message": "Secties niet in officiële releases"
},
"category_music_offtopic_guideline2": {
"message": "Niet-muziek in een live optreden"
},
"category_poi_highlight": {
"message": "Hoogtepunt"
},
"category_poi_highlight_description": {
"message": "Het deel van de video waar de meeste mensen naar op zoek zijn. Gelijkaardig aan \"video begint bij x\"-opmerkingen."
},
"category_poi_highlight_guideline1": {
"message": "Sectie die de meeste mensen zoeken"
},
"category_poi_highlight_guideline2": {
"message": "Kan context overslaan"
},
"category_poi_highlight_guideline3": {
"message": "Kan naar titel of pictogram overslaan"
},
"category_livestream_messages": {
"message": "Livestream: donaties/lezen van berichten"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Meer informatie"
},
"FullDetails": {
"message": "Volledige details"
},
"CopyDownvoteButtonInfo": {
"message": "Doet een tegenstem en maakt een lokale kopie aan die u opnieuw kunt indienen"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Pagina met opties openen"
},
"resetToDefault": {
"message": "Instellingen terugzetten op standaard"
},
"confirmResetToDefault": {
"message": "Weet u zeker dat u alle instellingen wilt terugzetten naar hun standaardwaarden? Dit kan niet ongedaan worden gemaakt."
}
}

View File

@@ -935,5 +935,11 @@
},
"betaServerWarning": {
"message": "Serwer BETA jest włączony!"
},
"resetToDefault": {
"message": "Resetuj do ustawień domyślnych"
},
"confirmResetToDefault": {
"message": "Czy na pewno chcesz przywrócić wszystkie ustawienia do ich domyślnych wartości? Tego nie można cofnąć."
}
}

View File

@@ -947,5 +947,11 @@
},
"openOptionsPage": {
"message": "Abrir página de opções"
},
"resetToDefault": {
"message": "Redefinir configurações para o padrão"
},
"confirmResetToDefault": {
"message": "Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita."
}
}

View File

@@ -17,7 +17,7 @@
"message": "Isso já foi enviado antes"
},
"channelWhitelisted": {
"message": "Canal adicionado à whitelist!"
"message": "Canal adicionado à lista de autorizados!"
},
"Segment": {
"message": "segmento"
@@ -159,10 +159,13 @@
"message": "Nome de Utilizador"
},
"setUsername": {
"message": "Criar nomde de utilizador"
"message": "Criar nome de utilizador"
},
"copyPublicID": {
"message": "Copiar UserID Publico"
"message": "Copiar ID blico de utilizador"
},
"copySegmentID": {
"message": "Copiar ID do segmento"
},
"discordAdvert": {
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
@@ -224,15 +227,280 @@
"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."
},
"enableRefetchWhenNotFound": {
"message": "Recuperar segmentos em novos vídeos"
},
"whatRefetchWhenNotFound": {
"message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos a monitorizar enquanto assiste."
},
"showNotice": {
"message": "Mostrar notificação outra vez"
},
"showSkipNotice": {
"message": "Mostrar aviso após um segmento ser ignorado"
},
"noticeVisibilityMode0": {
"message": "Avisos de ignorar em tamanho inteiro"
},
"noticeVisibilityMode1": {
"message": "Avisos pequenos quando ignorado automaticamente"
},
"noticeVisibilityMode2": {
"message": "Todos os avisos de ignorar em tamanho pequeno"
},
"website": {
"message": "Site",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "Código fonte",
"message": "Código-fonte",
"description": "Used on Firefox Store Page"
},
"errorCode": {
"message": "Código de erro: "
},
"skip": {
"message": "Saltar"
},
"mute": {
"message": "Silenciar"
},
"full": {
"message": "Vídeo completo",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "Saltar {0}?"
},
"mute_category": {
"message": "Silenciar {0}?"
},
"skip_to_category": {
"message": "Avançar para {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} ignorado",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} silenciado",
"description": "Example: Sponsor Muted"
},
"minLower": {
"message": "minuto"
},
"minsLower": {
"message": "minutos"
},
"hourLower": {
"message": "hora"
},
"hoursLower": {
"message": "horas"
},
"youHaveSavedTime": {
"message": "Poupou pessoas de",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " das suas vidas",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"setUserID": {
"message": "Definir ID de utilizador"
},
"userIDChangeWarning": {
"message": "Atenção: A alteração do ID de utilizador é permanente. Tem certeza que a deseja? Certifique-se de fazer uma cópia de segurança do seu ID antigo por precaução."
},
"areYouSureReset": {
"message": "Tem certeza que deseja redefinir?"
},
"mobileUpdateInfo": {
"message": "m.youtube.com é agora suportado"
},
"exportOptions": {
"message": "Importar/Exportar todas as opções"
},
"exportOptionsCopy": {
"message": "Editar/copiar"
},
"exportOptionsDownload": {
"message": "Guardar num ficheiro"
},
"exportOptionsUpload": {
"message": "Carregar a partir de ficheiro"
},
"setOptions": {
"message": "Definir opções"
},
"submit": {
"message": "Enviar"
},
"cancel": {
"message": "Cancelar"
},
"delete": {
"message": "Eliminar"
},
"preview": {
"message": "Pré-visualizar"
},
"inspect": {
"message": "Inspecionar"
},
"edit": {
"message": "Editar"
},
"copyDebugInformation": {
"message": "Copiar informações de depuração para a área de transferência"
},
"copyDebugInformationFailed": {
"message": "Falha ao copiar para a área de transferência"
},
"to": {
"message": "até",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline2": {
"message": "Reproduz como se nada tivesse sido ignorado"
},
"category_sponsor": {
"message": "Patrocinador"
},
"category_exclusive_access": {
"message": "Acesso exclusivo"
},
"category_interaction_short": {
"message": "Lembrete de interação"
},
"category_livestream_messages_short": {
"message": "Leitura de mensagens"
},
"autoSkip": {
"message": "Saltar automaticamente"
},
"manualSkip": {
"message": "Saltar manualmente"
},
"disable": {
"message": "Desativar"
},
"category": {
"message": "Categoria"
},
"bracketNow": {
"message": "(agora)"
},
"moreCategories": {
"message": "Mais categorias"
},
"chooseACategory": {
"message": "Escolher uma categoria"
},
"bracketEnd": {
"message": "(fim)"
},
"manuallyHidden": {
"message": "ocultado manualmente"
},
"incorrectCategory": {
"message": "Alterar categoria"
},
"guidelines": {
"message": "Orientações"
},
"readTheGuidelines": {
"message": "Leia as nossas orientações!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"darkModeOptionsPage": {
"message": "Modo escuro na página de opções"
},
"helpPageThanksForInstalling": {
"message": "Obrigado por instalar o SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Por favor, reveja as opções abaixo"
},
"helpPageHowSkippingWorks": {
"message": "Como a função saltar funciona"
},
"Submitting": {
"message": "A enviar"
},
"Editing": {
"message": "A editar"
},
"helpPageTooSlow": {
"message": "Está demasiado lento"
},
"Credits": {
"message": "Créditos"
},
"LearnMore": {
"message": "Saber mais"
},
"FullDetails": {
"message": "Todos os detalhes"
},
"CopyAndDownvote": {
"message": "Copiar e dar voto negativo"
},
"ContinueVoting": {
"message": "Continuar a votar"
},
"downvote": {
"message": "Voto negativo"
},
"upvote": {
"message": "Voto positivo"
},
"hideSegment": {
"message": "Ocultar segmento"
},
"dayAbbreviation": {
"message": "d",
"description": "100d"
},
"hourAbbreviation": {
"message": "h",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Comportamento",
"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": "Interface",
"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": "Atalhos de teclado",
"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": "Cópia de seg./restauro",
"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": "Diversos",
"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)."
},
"unbind": {
"message": "Desvincular",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Não definido"
},
"change": {
"message": "Alterar"
},
"betaServerWarning": {
"message": "O servidor BETA está ativado!"
},
"openOptionsPage": {
"message": "Abrir página de opções"
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Показывать уведомление после пропуска сегмента"
},
"showCategoryGuidelines": {
"message": "Показать справку для категории"
},
"noticeVisibilityMode0": {
"message": "Полноразмерные уведомления о пропусках"
},
@@ -542,18 +545,39 @@
"message": "до",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Содержит плавный переход от одной темы к другой"
},
"generic_guideline2": {
"message": "Пропуск должен произойти незаметно"
},
"category_sponsor": {
"message": "Спонсор"
},
"category_sponsor_description": {
"message": "Рекламные интеграции, реферальные ссылки и реклама напрямую. Не для саморекламы или рекомендаций разных событий/создателей/сайтов/продуктов, которые нравятся автору видео."
},
"category_sponsor_guideline1": {
"message": "Реклама"
},
"category_sponsor_guideline2": {
"message": "Не для доната или мерчендайза"
},
"category_selfpromo": {
"message": "Самореклама/рекомендация"
},
"category_selfpromo_description": {
"message": "Похоже на \"Спонсора\", но для бесплатной рекламы и саморекламы. Включает себя вставки про мерчендайз, пожертвования или информацию о тех, вместе с кем было сделано видео."
},
"category_selfpromo_guideline1": {
"message": "Донаты, платное членство и мерчендайз"
},
"category_selfpromo_guideline2": {
"message": "Рекомендации, не добавляющие контекста видео"
},
"category_selfpromo_guideline3": {
"message": "Не для корпоративной продукции"
},
"category_exclusive_access": {
"message": "Эксклюзивный доступ"
},
@@ -564,12 +588,24 @@
"message": "Это видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Всё видео - демонстрация чего-либо, к чему авторам был дан эксклюзивный доступ"
},
"category_interaction": {
"message": "Напоминание о взаимодействии (подписка)"
},
"category_interaction_description": {
"message": "Когда есть краткое напоминание поставить лайк, подписаться на канал или в соцсетях в середине содержимого. Если эта вставка длительная или о чём-то конкретном, она должна классифицироваться как самореклама."
},
"category_interaction_guideline1": {
"message": "Краткие напоминания поставить лайк, подписаться или нажать на колокольчик"
},
"category_interaction_guideline2": {
"message": "Включает косвенные предложения оставить комментарий"
},
"category_interaction_guideline3": {
"message": "Не для рекламы, только призывы к действию"
},
"category_interaction_short": {
"message": "Напоминание о взаимодействии"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Заставка"
},
"category_intro_guideline1": {
"message": "Сегмент без контента"
},
"category_intro_guideline2": {
"message": "Не для переходных сегментов с информацией"
},
"category_outro": {
"message": "Конечная заставка/титры"
},
"category_outro_description": {
"message": "Титры или время появления конечных заставок YouTube. Не для подведения итогов сказанного в видео."
},
"category_outro_guideline1": {
"message": "Не для сегментов с контентом, даже если на видео показываются конечные заставки"
},
"category_preview": {
"message": "Предпросмотр/краткое содержание"
},
"category_preview_description": {
"message": "Краткое содержание предыдущих эпизодов или предварительный просмотр того, что будет в данном видео. Предназначено для сегментов, смонтированных из кусков видео, а не для устных пересказов."
},
"category_preview_guideline1": {
"message": "Фрагменты, которые появляются позже или в будущем видео"
},
"category_preview_guideline2": {
"message": "Пересказ предыдущего видео"
},
"category_preview_guideline3": {
"message": "Не для сегментов с дополнительным контентом"
},
"category_filler": {
"message": "Заполнение отвлечёнными темами/шутками"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Заполнитель"
},
"category_filler_guideline1": {
"message": "Сцены с отвлечёнными темами или шутками"
},
"category_filler_guideline2": {
"message": "Разговоры не по теме, неудачные дубли, повторы"
},
"category_filler_guideline3": {
"message": "Не для сегментов, необходимых для понимания темы"
},
"category_music_offtopic": {
"message": "Музыка: Сегмент без музыки"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Без музыки"
},
"category_music_offtopic_guideline1": {
"message": "Сегменты, не включённые в официальные релизы"
},
"category_music_offtopic_guideline2": {
"message": "Сегменты без музыки во время живого выступления"
},
"category_poi_highlight": {
"message": "Важное"
},
"category_poi_highlight_description": {
"message": "Часть видео, которую ищет большинство людей. По сути заменяет комментарии типа \"Видео начинается с x:xx\"."
},
"category_poi_highlight_guideline1": {
"message": "Момент, который будет интересен большинству людей"
},
"category_poi_highlight_guideline2": {
"message": "Может помочь пропустить контекст"
},
"category_poi_highlight_guideline3": {
"message": "Может пропустить до объекта заголовка или превью"
},
"category_livestream_messages": {
"message": "Прямые трансляции: пожертвование/чтение сообщения"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Узнать больше"
},
"FullDetails": {
"message": "Полная информация"
},
"CopyDownvoteButtonInfo": {
"message": "Голосует против и создаёт локальную копию сегмента для повторной отправки"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Открыть страницу настроек"
},
"resetToDefault": {
"message": "Восстановить настройки по умолчанию"
},
"confirmResetToDefault": {
"message": "Вы уверены, что вы хотите восстановить настройки по умолчанию? Это действие не может быть отменено."
}
}

View File

@@ -230,6 +230,9 @@
"showSkipNotice": {
"message": "Zobraziť upozornenie pri preskočení segmentu"
},
"showCategoryGuidelines": {
"message": "Zobraziť pomocníka ku kategórii"
},
"noticeVisibilityMode0": {
"message": "Veľké upozornenia o preskočení"
},
@@ -506,18 +509,39 @@
"message": "do",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Zahŕňa plynulé prechody"
},
"generic_guideline2": {
"message": "Prehrať tak, ako keby nebolo nič preskočené"
},
"category_sponsor": {
"message": "Sponzor"
},
"category_sponsor_description": {
"message": "Platená propagácia, platené odporúčania a priame reklamy. Neplatí pre vlastnú propagáciu alebo neplatenú propagáciu dobročinností/tvorcov/webových stránok/produktov, ktoré sa im páčia."
},
"category_sponsor_guideline1": {
"message": "Platené promo"
},
"category_sponsor_guideline2": {
"message": "Nie pre dary a vlastný merch"
},
"category_selfpromo": {
"message": "Neplatená/Vlastná propagácia"
},
"category_selfpromo_description": {
"message": "Podobné ako sponzor, okrem neplatenej alebo vlastnej propagácie. Patria sem sekcie týkajúce sa merchu, donatov alebo informácií o tom, s kým spolupracovali."
},
"category_selfpromo_guideline1": {
"message": "Dary, členstvo a vlastný merch"
},
"category_selfpromo_guideline2": {
"message": "Obsah mimo témy, ktorý nepridáva žiadne informácie"
},
"category_selfpromo_guideline3": {
"message": "Nie pre firemne navrhnuté produkty a merch"
},
"category_exclusive_access": {
"message": "Exkluzívny Prístup"
},
@@ -528,12 +552,24 @@
"message": "Toto video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Celé video predstavuje niečo, kde sa dá získať voľný alebo zľavnený prístup"
},
"category_interaction": {
"message": "Pripomienka interakcie (Prihlásiť sa na odber)"
},
"category_interaction_description": {
"message": "Krátka výzva dať like, prihlásiť sa na odber alebo sledovať ich v strede obsahu. Ak je to dlhé alebo sa týka niečoho konkrétneho, malo by to radšej byť v ramci vlastnej propagácie."
},
"category_interaction_guideline1": {
"message": "Krátke pripomienky na \"Páči sa mi to\", Odber a Sledovanie"
},
"category_interaction_guideline2": {
"message": "Zahŕňa nepriame pripomienky na komentovanie"
},
"category_interaction_guideline3": {
"message": "Nie pre všeobecné promo, iba výzvy k akcii"
},
"category_interaction_short": {
"message": "Pripomienka interakcie"
},
@@ -546,24 +582,51 @@
"category_intro_short": {
"message": "Prerušenie"
},
"category_intro_guideline1": {
"message": "Interval bez samotného obsahu"
},
"category_intro_guideline2": {
"message": "Nie pre prechody bez informácie"
},
"category_outro": {
"message": "Koncové karty / titulky"
},
"category_outro_description": {
"message": "Kredity alebo keď sa zobrazia YouTube koncové karty. Neplatí pre zhrnutia s informáciami."
},
"category_outro_guideline1": {
"message": "Nezahrňte obsah, aj keby už boli vidieť koncové karty"
},
"category_preview": {
"message": "Ukážka/Rekapitulácia"
},
"category_preview_description": {
"message": "Rýchla rekapitulácia predošlej epizódy alebo ukážka toho, čo bude nasledovať neskôr v aktuálnom videu. Myslené pre zostrihané videá, nie pre hovorený súhrn."
},
"category_preview_guideline1": {
"message": "Ukážky, ktoré sa zobrazia neskôr alebo v budúcom videu"
},
"category_preview_guideline2": {
"message": "Zhrnutie predošlého videa"
},
"category_preview_guideline3": {
"message": "Nie pre sekcie, ktoré majú dodatočný obsah"
},
"category_filler_description": {
"message": "Odbočky mimo tému pridané len pre zábavu, nepotrebné pre pochopenie hlavného obsahu videa. Nemalo by zahŕňať segmenty, ktoré vysvetľujú kontext alebo vedľajšie detaily."
},
"category_filler_short": {
"message": "Odbočka"
},
"category_filler_guideline1": {
"message": "Nepodstatné scény slúžiace len ako výplň alebo humor"
},
"category_filler_guideline2": {
"message": "Nepodarené a opakované zábery"
},
"category_filler_guideline3": {
"message": "Nie pre scény vyžadované pre pochopenie témy"
},
"category_music_offtopic": {
"message": "Hudba: časť bez hudby"
},
@@ -573,12 +636,27 @@
"category_music_offtopic_short": {
"message": "Bez hudby"
},
"category_music_offtopic_guideline1": {
"message": "Sekcie, ktoré nie sú v oficiálnom vydaní"
},
"category_music_offtopic_guideline2": {
"message": "Sekcia bez hudby v živom vystúpení"
},
"category_poi_highlight": {
"message": "Hlavný obsah videa"
},
"category_poi_highlight_description": {
"message": "Tá časť videa, ktorú ľudia vyhľadávajú. Podobné komentárom \"Video začína v čase x\"."
},
"category_poi_highlight_guideline1": {
"message": "Sekcia, ktorú vyhľadáva väčšina ľudí"
},
"category_poi_highlight_guideline2": {
"message": "Môže pomôcť preskočiť predošlý obsah"
},
"category_poi_highlight_guideline3": {
"message": "Môže preskočiť na hlavný obsah alebo náhľad"
},
"category_livestream_messages": {
"message": "Živé vysielanie: oznamy a dary"
},
@@ -819,6 +897,9 @@
"LearnMore": {
"message": "Zistiť viac"
},
"FullDetails": {
"message": "Úplné podrobnosti"
},
"CopyDownvoteButtonInfo": {
"message": "Dá palec dole a vytvorí kópiu, aby ste mohli segment znova odoslať"
},

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "Visa ett meddelande efter att ett segment har hoppats över"
},
"showCategoryGuidelines": {
"message": "Visa kategorihjälp"
},
"noticeVisibilityMode0": {
"message": "Hoppa över-meddelanden i fullstorlek"
},
@@ -542,18 +545,39 @@
"message": "till",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Inkludera segmentövergångar"
},
"generic_guideline2": {
"message": "Spelar som om ingenting hoppades över"
},
"category_sponsor": {
"message": "Sponsormeddelande"
},
"category_sponsor_description": {
"message": "Betald marknadsföring, betalda hänvisningar och direktannonser, men inte till självbefodran eller gratis shoutouts till skapare/webbplatser/produkter de gillar."
},
"category_sponsor_guideline1": {
"message": "Betalda kampanjer"
},
"category_sponsor_guideline2": {
"message": "Inte för donationer eller anpassade varor"
},
"category_selfpromo": {
"message": "Obetald/självbefodran"
},
"category_selfpromo_description": {
"message": "Som \"sponsormeddelande\" men med undantag för obetald eller självkampanj. Detta inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med."
},
"category_selfpromo_guideline1": {
"message": "Donationer, medlemskap och anpassade varor"
},
"category_selfpromo_guideline2": {
"message": "Gratis shoutouts som inte läggs till i videon"
},
"category_selfpromo_guideline3": {
"message": "Inte för företagsdesignade produkter och varor"
},
"category_exclusive_access": {
"message": "Exklusiv tillgång"
},
@@ -564,12 +588,24 @@
"message": "Denna video visar en produkt, tjänst eller plats som de har fått gratis eller subventionerad tillgång till",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Hela videon visar något med gratis eller subventionerad tillgång"
},
"category_interaction": {
"message": "Interaktionspåminnelse (Prenumerera)"
},
"category_interaction_description": {
"message": "När där är en kort påminnelse att gilla, prenumerera eller följa dem. Om det är långt eller om det gäller något specifikt bör det istället vara under självbefodran."
},
"category_interaction_guideline1": {
"message": "Korta påminnelser om att gilla, prenumerera eller följa"
},
"category_interaction_guideline2": {
"message": "Inkluderar indirekta påminnelser att kommentera"
},
"category_interaction_guideline3": {
"message": "Inte för allmän marknadsföring, endast för uppmaningar"
},
"category_interaction_short": {
"message": "Interaktionspåminnelse"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "Uppehåll"
},
"category_intro_guideline1": {
"message": "Intervall utan egentligt innehåll"
},
"category_intro_guideline2": {
"message": "Inte för övergångar med information"
},
"category_outro": {
"message": "Slutkort/Credits"
},
"category_outro_description": {
"message": "Credits eller när YouTube-slutkort visas. Inte för slut med information."
},
"category_outro_guideline1": {
"message": "Inkludera inte innehåll, även om slutkort visas på skärmen"
},
"category_preview": {
"message": "Förhandsgranska/sammanfatta"
},
"category_preview_description": {
"message": "Snabb sammanfattning av tidigare avsnitt eller en förhandsvisning av vad som kommer upp senare i den aktuella videon. Avsett för redigerade klipp, inte för sammanfattningar."
},
"category_preview_guideline1": {
"message": "Klipp som visas senare, eller i en framtida video"
},
"category_preview_guideline2": {
"message": "Sammanfattning av en tidigare video"
},
"category_preview_guideline3": {
"message": "Inte för sektioner som lägger till ytterligare innehåll"
},
"category_filler": {
"message": "Ämnesavvikelse/Skämt"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "Utfyllnad"
},
"category_filler_guideline1": {
"message": "Tangentiella scener endast för utfyllnad eller humor"
},
"category_filler_guideline2": {
"message": "Distraktioner, bloopers, repriser"
},
"category_filler_guideline3": {
"message": "Inte för scener som krävs för att förstå ämnet"
},
"category_music_offtopic": {
"message": "Musik: Icke-musikavsnitt"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Icke-musik"
},
"category_music_offtopic_guideline1": {
"message": "Avsnitt som inte finns i officiella utgåvor"
},
"category_music_offtopic_guideline2": {
"message": "Icke-musik i ett liveframträdande"
},
"category_poi_highlight": {
"message": "Höjdpunkt"
},
"category_poi_highlight_description": {
"message": "Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"."
},
"category_poi_highlight_guideline1": {
"message": "Avsnitt som de flesta personer letar efter"
},
"category_poi_highlight_guideline2": {
"message": "Kan hoppa över sammanhang"
},
"category_poi_highlight_guideline3": {
"message": "Kan hoppa över till titeln eller miniatyrbilden"
},
"category_livestream_messages": {
"message": "Liveström: Donations-/meddelandeavläsningar"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "Läs mer"
},
"FullDetails": {
"message": "Fullständiga detaljer"
},
"CopyDownvoteButtonInfo": {
"message": "Rösta ner och skapar en lokal kopia för dig att skicka in igen"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "Öppna alternativsidan"
},
"resetToDefault": {
"message": "Återställ inställningar till standard"
},
"confirmResetToDefault": {
"message": "Är du säker på att du vill återställa alla inställningar till deras standardvärden? Detta kan inte ångras."
}
}

View File

@@ -17,7 +17,7 @@
"message": "Bu daha önce zaten gönderilmiş"
},
"channelWhitelisted": {
"message": "Kanal beyazlistede!"
"message": "Kanala izin verildi!"
},
"Segment": {
"message": "kısım"
@@ -164,6 +164,9 @@
"copyPublicID": {
"message": "Herkese Açık Kullanıcı Kimliğini Kopyala"
},
"copySegmentID": {
"message": "Segment Kimliğini Kopyala"
},
"discordAdvert": {
"message": "Öneri ve geri bildirimleriniz için resmi Discord serverımıza katılın!"
},
@@ -236,6 +239,9 @@
"showSkipNotice": {
"message": "Bir Kısmı Atladıktan Sonra Uyarı Göster"
},
"showCategoryGuidelines": {
"message": "Kategori Yardımını Göster"
},
"noticeVisibilityMode0": {
"message": "Tam Boyutlu Atlama Bildirimleri"
},
@@ -539,18 +545,39 @@
"message": "'e",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "Segue geçişlerini dahil et"
},
"generic_guideline2": {
"message": "Hiçbir şey atlanmamış gibi oynuyor"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendini pazarlayan veya beğendiği içerik üreticilerine/sitelere/ürünlere atıfta bulunanlar için değil."
},
"category_sponsor_guideline1": {
"message": "Ücretli promosyonlar"
},
"category_sponsor_guideline2": {
"message": "Bağışlar veya özel ürünler için değil"
},
"category_selfpromo": {
"message": "Karşılıksız/Kendi Reklamı"
},
"category_selfpromo_description": {
"message": "\"Sponsor\" seçeneğinden farkı para karşılığı olmaması veya kendi reklamını yapmasıdır. Buna kendi markalı ürünlerini satmak, bağış toplamak ve videoda işbirliği yaptığı kimselerden bahsetmek dahildir."
},
"category_selfpromo_guideline1": {
"message": "Bağışlar, üyelikler ve özel ürünler"
},
"category_selfpromo_guideline2": {
"message": "Videoya eklenmeyen ücretsiz konuşmalar"
},
"category_selfpromo_guideline3": {
"message": "Kurumsal tasarım ürünleri ve malları için değil"
},
"category_exclusive_access": {
"message": "Özel Erişim"
},
@@ -561,12 +588,24 @@
"message": "Bu video; yayıncıya özel ücretle veya ücretsiz sunulan bir ürünün, hizmetin veya bir yerin reklamını yapıyor",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Tüm video, ücretsiz veya sübvansiyonlu erişime sahip bir şeyi sergiliyor"
},
"category_interaction": {
"message": "Etkileşim Hatırlatıcısı (Abonelik)"
},
"category_interaction_description": {
"message": "Videonun ortasında beğenmek, abone olmak veya takip etmek için kısa bir hatırlatma olan kısımdır. Eğer süresi uzunsa veya belirli bir şey hakkındaysa, kendi reklamını yapan kategorisi seçilmelidir."
},
"category_interaction_guideline1": {
"message": "Beğenmek, abone olmak veya takip etmek için kısa hatırlatıcılar"
},
"category_interaction_guideline2": {
"message": "Yorum yapmak için dolaylı hatırlatıcılar içerir"
},
"category_interaction_guideline3": {
"message": "Genel tanıtım için değil, yalnızca harekete geçirici mesajlar"
},
"category_interaction_short": {
"message": "Etkileşim Hatırlatıcısı"
},
@@ -579,18 +618,36 @@
"category_intro_short": {
"message": "Aralık"
},
"category_intro_guideline1": {
"message": "Gerçek içerik olmayan aralık"
},
"category_intro_guideline2": {
"message": "Bilgi içeren geçişler için değil"
},
"category_outro": {
"message": "Bitiş Ekranı/Jenerik"
},
"category_outro_description": {
"message": "Videoda emeği geçenlerin veya video sonunda çıkan kartların gösterildiği kısımlar. Bilgilendirici sona sahip videolar için değil."
},
"category_outro_guideline1": {
"message": "Bitiş kartları ekranda olsa bile içerik eklemeyin"
},
"category_preview": {
"message": "Ön İzleme/Özet"
},
"category_preview_description": {
"message": "Önceki bölümlerin bir özeti veya geçerli videonun içeriğine yönelik bir ön izleme. Bu özellik birleştirilmiş klipler içindir, konuşarak anlatılan özetleri kapsamaz."
},
"category_preview_guideline1": {
"message": "Daha sonra veya gelecekteki bir videoda görünen klipler"
},
"category_preview_guideline2": {
"message": "Bir önceki videonun özeti"
},
"category_preview_guideline3": {
"message": "Ek içerik ekleyen bölümler için değil"
},
"category_filler": {
"message": "Konuyla Alakasız / Şaka"
},
@@ -600,6 +657,15 @@
"category_filler_short": {
"message": "Alakasız Konu"
},
"category_filler_guideline1": {
"message": "Yalnızca dolgu veya mizah için teğet sahneler"
},
"category_filler_guideline2": {
"message": "Dikkat dağıtıcı şeyler, hatalar, tekrarlar"
},
"category_filler_guideline3": {
"message": "Konuyu anlamak için gerekli sahneler için değil"
},
"category_music_offtopic": {
"message": "Müzik: Müzik Olmayan Bölüm"
},
@@ -609,12 +675,27 @@
"category_music_offtopic_short": {
"message": "Müzik Olmayan Bölüm"
},
"category_music_offtopic_guideline1": {
"message": "Resmi sürümlerde olmayan bölümler"
},
"category_music_offtopic_guideline2": {
"message": "Canlı performansta müzik dışı"
},
"category_poi_highlight": {
"message": "Vurgu"
},
"category_poi_highlight_description": {
"message": "Videoda, çoğu insanın aradığı kısım. \"Video x sürede başlıyor\" yorumlarına benzer."
},
"category_poi_highlight_guideline1": {
"message": "Çoğu kişinin aradığı bölüm"
},
"category_poi_highlight_guideline2": {
"message": "Bağlamı atlayabilir"
},
"category_poi_highlight_guideline3": {
"message": "Başlığa veya küçük resme atlayabilir"
},
"category_livestream_messages": {
"message": "Canlı Yayın: Bağış/Mesaj Okuma"
},
@@ -864,6 +945,9 @@
"LearnMore": {
"message": "Dahasını Öğren"
},
"FullDetails": {
"message": "Tüm Detaylar"
},
"CopyDownvoteButtonInfo": {
"message": "Olumsuz oy verir ve yeni bir kısım seçmeniz için bir kopya oluşturur"
},
@@ -879,6 +963,15 @@
"ChangeCategoryTooltip": {
"message": "Bu, kısımlarınız için anında geçerli olur"
},
"downvote": {
"message": "Eksi oy"
},
"upvote": {
"message": "Olumlu oy"
},
"hideSegment": {
"message": "Segmenti gizleyin"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Zaman aralığını hızlı bir şekilde ayarlamak için düzenleme kutusunun üzerinde fare tekerini kullanın. Değişikliklere ince ayar yapmak için ctrl veya shift tuşunun kombinasyonları kullanılabilir."
},
@@ -930,7 +1023,16 @@
"youtubeKeybindWarning": {
"message": "Bu kısayol YouTube tarafından kullanılıyor. Bunu kullanmak istediğinize emin misiniz?"
},
"betaServerWarning": {
"message": "BETA Sunucusu etkinleştirildi!"
},
"openOptionsPage": {
"message": "Seçenekler sayfasını aç"
},
"resetToDefault": {
"message": "Ayarları varsayılana sıfırla"
},
"confirmResetToDefault": {
"message": "Tüm ayarları varsayılan değerlerine sıfırlamak istediğinizden emin misiniz? Bu geri alınamaz."
}
}

View File

@@ -947,5 +947,11 @@
},
"openOptionsPage": {
"message": "Відкрити сторінку налаштувань"
},
"resetToDefault": {
"message": "Повернутись до стандартних налаштувань"
},
"confirmResetToDefault": {
"message": "Ви впевнені, що хочете скинути всі налаштування до значень за замовчуванням? Це не можна буде скасувати."
}
}

View File

@@ -239,6 +239,9 @@
"showSkipNotice": {
"message": "在跳過片段後顯示通知"
},
"showCategoryGuidelines": {
"message": "顯示分類說明"
},
"noticeVisibilityMode0": {
"message": "完整大小的略過提醒"
},
@@ -542,18 +545,39 @@
"message": "到",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline1": {
"message": "包含轉場"
},
"generic_guideline2": {
"message": "如同沒有略過任何片段般播放"
},
"category_sponsor": {
"message": "贊助廣告"
},
"category_sponsor_description": {
"message": "有收錢的工商廣告和直接廣告。不是為了自我推銷或為了其他創作的免費推銷"
},
"category_sponsor_guideline1": {
"message": "付費促銷"
},
"category_sponsor_guideline2": {
"message": "並非捐款或客製週邊商品"
},
"category_selfpromo": {
"message": "非付費/自我推廣"
},
"category_selfpromo_description": {
"message": "類似 “贊助商廣告” ,但是非付費或自我推廣。這包括有關商品、捐贈或與他人合作的信息。"
},
"category_selfpromo_guideline1": {
"message": "贊助、會員或客製週邊商品"
},
"category_selfpromo_guideline2": {
"message": "與影片無關之免費的推廣"
},
"category_selfpromo_guideline3": {
"message": "不是企業設計的商品和週邊商品"
},
"category_exclusive_access": {
"message": "獨家限定"
},
@@ -564,12 +588,24 @@
"message": "此影片展示了獲得特殊或免費存取的產品、服務或位置",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "整部影片在展示收到的免費或付費存取權"
},
"category_interaction": {
"message": "互動提醒 (訂閱)"
},
"category_interaction_description": {
"message": "當有短提醒來請觀眾按讚、訂閱或跟隨他們時。如果該片段很長或很針對某事,它應該歸類為自我推銷。"
},
"category_interaction_guideline1": {
"message": "要求點讚、訂閱或跟隨的短暫提醒"
},
"category_interaction_guideline2": {
"message": "包含要求評論的非直接提醒"
},
"category_interaction_guideline3": {
"message": "並非一般促銷、只限於要求進行某動作"
},
"category_interaction_short": {
"message": "互動提醒"
},
@@ -582,18 +618,36 @@
"category_intro_short": {
"message": "開場"
},
"category_intro_guideline1": {
"message": "無實際內容的片段"
},
"category_intro_guideline2": {
"message": "不是含有資訊的轉場"
},
"category_outro": {
"message": "結束畫面/鳴謝"
},
"category_outro_description": {
"message": "鳴謝或當 YouTube 結尾資訊卡出現時。不是含有資訊的總結"
},
"category_outro_guideline1": {
"message": "即使結尾的資訊卡已開始顯示也不應包含內容"
},
"category_preview": {
"message": "預覽/摘要"
},
"category_preview_description": {
"message": "係指影片的前情提要或內容預告等刻意編輯過的內容"
},
"category_preview_guideline1": {
"message": "出現在後面或未來影片的片段"
},
"category_preview_guideline2": {
"message": "上一部影片的回顧"
},
"category_preview_guideline3": {
"message": "不是有額外內容的部分"
},
"category_filler": {
"message": "離題閒聊/玩笑"
},
@@ -603,6 +657,15 @@
"category_filler_short": {
"message": "填充詞"
},
"category_filler_guideline1": {
"message": "為了幽默而離題的片段"
},
"category_filler_guideline2": {
"message": "分心、失誤、重播"
},
"category_filler_guideline3": {
"message": "不是需要觀看才能理解主題的片段"
},
"category_music_offtopic": {
"message": "音樂:非音樂部分"
},
@@ -612,12 +675,27 @@
"category_music_offtopic_short": {
"message": "非音樂"
},
"category_music_offtopic_guideline1": {
"message": "不在官方釋出內容的片段"
},
"category_music_offtopic_guideline2": {
"message": "在現場演出的非音樂片段"
},
"category_poi_highlight": {
"message": "重點"
},
"category_poi_highlight_description": {
"message": "大部分的人在影片尋找的部分。類似「影片在幾分幾秒開始」的留言"
},
"category_poi_highlight_guideline1": {
"message": "大部分觀眾想要看的部分"
},
"category_poi_highlight_guideline2": {
"message": "可以幫助略過前後文"
},
"category_poi_highlight_guideline3": {
"message": "可以跳過到標題或縮圖的內容"
},
"category_livestream_messages": {
"message": "直播:捐贈/訊息閱讀"
},
@@ -867,6 +945,9 @@
"LearnMore": {
"message": "了解更多"
},
"FullDetails": {
"message": "完整詳細資料"
},
"CopyDownvoteButtonInfo": {
"message": "按倒讚和建立本機副本以便你重新提交"
},
@@ -947,5 +1028,11 @@
},
"openOptionsPage": {
"message": "打開選項頁面"
},
"resetToDefault": {
"message": "重設設定為預設值"
},
"confirmResetToDefault": {
"message": "你確定要將所有設定重設為預設值嗎?此動作無法還原。"
}
}

View File

@@ -156,9 +156,6 @@
}
.sponsorSkipNoticeParent, .sponsorSkipNotice {
min-width: 350px;
max-width: 50%;
border-spacing: 5px 10px;
padding-left: 5px;
padding-right: 5px;
@@ -166,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;
@@ -177,7 +183,7 @@
}
.sponsorSkipNoticeLimitWidth {
min-width: calc(100% - 50px);
max-width: calc(100% - 50px);
}
.sponsorSkipNotice .hidden {
@@ -347,6 +353,22 @@
color: rgb(235, 235, 235);
}
.sb-guidelines-notice .sponsorTimesInfoMessage td {
padding-left: 5px;
padding-top: 2px;
padding-bottom: 2px;
font-size: 15px;
display: flex;
align-items: center;
}
.sponsorTimesInfoIcon {
width: 30px;
padding-right: 10px;
padding-left: 10px;
}
.segmentSummary {
outline: none !important;
}

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">

View File

@@ -1,40 +1,52 @@
:root {
--sb-main-font-family: "Source Sans Pro", sans-serif;
--sb-main-bg-color: #222626;
--sb-main-bg-color: #222;
--sb-main-fg-color: #fff;
--sb-grey-bg-color: #333;
--sb-grey-fg-color: #999;
--sb-red-bg-color: #cc1717;
}
/*
* Container when popup displayed in-page
* Generic utilities
*/
#sponsorBlockPopupContainer {
.grey-text {
color: var(--sb-grey-fg-color);
}
.white-text {
color: var(--sb-main-fg-color);
}
.sbHeader {
font-size: 20px;
font-weight: bold;
text-align: left;
margin: 0;
}
#sponsorBlockPopupBody .u-mZ {
margin: 0 !important;
position: relative;
margin-bottom: 16px;
}
#sponsorBlockPopupBody .hidden {
display: none !important;
}
/*
* Disable popup max height when displayed in-page
* <button> elements that have icons
*/
#sponsorBlockPopupContainer #sponsorBlockPopupHTML {
max-height: none;
}
/*
* Disable fixed popup width when displayed in-page
*/
#sponsorBlockPopupContainer #sponsorBlockPopupBody {
width: auto;
}
#setUsernameButton,
#copyUserID,
#submitUsername {
color: var(--sb-main-fg-color);
background: transparent;
width: fit-content;
padding: none;
border: none;
}
/*
* Main containers
*/
#sponsorBlockPopupHTML {
color-scheme: dark;
max-height: 600px;
@@ -45,8 +57,8 @@
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;
font-family: var(--sb-main-font-family);
background-color: var(--sb-main-bg-color);
color: var(--sb-main-fg-color);
color-scheme: dark;
@@ -64,15 +76,47 @@
/*
* Disable transition on all elements until the extension has loaded
*/
.sb-preload * {
transition: none !important;
}
/*
* Close popup button when displayed in-page
* 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;
}
/*
* Container when popup displayed in-page (content.ts)
*/
#sponsorBlockPopupContainer {
position: relative;
margin-bottom: 16px;
}
/*
* Disable popup max height when displayed in-page (content.ts)
*/
#sponsorBlockPopupContainer #sponsorBlockPopupHTML {
max-height: none;
}
/*
* Disable fixed popup width when displayed in-page (content.ts)
*/
#sponsorBlockPopupContainer #sponsorBlockPopupBody {
width: auto;
}
/*
* Close popup button when displayed in-page (top-right corner)
*/
.sbCloseButton {
background: transparent;
border: 0;
@@ -88,51 +132,34 @@
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;
font-weight: bold;
user-select: none;
padding: 20px 0 10px;
padding: 10px 0px 0px;
font-size: 32px;
}
.sbPopupLogo img {
margin-right: 8px;
margin: 8px;
}
/*
* Refresh segments button
*/
#refreshSegmentsButton {
background: transparent;
border: 0;
border-radius: 50%;
display: flex;
padding: 5px;
margin: 5px auto;
align-items: center;
background: transparent;
border-radius: 50%;
margin: 5px auto;
border: none;
padding: 5px;
}
#refreshSegmentsButton:hover {
background-color: var(--sb-grey-bg-color);
}
@@ -140,15 +167,14 @@
/*
* <details> wrapper around each segment
*/
.votingButtons {
font-family: Arial, Helvetica, sans-serif;
border-radius: 8px;
margin: 4px 16px;
}
.votingButtons[open] {
padding-bottom: 5px;
}
.votingButtons:hover {
background-color: var(--sb-grey-bg-color);
}
@@ -156,34 +182,46 @@
/*
* Individual segments summaries (clickable <summary>)
*/
.segmentSummary {
cursor: pointer;
font-weight: bold;
padding: 7px;
list-style: none;
display: flex;
align-items: center;
justify-content: space-between;
white-space: nowrap;
font-weight: bold;
list-style: none;
cursor: pointer;
padding: 4px 8px;
}
.segmentSummary > div {
text-align: left;
}
/*
* Category dot in segment
*/
.sponsorTimesCategoryColorCircle {
margin: 0 8px;
margin-right: 8px;
}
.dot {
width: 10px;
height: 10px;
border-radius: 50%;
display: inline-block;
}
/*
* Category name in segment
*/
.summaryLabel {
overflow-wrap: break-word;
white-space: normal;
}
.sbVoteButtonsContainer {
text-align: right;
}
/*
* Buttons that appear under a segment on click
*/
.voteButton {
height: 20px;
padding: 0 5px;
@@ -197,7 +235,6 @@
/*
* "Voted!" text that appears after voting on a segment
*/
.sponsorTimesThanksForVotingText {
font-size: large;
}
@@ -205,111 +242,44 @@
/*
* Main controls menu
*/
.sbControlsMenu {
margin: 16px;
margin-top: 6px;
border-radius: 8px;
background-color: var(--sb-grey-bg-color);
display: flex;
justify-content: space-evenly;
margin-top: 10px;
}
.sbControlsMenu-item {
background: transparent;
border: 0;
cursor: pointer;
user-select: none;
padding: 10px 15px;
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.sbControlsMenu-item {
display: flex;
align-items: center;
flex-direction: column;
justify-content: center;
background: transparent;
user-select: none;
cursor: pointer;
border: none;
flex: 1;
padding: 10px 15px;
trasition: background-color 0.2s ease-in-out;
}
.sbControlsMenu-item:hover {
background-color: #444;
}
.sbControlsMenu-itemIcon {
margin-bottom: 6px;
}
/*
* "Skipping is enabled" toggle
*/
.toggleSwitchContainer {
display: flex;
flex-direction: column;
align-items: center;
}
.toggleSwitchContainer-switch {
display: flex;
margin-bottom: 6px;
}
.switchBg {
display: block;
width: 50px;
height: 23px;
border-radius: 18.5px;
}
.switchBg.shadow {
box-shadow: 0.75px 0.75px 10px 0px rgba(50, 50, 50, 0.5);
opacity: 1;
}
.switchBg.white {
position: absolute;
background-color: #ccc;
opacity: 1;
}
.switchBg.green {
position: absolute;
background-color: #00a205;
opacity: 0;
transition: opacity 0.2s ease-out;
}
.switchDot {
background-color: var(--sb-main-fg-color);
border-radius: 50%;
width: 15px;
height: 15px;
margin: 4px;
position: absolute;
box-shadow: 0.75px 0.75px 3.8px 0px rgba(50, 50, 50, 0.45);
transition: transform 0.2s ease-out;
}
#toggleSwitch:checked ~ .switchDot {
transform: translateX(27px);
}
#toggleSwitch:checked ~ .switchBg.green {
opacity: 1;
}
#toggleSwitch:checked ~ .switchBg.white {
opacity: 0;
transition: opacity 0.2s step-end;
}
/*
* Whitelist add/remove icon
*/
.SBWhitelistIcon > path {
fill: var(--sb-main-fg-color);
}
.SBWhitelistIcon.rotated {
transform: rotate(45deg);
}
@keyframes rotate {
from {
transform: rotate(0deg);
@@ -319,231 +289,258 @@
}
}
/*
* "Skipping is enabled" toggle
*/
.toggleSwitchContainer {
display: flex;
align-items: center;
flex-direction: column;
}
.toggleSwitchContainer-switch {
display: flex;
margin-bottom: 6px;
}
.switchBg {
width: 50px;
height: 23px;
display: block;
border-radius: 18.5px;
}
.switchBg.shadow {
box-shadow: 0.75px 0.75px 10px 0px rgba(50, 50, 50, 0.5);
opacity: 1;
}
.switchBg.white {
opacity: 1;
position: absolute;
background-color: #ccc;
}
.switchBg.green {
opacity: 0;
position: absolute;
background-color: #00a205;
transition: opacity 0.2s ease-out;
}
.switchDot {
width: 15px;
margin: 4px;
height: 15px;
border-radius: 50%;
position: absolute;
transition: transform 0.2s ease-out;
background-color: var(--sb-main-fg-color);
box-shadow: 0.75px 0.75px 3.8px 0px rgba(50, 50, 50, 0.45);
}
#toggleSwitch:checked ~ .switchDot {
transform: translateX(27px);
}
#toggleSwitch:checked ~ .switchBg.green {
opacity: 1;
}
#toggleSwitch:checked ~ .switchBg.white {
transition: opacity 0.2s step-end;
opacity: 0;
}
/*
* 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;
display: block;
color: #664d03;
}
#whitelistForceCheck:hover {
background-color: #f2e4b7;
}
/*
* Container around the "Segment Starts Now" and "Submit Times" buttons
* Submit box
*/
#mainControls {
margin-bottom: 12px;
margin: 16px;
padding: 8px 12px;
text-align: left;
border-radius: 8px;
border: 2px solid var(--sb-grey-bg-color);
}
.sponsorStartHint {
display: block;
padding: 0 10px 12px;
text-align: left;
}
/*
* 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: none;
font-size: 16px;
padding: 8px 16px;
border-radius: 28px;
display: inline-block;
-moz-border-radius: 28px;
-webkit-border-radius: 28px;
color: var(--sb-main-fg-color);
font-size: 16px;
padding: 8px 37px;
font-family: var(--sb-main-font-family);
transition: 0.01s background-color;
font-family: var(--sb-main-font-family);
background-color: var(--sb-red-bg-color);
}
.sbMediumButton:hover,
.sbMediumButton:focus {
outline: none;
background-color: #ec1c1c;
outline: none;
}
.sbMediumButton:active {
position: relative;
top: 1px;
}
/*
* "Submit Times" button
*/
#submitTimes {
margin-top: 12px;
}
/*
* Heading utility class
* Your Work box
*/
.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;
margin: 16px;
margin-bottom: 8px;
border-radius: 8px;
border: 2px solid var(--sb-grey-bg-color);
}
.sbYourWorkCols > div {
display: flex;
align-items: center;
flex-basis: 50%;
justify-content: center;
border-top: 2px solid var(--sb-grey-bg-color);
border-bottom: 2px solid var(--sb-grey-bg-color);
}
/*
* <button> elements that have icons
*/
#setUsernameButton,
#copyUserID,
#submitUsername {
background: transparent;
border: 0;
padding: 0;
color: var(--sb-main-fg-color);
width: fit-content;
.sbStatsSentence {
padding-top: 5px;
padding-bottom: 5px;
}
/*
* Prevent username from wrapping
*/
#setUsernameButton {
flex: 0 1;
margin-right: 5px;
}
/*
* Set username button
*/
#submitUsername {
padding-left: 7px;
.sbStatsSentence .sbExtraInfo {
display: inline-block;
}
/*
* Increase font size of username input and display
*/
#usernameValue,
#usernameInput,
#sponsorTimesContributionsDisplay {
font-size: 16px;
flex: 1 0;
}
/*
* Left align "Username" and "Submissions" labels
/*
* Improve alignment of username and submissions
*/
#usernameElement > div > p,
#usernameElement,
#sponsorTimesContributionsContainer {
display: flex;
flex-direction: column;
justify-content: start;
}
#usernameElement > span,
#sponsorTimesContributionsContainer {
text-align: start;
}
/*
* Enable flexbox for buttons with SVG icon
*/
#setUsernameContainer > button {
display: flex;
#sponsorTimesContributionsContainer {
margin-left: 8px;
padding-left: 8px;
border-left: 2px solid var(--sb-grey-bg-color);
}
/*
* Improve position of "Copy User ID" button
* Username
*/
#usernameElement {
padding: 8px;
min-width: 50%;
}
#setUsernameContainer {
display: flex;
width: fit-content;
}
#setUsernameContainer > button {
display: flex;
}
#setUsernameButton {
margin-right: 5px;
flex: 0 1;
}
#submitUsername {
padding-left: 16px;
}
#copyUserID {
width: 100%;
flex: 0 1;
}
/*
* Container around username display and edit
*/
#setUsernameContainer {
display: flex;
}
/*
* Improve alignment of username and submissions
*/
#usernameElement > div,
#sponsorTimesContributionsContainer > div {
display: flex;
flex-flow: column nowrap;
align-items: flex-start;
}
/*
* Truncate username display
*/
#usernameValue {
overflow: hidden;
text-overflow: ellipsis;
max-width: 130px;
white-space: nowrap;
overflow: hidden;
margin: 0 8px 0 0;
max-width: 130px;
}
/*
* Set username form container with "expanded" state
*/
#setUsername {
display: flex;
}
#setUsername.SBExpanded {
width: 200%;
text-align: left;
}
/*
* 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);
border: none;
padding: 4px 8px;
border-radius: 4px;
width: calc(100% - 68px);
text-overflow: ellipsis;
color: var(--sb-main-fg-color);
background: var(--sb-grey-bg-color);
}
/*
* Submissions
*/
#sponsorTimesContributionsContainer {
padding: 8px;
}
/*
* Footer
*/
#sbFooter {
margin-top: 10px;
padding-bottom: 20px;
padding: 8px 0;
}
#sbFooter a {
transition: background 0.3s ease !important;
color: var(--sb-main-fg-color);
display: inline-block;
text-decoration: none;
border-radius: 4px;
background: #333;
cursor: pointer;
padding: 4px 8px;
font-weight: 500;
margin: 2px 1px;
}
#sbFooter a:hover {
background: #444;
}
#sbFooter a {
#sponsorTimesDonateContainer a {
color: var(--sb-main-fg-color);
text-decoration: none;
}
@@ -551,7 +548,6 @@
/*
* "Show Notice Again" button
*/
#showNoticeAgain {
background: transparent;
border: 1px solid #fff;
@@ -560,15 +556,3 @@
margin-bottom: 20px;
padding: 5px;
}
/*
* Generic utilities
*/
#sponsorBlockPopupBody .u-mZ {
margin: 0 !important;
}
#sponsorBlockPopupBody .hidden {
display: none !important;
}

View File

@@ -8,9 +8,13 @@
<link id="sponsorBlockStyleSheet" href="popup.css" rel="stylesheet">
</head>
<body id="sponsorBlockPopupBody">
<body id="sponsorBlockPopupBody" style="visibility: hidden">
<div id="sponsorblockPopup" class="sponsorBlockPageBody sb-preload">
<button id="sbCloseButton" title="__MSG_closePopup__" class="sbCloseButton hidden">
<img src="icons/close.png" width="15" height="15">
</button>
<div id="sbBetaServerWarning" class="hidden" title="__MSG_openOptionsPage__">
__MSG_betaServerWarning__
</div>
@@ -19,20 +23,22 @@
<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>
<p id="loadingIndicator" class="u-mZ grey-text">__MSG_noVideoID__</p>
<!-- If the video was found in the database -->
<p id="videoFound" class="u-mZ"></p>
<p id="videoFound" class="u-mZ grey-text"></p>
<button id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<img src="/icons/refresh.svg" alt="Refresh icon" id="refreshSegments" />
</button>
<!-- Video Segments -->
<div id="issueReporterContainer">
<div id="issueReporterTimeButtons"></div>
</div>
</div>
<!-- Toggle Box -->
<div class="sbControlsMenu">
<label id="whitelistButton" for="whitelistToggle" class="hidden sbControlsMenu-item">
<input type="checkbox" style="display:none;" id="whitelistToggle">
@@ -64,25 +70,31 @@
__MSG_forceChannelCheckPopup__
</a>
<!-- Submit box -->
<div id="mainControls" style="display: none">
<p class="sbHeader">
__MSG_recordTimesDescription__
</p>
<sub class="sponsorStartHint">__MSG_popupHint__</sub>
<div>
<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>
<button id="submitTimes" class="sbMediumButton">__MSG_submitTimesButton__</button>
<sub class="sponsorStartHint grey-text">__MSG_popupHint__</sub>
<div align="center" style="margin: 8px 0;">
<button id="sponsorStart" class="sbMediumButton" style="margin-right: 8px">__MSG_sponsorStart__</button>
<button id="submitTimes" class="sbMediumButton" style="display: none;">__MSG_submitTimesButton__</button>
</div>
<span id="submissionHint" style="display: none;">__MSG_submissionEditHint__</span>
</div>
<h1 class="recordingSubtitle sbHeader">__MSG_yourWork__</h1>
<!-- Your Work box -->
<div class="sbYourWorkCols">
<div id="usernameElement">
<div>
<p class="u-mZ">__MSG_Username__:</p>
<p class="sbHeader" style="padding: 8px 16px;">
__MSG_yourWork__
</p>
<div>
<!-- Username -->
<div id="usernameElement">
<span class="u-mZ grey-text">__MSG_Username__:
<!-- loading/errors -->
<span id="setUsernameStatus" class="u-mZ white-text" style="display: none"></span>
</span>
<div id="setUsernameContainer">
<p id="usernameValue"></p>
<button id="setUsernameButton" title="__MSG_setUsername__">
@@ -93,65 +105,69 @@
</button>
</div>
<div id="setUsername" style="display: none">
<div id="setUsernameStatusContainer" style="display: none">
<p id="setUsernameStatus" class="u-mZ"></p>
</div>
<input id="usernameInput" placeholder="Username">
<button id="submitUsername">
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
</button>
</div>
</div>
</div>
<div id="sponsorTimesContributionsContainer" class="hidden">
<div>
<p class="u-mZ">__MSG_Submissions__:</p>
<span id="sponsorTimesContributionsDisplay">
0
</span>
<!-- Submissions -->
<div id="sponsorTimesContributionsContainer" class="hidden">
<p class="u-mZ grey-text">__MSG_Submissions__:</p>
<span id="sponsorTimesContributionsDisplay">0</span>
</div>
</div>
<p id="sponsorTimesViewsContainer" style="display: none" class="u-mZ sbStatsSentence">
__MSG_savedPeopleFrom__
<b>
<span id="sponsorTimesViewsDisplay">0</span>
</b>
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
<br />
<span class="sbExtraInfo">
(
<b>
<span id="sponsorTimesOthersTimeSavedDisplay">0</span>
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span>
</b>
<span>__MSG_youHaveSavedTimeEnd__</span>
)
</span>
</p>
<p id="sponsorTimesSkipsDoneContainer" style="display: none" class="u-mZ sbStatsSentence">
__MSG_youHaveSkipped__
<b>
<span id="sponsorTimesSkipsDoneDisplay">0</span>
</b>
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
<span class="sbExtraInfo">
(
<b>
<span id="sponsorTimeSavedDisplay">0</span>
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span>
</b>
)
</span>
</p>
</div>
<p id="sponsorTimesViewsContainer" style="display: none" class="u-mZ">
__MSG_savedPeopleFrom__
<b><span id="sponsorTimesViewsDisplay">
0
</span></b>
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
<br>
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
<span>__MSG_youHaveSavedTimeEnd__</span>).
</p>
<p id="sponsorTimesSkipsDoneContainer" style="display: none" class="u-mZ">
__MSG_youHaveSkipped__
<b><span id="sponsorTimesSkipsDoneDisplay">
0
</span></b>
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
(<b><span id="sponsorTimeSavedDisplay">
0
</span>
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
</p>
<div id="sponsorTimesDonateContainer" style="display: none; align-items: center; justify-content: center;">
<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" alt="Close icon" height="8" style="padding-left: 5px; cursor: pointer;" />
</div>
<footer id="sbFooter">
<div id="sponsorTimesDonateContainer" style="display: none; align-items: center; justify-content: center;">
<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" 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> |
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> |
<a id="helpButton">__MSG_help__</a>
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a>
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a>
<br />
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
<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">__MSG_help__</a> |
<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 href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
</footer>

View File

@@ -23,14 +23,37 @@ if (utils.isFirefox()) {
});
}
chrome.tabs.onUpdated.addListener(function(tabId) {
chrome.tabs.sendMessage(tabId, {
function onTabUpdatedListener(tabId: number) {
chrome.tabs.sendMessage(tabId, {
message: 'update',
}, () => void chrome.runtime.lastError ); // Suppress error on Firefox
}, () => void chrome.runtime.lastError ); // Suppress error on Firefox
}
function onNavigationApiAvailableChange(changes: {[key: string]: chrome.storage.StorageChange}) {
if (changes.navigationApiAvailable) {
if (changes.navigationApiAvailable.newValue) {
chrome.tabs.onUpdated.removeListener(onTabUpdatedListener);
} else {
chrome.tabs.onUpdated.addListener(onTabUpdatedListener);
}
}
}
// If Navigation API is not supported, then background has to inform content script about video change.
// This happens on Safari, Firefox, and Chromium 101 (inclusive) and below.
chrome.tabs.onUpdated.addListener(onTabUpdatedListener);
utils.wait(() => Config.local !== null).then(() => {
if (Config.local.navigationApiAvailable) {
chrome.tabs.onUpdated.removeListener(onTabUpdatedListener);
}
});
chrome.runtime.onMessage.addListener(function (request, sender, callback) {
switch(request.message) {
if (!Config.configSyncListeners.includes(onNavigationApiAvailableChange)) {
Config.configSyncListeners.push(onNavigationApiAvailableChange);
}
chrome.runtime.onMessage.addListener(function (request, _, callback) {
switch(request.message) {
case "openConfig":
chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))});
return;
@@ -61,6 +84,21 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
case "unregisterContentScript":
unregisterFirefoxContentScript(request.id)
return false;
case "tabs": {
chrome.tabs.query({
active: true,
currentWindow: true
}, tabs => {
chrome.tabs.sendMessage(
tabs[0].id,
request.data,
(response) => {
callback(response);
}
);
});
return true;
}
}
});

View File

@@ -18,6 +18,7 @@ export interface CategorySkipOptionsState {
}
class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsProps, CategorySkipOptionsState> {
setBarColorTimeout: NodeJS.Timeout;
constructor(props: CategorySkipOptionsProps) {
super(props);
@@ -172,6 +173,8 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
}
setColorState(event: React.FormEvent<HTMLInputElement>, preview: boolean): void {
clearTimeout(this.setBarColorTimeout);
if (preview) {
this.setState({
previewColor: event.currentTarget.value
@@ -188,7 +191,9 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
}
// Make listener get called
Config.config.barTypes = Config.config.barTypes;
this.setBarColorTimeout = setTimeout(() => {
Config.config.barTypes = Config.config.barTypes;
}, 50);
}
}

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

@@ -617,11 +617,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
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();

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 {

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();
@@ -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,9 +160,10 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
}
cancel(): void {
this.guidelinesReminder?.close();
this.noticeRef.current.close(true);
this.contentContainer().resetSponsorSubmissionNotice();
this.contentContainer().resetSponsorSubmissionNotice(false);
this.props.closeListener();
}
@@ -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

@@ -55,6 +55,7 @@ interface SBConfig {
scrollToEditTimeUpdate: boolean,
categoryPillUpdate: boolean,
darkMode: boolean,
showCategoryGuidelines: boolean,
// Used to cache calculated text color info
categoryPillColors: {
@@ -101,9 +102,11 @@ export type VideoDownvotes = { segments: { uuid: HashedValue, hidden: SponsorHid
interface SBStorage {
/* VideoID prefixes to UUID prefixes */
downvotedSegments: Record<VideoID & HashedValue, VideoDownvotes>,
navigationApiAvailable: boolean,
}
export interface SBObject {
configLocalListeners: Array<(changes: StorageChangesObject) => unknown>;
configSyncListeners: Array<(changes: StorageChangesObject) => unknown>;
syncDefaults: SBConfig;
localDefaults: SBStorage;
@@ -120,6 +123,7 @@ const Config: SBObject = {
/**
* Callback function when an option is updated
*/
configLocalListeners: [],
configSyncListeners: [],
syncDefaults: {
userID: null,
@@ -167,6 +171,7 @@ const Config: SBObject = {
scrollToEditTimeUpdate: false, // false means the tooltip will be shown
categoryPillUpdate: false,
darkMode: true,
showCategoryGuidelines: true,
categoryPillColors: {},
@@ -283,7 +288,8 @@ const Config: SBObject = {
}
},
localDefaults: {
downvotedSegments: {}
downvotedSegments: {},
navigationApiAvailable: null
},
cachedSyncConfig: null,
cachedLocalStorage: null,
@@ -310,6 +316,10 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
for (const key in changes) {
Config.cachedLocalStorage[key] = changes[key].newValue;
}
for (const callback of Config.configLocalListeners) {
callback(changes);
}
}
});
@@ -370,8 +380,20 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
}
function forceSyncUpdate(prop: string): void {
const value = Config.cachedSyncConfig[prop];
if (prop === "unsubmittedSegments") {
// Early to be safe
if (JSON.stringify(value).length + prop.length > 8000) {
for (const key in value) {
if (!value[key] || value[key].length <= 0) {
delete value[key];
}
}
}
}
chrome.storage.sync.set({
[prop]: Config.cachedSyncConfig[prop]
[prop]: value
});
}

View File

@@ -5,8 +5,6 @@ import { ContentContainer, Keybind } from "./types";
import Utils from "./utils";
const utils = new Utils();
import runThePopup from "./popup";
import PreviewBar, {PreviewBarSegment} from "./js-components/previewBar";
import SkipNotice from "./render/SkipNotice";
import SkipNoticeComponent from "./components/SkipNoticeComponent";
@@ -219,8 +217,27 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type);
updatePreviewBar();
break;
case "closePopup":
closeInfoMenu();
break;
case "copyToClipboard":
navigator.clipboard.writeText(request.text);
break;
case "keydown":
document.dispatchEvent(new KeyboardEvent('keydown', {
key: request.key,
keyCode: request.keyCode,
code: request.code,
which: request.which,
shiftKey: request.shiftKey,
ctrlKey: request.ctrlKey,
altKey: request.altKey,
metaKey: request.metaKey
}));
break;
}
sendResponse({});
}
/**
@@ -528,6 +545,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
// Don't skip if this category should not be skipped
if (!shouldSkip(currentSkip) && !sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment)) return;
const skipBuffer = 0.003;
const skippingFunction = (forceVideoTime?: number) => {
let forcedSkipTime: number = null;
let forcedIncludeIntersectingSegments = false;
@@ -536,7 +554,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
if (incorrectVideoCheck(videoID, currentSkip)) return;
forceVideoTime ||= Math.max(video.currentTime, getVirtualTime());
if (forceVideoTime >= skipTime[0] && forceVideoTime < skipTime[1]) {
if (forceVideoTime >= skipTime[0] - skipBuffer && forceVideoTime < skipTime[1]) {
skipToTime({
v: video,
skipTime,
@@ -557,7 +575,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
startSponsorSchedule(forcedIncludeIntersectingSegments, forcedSkipTime, forcedIncludeNonIntersectingSegments);
};
if (timeUntilSponsor < 0.003) {
if (timeUntilSponsor < skipBuffer) {
skippingFunction(currentTime);
} else {
const delayTime = timeUntilSponsor * 1000 * (1 / video.playbackRate);
@@ -1128,7 +1146,7 @@ async function whitelistCheck() {
?? document.querySelector("a.ytp-title-channel-logo") // YouTube Embed
?? document.querySelector(".channel-profile #channel-name")?.parentElement.parentElement // Invidious
?? document.querySelector("a.slim-owner-icon-and-title")) // Mobile YouTube
?.getAttribute("href")?.match(/(?:\/c\/|\/channel\/)(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/)?.[1];
?.getAttribute("href")?.match(/\/(?:channel|c|user)\/(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/)?.[1];
try {
await utils.wait(() => !!getChannelID(), 6000, 20);
@@ -1686,73 +1704,30 @@ function openInfoMenu() {
//hide info button
if (playerButtons.info) playerButtons.info.button.style.display = "none";
sendRequestToCustomServer('GET', chrome.extension.getURL("popup.html"), function(xmlhttp) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
const popup = document.createElement("div");
popup.id = "sponsorBlockPopupContainer";
const popup = document.createElement("div");
popup.id = "sponsorBlockPopupContainer";
const frame = document.createElement("iframe");
frame.width = "374";
frame.height = "500";
frame.addEventListener("load", () => frame.contentWindow.postMessage("", "*"));
frame.src = chrome.extension.getURL("popup.html");
popup.appendChild(frame);
let htmlData = xmlhttp.responseText;
// Hack to replace head data (title, favicon)
htmlData = htmlData.replace(/<head>[\S\s]*<\/head>/gi, "");
// Hack to replace body and html tag with div
htmlData = htmlData.replace(/<body/gi, "<div");
htmlData = htmlData.replace(/<\/body/gi, "</div");
htmlData = htmlData.replace(/<html/gi, "<div");
htmlData = htmlData.replace(/<\/html/gi, "</div");
popup.innerHTML = htmlData;
//close button
const closeButton = document.createElement("button");
const closeButtonIcon = document.createElement("img");
closeButtonIcon.src = chrome.extension.getURL("icons/close.png");
closeButtonIcon.width = 15;
closeButtonIcon.height = 15;
closeButton.appendChild(closeButtonIcon);
closeButton.setAttribute("title", chrome.i18n.getMessage("closePopup"));
closeButton.classList.add("sbCloseButton");
closeButton.addEventListener("click", closeInfoMenu);
//add the close button
popup.prepend(closeButton);
const parentNodes = document.querySelectorAll("#secondary");
let parentNode = null;
for (let i = 0; i < parentNodes.length; i++) {
if (parentNodes[i].firstElementChild !== null) {
parentNode = parentNodes[i];
}
}
if (parentNode == null) {
//old youtube theme
parentNode = document.getElementById("watch7-sidebar-contents");
}
//make the logo source not 404
//query selector must be used since getElementByID doesn't work on a node and this isn't added to the document yet
const logo = <HTMLImageElement> popup.querySelector("#sponsorBlockPopupLogo");
const settings = <HTMLImageElement> popup.querySelector("#sbPopupIconSettings");
const edit = <HTMLImageElement> popup.querySelector("#sbPopupIconEdit");
const copy = <HTMLImageElement> popup.querySelector("#sbPopupIconCopyUserID");
const check = <HTMLImageElement> popup.querySelector("#sbPopupIconCheck");
const refreshSegments = <HTMLImageElement> popup.querySelector("#refreshSegments");
const heart = <HTMLImageElement> popup.querySelector(".sbHeart");
const close = <HTMLImageElement> popup.querySelector("#sbCloseDonate");
logo.src = chrome.extension.getURL("icons/IconSponsorBlocker256px.png");
settings.src = chrome.extension.getURL("icons/settings.svg");
edit.src = chrome.extension.getURL("icons/pencil.svg");
copy.src = chrome.extension.getURL("icons/clipboard.svg");
check.src = chrome.extension.getURL("icons/check.svg");
heart.src = chrome.extension.getURL("icons/heart.svg");
close.src = chrome.extension.getURL("icons/close.png");
refreshSegments.src = chrome.extension.getURL("icons/refresh.svg");
parentNode.insertBefore(popup, parentNode.firstChild);
//run the popup init script
runThePopup(messageListener);
const parentNodes = document.querySelectorAll("#secondary");
let parentNode = null;
for (let i = 0; i < parentNodes.length; i++) {
if (parentNodes[i].firstElementChild !== null) {
parentNode = parentNodes[i];
}
});
}
if (parentNode == null) {
//old youtube theme
parentNode = document.getElementById("watch7-sidebar-contents");
}
parentNode.insertBefore(popup, parentNode.firstChild);
}
function closeInfoMenu() {
@@ -1904,8 +1879,8 @@ function dontShowNoticeAgain() {
/**
* Helper method for the submission notice to clear itself when it closes
*/
function resetSponsorSubmissionNotice() {
submissionNotice?.close();
function resetSponsorSubmissionNotice(callRef = true) {
submissionNotice?.close(callRef);
submissionNotice = null;
}
@@ -2113,25 +2088,6 @@ function addCSS() {
}
}
function sendRequestToCustomServer(type, fullAddress, callback) {
const xmlhttp = new XMLHttpRequest();
xmlhttp.open(type, fullAddress, true);
if (callback != undefined) {
xmlhttp.onreadystatechange = function () {
callback(xmlhttp, false);
};
xmlhttp.onerror = function() {
callback(xmlhttp, true);
};
}
//submit this request
xmlhttp.send();
}
/**
* Update the isAdPlaying flag and hide preview bar/controls if ad is playing
*/
@@ -2204,3 +2160,18 @@ function checkForPreloadedSegment() {
Config.forceSyncUpdate("unsubmittedSegments");
}
}
// Register listener for URL change via Navigation API
const navigationApiAvailable = "navigation" in window;
if (navigationApiAvailable) {
// TODO: Remove type cast once type declarations are updated
(window as unknown as { navigation: EventTarget }).navigation.addEventListener("navigate", () => videoIDChange(getYouTubeVideoID(document)));
}
// Record availability of Navigation API
utils.wait(() => Config.local !== null).then(() => {
if (Config.local.navigationApiAvailable !== navigationApiAvailable) {
Config.local.navigationApiAvailable = navigationApiAvailable;
Config.forceLocalUpdate("navigationApiAvailable");
}
});

View File

@@ -1,15 +1,15 @@
import Config from "./config";
import { showDonationLink } from "./utils/configUtils";
import Utils from "./utils";
const utils = new Utils();
import { localizeHtmlPage } from "./utils/pageUtils";
import { GenericUtils } from "./utils/genericUtils";
window.addEventListener('DOMContentLoaded', init);
async function init() {
utils.localizeHtmlPage();
localizeHtmlPage();
await utils.wait(() => Config.config !== null);
await GenericUtils.wait(() => Config.config !== null);
if (!Config.config.darkMode) {
document.documentElement.setAttribute("data-theme", "light");

View File

@@ -16,7 +16,8 @@ interface DefaultMessage {
| "getChannelID"
| "isChannelWhitelisted"
| "submitTimes"
| "refreshSegments";
| "refreshSegments"
| "closePopup";
}
interface BoolValueMessage {
@@ -41,7 +42,24 @@ interface HideSegmentMessage {
UUID: SegmentUUID;
}
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage | SubmitVoteMessage | HideSegmentMessage);
interface CopyToClipboardMessage {
message: "copyToClipboard";
text: string;
}
interface KeyDownMessage {
message: "keydown";
key: string;
keyCode: number;
code: string;
which: number;
shiftKey: boolean;
ctrlKey: boolean;
altKey: boolean;
metaKey: boolean;
}
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage | SubmitVoteMessage | HideSegmentMessage | CopyToClipboardMessage | KeyDownMessage);
export interface IsInfoFoundMessageResponse {
found: boolean;

View File

@@ -12,13 +12,14 @@ import Utils from "./utils";
import CategoryChooser from "./render/CategoryChooser";
import KeybindComponent from "./components/KeybindComponent";
import { showDonationLink } from "./utils/configUtils";
import { localizeHtmlPage } from "./utils/pageUtils";
const utils = new Utils();
let embed = false;
window.addEventListener('DOMContentLoaded', init);
async function init() {
utils.localizeHtmlPage();
localizeHtmlPage();
// selected tab
if (location.hash != "") {

View File

@@ -1,5 +1,6 @@
import Config from "./config";
import Utils from "./utils";
import { localizeHtmlPage } from "./utils/pageUtils";
const utils = new Utils();
// This is needed, if Config is not imported before Utils, things break.
@@ -9,7 +10,7 @@ Config.config;
window.addEventListener('DOMContentLoaded', init);
async function init() {
utils.localizeHtmlPage();
localizeHtmlPage();
const domains = document.location.hash.replace("#", "").split(",");

View File

@@ -6,6 +6,7 @@ import { Message, MessageResponse, IsInfoFoundMessageResponse } from "./messageT
import { showDonationLink } from "./utils/configUtils";
import { AnimationUtils } from "./utils/animationUtils";
import { GenericUtils } from "./utils/genericUtils";
import { localizeHtmlPage } from "./utils/pageUtils";
const utils = new Utils();
interface MessageListener {
@@ -22,13 +23,15 @@ class MessageHandler {
sendMessage(id: number, request: Message, callback?) {
if (this.messageListener) {
this.messageListener(request, null, callback);
} else {
} else if (chrome.tabs) {
chrome.tabs.sendMessage(id, request, callback);
} else {
chrome.runtime.sendMessage({ message: "tabs", data: request }, callback);
}
}
query(config, callback) {
if (this.messageListener) {
if (this.messageListener || !chrome.tabs) {
// Send back dummy info
callback([{
url: document.URL,
@@ -41,15 +44,17 @@ class MessageHandler {
}
}
// To prevent clickjacking
let allowPopup = window === window.top;
window.addEventListener("message", async (e) => {
if (e.source !== window.parent) return;
if (e.origin.endsWith('.youtube.com')) return allowPopup = true;
});
//make this a function to allow this to run on the content page
async function runThePopup(messageListener?: MessageListener): Promise<void> {
const messageHandler = new MessageHandler(messageListener);
utils.localizeHtmlPage();
await utils.wait(() => Config.config !== null);
localizeHtmlPage();
type InputPageElements = {
whitelistToggle?: HTMLInputElement,
@@ -58,6 +63,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
};
type PageElements = { [key: string]: HTMLElement } & InputPageElements
/** If true, the content script is in the process of creating a new segment. */
let creatingSegment = false;
//the start and end time pairs (2d)
let sponsorTimes: SponsorTime[] = [];
//current video ID of this tab
let currentVideoID = null;
const PageElements: PageElements = {};
[
@@ -92,7 +106,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
// Username
"setUsernameContainer",
"setUsernameButton",
"setUsernameStatusContainer",
"setUsernameStatus",
"setUsernameStatus",
"setUsername",
"usernameInput",
@@ -100,7 +114,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
"submitUsername",
"sbPopupIconCopyUserID",
// More
"submissionSection",
"submissionHint",
"mainControls",
"loadingIndicator",
"videoFound",
@@ -112,9 +126,24 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
"sponsorTimesDonateContainer",
"sbConsiderDonateLink",
"sbCloseDonate",
"sbBetaServerWarning"
"sbBetaServerWarning",
"sbCloseButton"
].forEach(id => PageElements[id] = document.getElementById(id));
getSegmentsFromContentScript(false);
await utils.wait(() => Config.config !== null && allowPopup, 5000, 5);
document.querySelector("body").style.removeProperty("visibility");
PageElements.sbCloseButton.addEventListener("click", () => {
sendTabMessage({
message: "closePopup"
});
});
if (window !== window.top) {
PageElements.sbCloseButton.classList.remove("hidden");
}
// Hide donate button if wanted (Safari, or user choice)
if (!showDonationLink()) {
PageElements.sbDonate.style.display = "none";
@@ -149,16 +178,37 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.optionsButton.addEventListener("click", openOptions);
PageElements.helpButton.addEventListener("click", openHelp);
PageElements.refreshSegmentsButton.addEventListener("click", refreshSegments);
PageElements.sbPopupIconCopyUserID.addEventListener("click", async () => navigator.clipboard.writeText(await utils.getHash(Config.config.userID)));
PageElements.sbPopupIconCopyUserID.addEventListener("click", async () => copyToClipboard(await utils.getHash(Config.config.userID)));
/** If true, the content script is in the process of creating a new segment. */
let creatingSegment = false;
// Forward click events
if (window !== window.top) {
document.addEventListener("keydown", (e) => {
const target = e.target as HTMLElement;
if (target.tagName === "INPUT"
|| target.tagName === "TEXTAREA"
|| e.key === "ArrowUp"
|| e.key === "ArrowDown") {
return;
}
//the start and end time pairs (2d)
let sponsorTimes: SponsorTime[] = [];
if (e.key === " ") {
// No scrolling
e.preventDefault();
}
//current video ID of this tab
let currentVideoID = null;
sendTabMessage({
message: "keydown",
key: e.key,
keyCode: e.keyCode,
code: e.code,
which: e.which,
shiftKey: e.shiftKey,
ctrlKey: e.ctrlKey,
altKey: e.altKey,
metaKey: e.metaKey
});
});
}
//show proper disable skipping button
const disableSkipping = Config.config.disableSkipping;
@@ -239,8 +289,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
// Must be delayed so it only happens once loaded
setTimeout(() => PageElements.sponsorblockPopup.classList.remove("preload"), 250);
getSegmentsFromContentScript(false);
function showDonateWidget(viewCount: number) {
if (Config.config.showDonationLink && Config.config.donateClicked <= 0 && Config.config.showPopupDonationCount < 5
&& viewCount < 50000 && !Config.config.isVip && Config.config.skipCount > 10) {
@@ -272,13 +320,14 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
});
}
function loadTabData(tabs, updating: boolean): void {
async function loadTabData(tabs, updating: boolean): Promise<void> {
if (!currentVideoID) {
//this isn't a YouTube video then
displayNoVideo();
return;
}
await utils.wait(() => Config.config !== null, 5000, 10);
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] ?? [];
updateSegmentEditingUI();
@@ -429,15 +478,24 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
segmentTimeFromToNode.innerText = chrome.i18n.getMessage("full");
} else {
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)
: "");
(segmentTimes[i].actionType !== ActionType.Poi
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true)
: "");
}
segmentTimeFromToNode.style.margin = "5px";
// for inline-styling purposes
const labelContainer = document.createElement("div");
labelContainer.appendChild(categoryColorCircle);
segmentSummary.appendChild(categoryColorCircle);
segmentSummary.appendChild(textNode);
const span = document.createElement('span');
span.className = "summaryLabel";
span.appendChild(textNode);
labelContainer.appendChild(span);
// for inline-styling purposes
segmentSummary.appendChild(labelContainer);
segmentSummary.appendChild(segmentTimeFromToNode);
const votingButtons = document.createElement("details");
@@ -446,7 +504,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//thumbs up and down buttons
const voteButtonsContainer = document.createElement("div");
voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID;
voteButtonsContainer.setAttribute("align", "center");
voteButtonsContainer.classList.add("sbVoteButtonsContainer");
const upvoteButton = document.createElement("img");
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
@@ -468,7 +526,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
uuidButton.src = chrome.runtime.getURL("icons/clipboard.svg");
uuidButton.title = chrome.i18n.getMessage("copySegmentID");
uuidButton.addEventListener("click", () => {
navigator.clipboard.writeText(UUID);
copyToClipboard(UUID);
const stopAnimation = AnimationUtils.applyLoadingAnimation(uuidButton, 0.3);
stopAnimation();
});
@@ -562,7 +620,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
function updateSegmentEditingUI() {
PageElements.sponsorStart.innerText = chrome.i18n.getMessage(creatingSegment ? "sponsorEnd" : "sponsorStart");
PageElements.submissionSection.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
PageElements.submitTimes.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
PageElements.submissionHint.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
}
//make the options div visible
@@ -578,6 +637,22 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
chrome.runtime.sendMessage({ "message": "openHelp" });
}
function sendTabMessage(data: Message): Promise<unknown> {
return new Promise((resolve) => {
messageHandler.query({
active: true,
currentWindow: true
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
data,
(response) => resolve(response)
);
}
);
});
}
//make the options username setting option visible
function setUsernameButton() {
PageElements.usernameInput.value = PageElements.usernameValue.innerText;
@@ -589,7 +664,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.setUsername.style.display = "flex";
PageElements.setUsername.classList.add("SBExpanded");
PageElements.setUsernameStatusContainer.style.display = "none";
PageElements.setUsernameStatus.style.display = "none";
PageElements.sponsorTimesContributionsContainer.classList.add("hidden");
}
@@ -597,7 +672,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//submit the new username
function submitUsername() {
//add loading indicator
PageElements.setUsernameStatusContainer.style.display = "unset";
PageElements.setUsernameStatus.style.display = "unset";
PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("Loading");
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (response) {
@@ -610,7 +685,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.setUsername.classList.remove("SBExpanded");
PageElements.usernameValue.innerText = PageElements.usernameInput.value;
PageElements.setUsernameStatusContainer.style.display = "none";
PageElements.setUsernameStatus.style.display = "none";
PageElements.sponsorTimesContributionsContainer.classList.remove("hidden");
} else {
@@ -639,6 +714,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
thanksForVotingText.innerText = message;
}
function removeVoteMessage(UUID) {
const voteButtonsContainer = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
voteButtonsContainer.style.display = "block";
const voteStatusContainer = document.getElementById("sponsorTimesVoteStatusContainer" + UUID);
voteStatusContainer.style.display = "none";
const thanksForVotingText = document.getElementById("sponsorTimesThanksForVotingText" + UUID);
thanksForVotingText.removeAttribute("innerText");
}
function vote(type, UUID) {
//add loading info
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
@@ -662,6 +748,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
} else if (response.successType == -1) {
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
}
setTimeout(() => removeVoteMessage(UUID), 1500);
}
}
);
@@ -805,6 +892,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
hiddenButton.style.display = "none";
}
function copyToClipboard(text: string): void {
if (window === window.top) {
window.navigator.clipboard.writeText(text);
} else {
sendTabMessage({
message: "copyToClipboard",
text
});
}
}
/**
* Converts time in minutes to 2d 5h 25.1
* If less than 1 hour, just returns minutes
@@ -822,9 +920,4 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//end of function
}
if (chrome.tabs != undefined) {
//this means it is actually opened in the popup
runThePopup();
}
export default runThePopup;
runThePopup();

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

@@ -35,7 +35,7 @@ class SubmissionNotice {
contentContainer={contentContainer}
callback={callback}
ref={this.noticeRef}
closeListener={() => this.close()} />,
closeListener={() => this.close(false)} />,
this.noticeElement
);
}
@@ -44,7 +44,8 @@ class SubmissionNotice {
this.noticeRef.current.forceUpdate();
}
close(): void {
close(callRef = true): void {
if (callRef) this.noticeRef.current.cancel();
ReactDOM.unmountComponentAtNode(this.noticeElement);
this.noticeElement.remove();

View File

@@ -16,7 +16,7 @@ export interface ContentContainer {
updatePreviewBar: () => void,
onMobileYouTube: boolean,
sponsorSubmissionNotice: SubmissionNotice,
resetSponsorSubmissionNotice: () => void,
resetSponsorSubmissionNotice: (callRef?: boolean) => void,
updateEditButtonsOnPlayer: () => void,
previewTime: (time: number, unpause?: boolean) => void,
videoInfo: VideoInfo,

View File

@@ -256,31 +256,6 @@ export default class Utils {
}
}
localizeHtmlPage(): void {
//Localize by replacing __MSG_***__ meta tags
const localizedMessage = this.getLocalizedMessage(document.title);
if (localizedMessage) document.title = localizedMessage;
const objects = document.getElementsByClassName("sponsorBlockPageBody")[0].children;
for (let j = 0; j < objects.length; j++) {
const obj = objects[j];
const localizedMessage = this.getLocalizedMessage(obj.innerHTML.toString());
if (localizedMessage) obj.innerHTML = localizedMessage;
}
}
getLocalizedMessage(text: string): string | false {
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "&#60;")
.replace(/"/g, "&quot;").replace(/\n/g, "<br/>") : "";
});
if(valNewH != text) {
return valNewH;
} else {
return false;
}
}
/**
* @returns {String[]} Domains in regex form
*/

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

@@ -62,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,

View File

@@ -61,4 +61,27 @@ export function getHashParams(): Record<string, unknown> {
}
return {};
}
export function localizeHtmlPage(): void {
//Localize by replacing __MSG_***__ meta tags
const localizedTitle = getLocalizedMessage(document.title);
if (localizedTitle) document.title = localizedTitle;
const body = document.querySelector(".sponsorBlockPageBody");
const localizedMessage = getLocalizedMessage(body.innerHTML.toString());
if (localizedMessage) body.innerHTML = localizedMessage;
}
export function getLocalizedMessage(text: string): string | false {
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "&#60;")
.replace(/"/g, "&quot;").replace(/\n/g, "<br/>") : "";
});
if (valNewH != text) {
return valNewH;
} else {
return false;
}
}

View File

@@ -37,6 +37,7 @@ async function setup(): Promise<WebDriver> {
options.addArguments("--load-extension=" + Path.join(__dirname, "../dist/"));
options.addArguments("--mute-audio");
options.addArguments("--disable-features=PreloadMediaEngagementData, MediaEngagementBypassAutoplayPolicies");
options.addArguments("--headless=chrome");
const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build();
driver.manage().setTimeouts({