Compare commits

...

150 Commits

Author SHA1 Message Date
Ajay Ramachandran
21f54eef67 Add svgjs and testing with fake dom 2021-09-26 00:23:49 -04:00
Ajay Ramachandran
51d9edbbb4 Add start of visual segment editing 2021-09-25 23:33:13 -04:00
Ajay Ramachandran
76d9a9afa9 Merge pull request #957 from mchangrh/update-workflow
Update workflow
2021-09-21 19:04:20 -04:00
Michael C
514ebe8660 update wiki links in README 2021-09-20 02:14:54 -04:00
Michael C
2f4722162b update workflows to newest versions 2021-09-20 02:13:41 -04:00
Ajay Ramachandran
f219122f00 bump version 2021-09-19 22:41:21 -04:00
Ajay Ramachandran
008671d97f New Crowdin updates (#938) 2021-09-19 22:40:43 -04:00
FlorianZahn
6fb3802fd4 Preview skip-lenth dependant on playbackspeed (#949)
* Preview button playback speed dependant

Pressing "Preview" will now jump 2 seconds in front of the segment start time, depending on the playback speed.
2021-09-19 10:24:37 -04:00
Ajay Ramachandran
73241a0bd1 Fix in the middle of mute 2021-09-16 23:21:59 -04:00
Ajay Ramachandran
cc995b9848 Merge pull request #942 from LofhJann/master
Fix username wrapping
2021-09-15 21:33:23 -04:00
Janne Löfhjelm
778379d294 Fix username wrapping 2021-09-11 03:33:41 +03:00
Ajay Ramachandran
1083520666 Add warning for submitting multiple highlights 2021-09-10 19:07:16 -04:00
Ajay Ramachandran
cad5cd97fc New Crowdin updates (#933) 2021-09-07 23:29:35 -04:00
Ajay Ramachandran
7f5728d4db bump version 2021-09-07 23:28:48 -04:00
Ajay Ramachandran
06fa2748fe Fix package-lock, fix #937 2021-09-07 18:54:37 -04:00
Ajay Ramachandran
8b50373eab Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-09-06 23:51:28 -04:00
Ajay Ramachandran
bdedf86d63 Fix selenium test to change category 2021-09-06 23:51:26 -04:00
Ajay Ramachandran
0fb84dc03d Merge pull request #934 from KarelVerschraegen/patch-2
Fix typo in SubmissionNoticeComponent
2021-09-06 16:11:03 -04:00
Ajay Ramachandran
041ccdaf11 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-09-06 16:10:34 -04:00
Ajay Ramachandran
1f967b3f69 Fix skips not being counted and crash on old browser 2021-09-06 16:10:32 -04:00
KarelVerschraegen
07f0b87379 Fix typo in SubmissionNoticeComponent 2021-09-06 15:50:13 +02:00
Ajay Ramachandran
840dbbde4a New Crowdin updates (#928) 2021-09-05 13:30:51 -04:00
Ajay Ramachandran
2b9000ff84 bump version 2021-09-05 13:29:45 -04:00
Ajay Ramachandran
0d0171530c Remove unused string 2021-09-04 02:17:57 -04:00
Ajay Ramachandran
6040d177fa Say muted instead of skipped for mute segments 2021-09-04 02:09:10 -04:00
Ajay Ramachandran
2c1f5f16c2 Only show mute option for supported categories 2021-09-04 01:44:09 -04:00
Ajay Ramachandran
0e7a298967 bump version 2021-09-03 17:01:03 -04:00
Ajay Ramachandran
9a9f151979 New Crowdin updates (#926) 2021-09-03 16:58:07 -04:00
Ajay Ramachandran
ca814c9dcc Merge pull request #917 from mchangrh/update-matrix
update matrix links
2021-09-03 16:36:58 -04:00
Ajay Ramachandran
976dbb9159 Merge branch 'master' into update-matrix 2021-09-03 16:36:51 -04:00
Ajay Ramachandran
90ce9808f1 New Crowdin updates (#924)
* New translations messages.json (Italian)

* New translations messages.json (Vietnamese)

* New translations messages.json (Swedish)

* New translations messages.json (Turkish)

* New translations messages.json (Chinese Simplified)

* New translations messages.json (Indonesian)

* New translations messages.json (Tamil)

* New translations messages.json (Polish)

* New translations messages.json (Croatian)

* New translations messages.json (Estonian)

* New translations messages.json (Malay)

* New translations messages.json (Telugu)

* New translations messages.json (Malayalam)

* New translations messages.json (Norwegian)

* New translations messages.json (Russian)

* New translations messages.json (French)

* New translations messages.json (Portuguese, Brazilian)

* New translations messages.json (Spanish)

* New translations messages.json (Czech)

* New translations messages.json (German)

* New translations messages.json (Japanese)

* New translations messages.json (Dutch)

* New translations messages.json (Slovak)

* New translations messages.json (Ukrainian)

* New translations messages.json (Chinese Traditional)

* New translations messages.json (Romanian)

* New translations messages.json (Bulgarian)

* New translations messages.json (Finnish)

* New translations messages.json (Hungarian)

* New translations messages.json (Italian)

* New translations messages.json (Korean)

* New translations messages.json (German)

* New translations messages.json (Dutch)

* New translations messages.json (Ukrainian)

* New translations messages.json (French)

* New translations messages.json (Korean)

* New translations messages.json (Turkish)
2021-09-03 16:35:11 -04:00
Ajay Ramachandran
ef942fca8e Merge pull request #923 from ajayyy/silent-skip
Mute segments
2021-09-02 13:22:44 -04:00
Ajay Ramachandran
3671c4bb69 Hide mute option for highlight 2021-09-02 13:20:50 -04:00
Ajay Ramachandran
ef15526dcd Explain how to get public userID 2021-09-02 12:00:18 -04:00
Ajay Ramachandran
096737dcbb bump version 2021-09-02 11:44:38 -04:00
Ajay Ramachandran
02360c1f3c Fix centering on submission notice 2021-09-02 11:44:25 -04:00
Ajay Ramachandran
ccd8342ddb Update top contibutors 2021-09-02 00:37:53 -04:00
Ajay Ramachandran
4ae2a42c8c New Crowdin updates (#902) 2021-09-02 00:19:36 -04:00
Ajay Ramachandran
206d7bc2bd bump version 2021-09-02 00:14:46 -04:00
Ajay Ramachandran
0fc9e9b2fb Fix UI issues when text is long
Fixes #914
2021-09-02 00:05:13 -04:00
Ajay Ramachandran
5ad809cfb4 Add e2e test for mute skip 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
d1e46825af Fix mute skip failing on videos without segments 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
2763b6b6aa Clarify muting option 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
427b90a5e9 Add option to disable mute segments 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
60e54ee129 Hide unmute buttons after segment is finished 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
4092bf9b05 Make skip notice buttons work with mute segments 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
f31c2985e2 Add silent skipping to scheduler 2021-09-01 22:00:48 -04:00
Ajay Ramachandran
34cfd14e74 Add UI for submitting mute segments and request mute segments 2021-09-01 21:59:44 -04:00
Ajay Ramachandran
3774ef9756 Fix preview sometimes not skipping
Fixes #915
2021-09-01 19:50:58 -04:00
Ajay Ramachandran
098d879fe2 Merge pull request #922 from ajayyy/basic-selenium
Basic selenium
2021-09-01 16:03:05 -04:00
Ajay Ramachandran
49406b7ac6 Make refresh button work when no segments found
Fixes #885
2021-09-01 15:50:22 -04:00
Ajay Ramachandran
5c704ad241 Fix multiple segments skipped not appearing
Fixes #909, #919, #905
2021-09-01 15:41:46 -04:00
Ajay Ramachandran
681eb61763 Fix highlight appearing as two timestamps in popup 2021-09-01 13:15:15 -04:00
Ajay Ramachandran
71cf9888e8 Fix disable skipping not working for highlight
Resolves #916
2021-09-01 04:24:10 -04:00
Ajay Ramachandran
b1aaa0ac5e Add copy public id button 2021-09-01 04:22:06 -04:00
Michael C
0367f7900f udpate discord link for consistency 2021-08-29 15:01:11 -04:00
Michael C
47261a360c update matrix links 2021-08-29 14:56:08 -04:00
Ajay Ramachandran
a2c3116bdd Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-08-26 18:20:35 -04:00
Ajay Ramachandran
48a49e4136 Make highlight hover text work better on preview bar 2021-08-26 18:20:33 -04:00
Ajay Ramachandran
6de1a58d88 bump version 2021-08-24 02:28:18 -04:00
Ajay Ramachandran
43a9ba0f9e Fix keybind being flaky 2021-08-23 19:51:58 -04:00
Ajay Ramachandran
c3489e54a6 Fix highlight category when minimum duration set 2021-08-23 18:23:03 -04:00
Ajay Ramachandran
75c003b204 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-08-23 15:46:36 -04:00
Ajay Ramachandran
da5de43121 Fix skipping with highlight on invidious 2021-08-23 15:46:35 -04:00
Ajay Ramachandran
d20a44751c bump version 2021-08-23 03:08:01 -04:00
Ajay Ramachandran
15706fd3c4 Fix issue with early highlight breaking skipping 2021-08-22 20:47:46 -04:00
Ajay Ramachandran
a9e43f95f5 Fix highlight auto skipping on music videos 2021-08-22 19:03:24 -04:00
Ajay Ramachandran
11fe87a09e Fix highlight category info appearing to new users 2021-08-22 19:03:05 -04:00
Ajay Ramachandran
52741b2c0a Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-08-22 14:13:03 -04:00
Ajay Ramachandran
09b18a4f6d Fix auto skip on music videos for show overlay 2021-08-22 14:13:02 -04:00
Ajay Ramachandran
326385f325 New Crowdin updates (#900) 2021-08-21 12:55:55 -04:00
Ajay Ramachandran
28884f5e9f Bump version 2021-08-21 12:54:09 -04:00
Ajay Ramachandran
50d5f956c6 Refetch when not found no matter the date 2021-08-20 18:56:08 -04:00
Ajay Ramachandran
585038c902 Close skip to highlight when changing videos 2021-08-20 18:43:44 -04:00
Ajay Ramachandran
c79b06aed3 add comment for highlight update 2021-08-20 14:29:28 -04:00
Ajay Ramachandran
8d2883b6e2 Increase version 2021-08-20 13:39:56 -04:00
Ajay Ramachandran
c96ce694b7 New Crowdin updates (#897) 2021-08-20 13:39:18 -04:00
Ajay Ramachandran
989b5c9370 New Crowdin updates (#883) 2021-08-20 03:57:46 -04:00
Ajay Ramachandran
032264d8bb Merge pull request #896 from ajayyy/improvements
More highlight improvements
2021-08-20 03:57:27 -04:00
Ajay Ramachandran
d089e43b8a Add tooltip about highlight feature 2021-08-20 03:54:49 -04:00
Ajay Ramachandran
b3336a218e Make help page localisable and make up to date
Closes https://github.com/ajayyy/SponsorBlock/issues/509
2021-08-20 02:00:15 -04:00
Ajay Ramachandran
bea943dc96 Add option to disable $ link 2021-08-20 00:04:42 -04:00
Ajay Ramachandran
12f41521f5 Merge pull request #895 from ajayyy/improvements
Highlight category improvements
2021-08-19 22:37:53 -04:00
Ajay Ramachandran
36aec560ca Add options for smaller and faded notice 2021-08-19 22:32:28 -04:00
Ajay Ramachandran
e8a106d36b Fix warnings 2021-08-19 13:23:28 -04:00
Ajay Ramachandran
2c52b9e600 Merge pull request #690 from ajayyy/improvements
Highlight category
2021-08-19 13:23:26 -04:00
Ajay Ramachandran
3c5316a11c Disable fading by default for now 2021-08-19 13:21:30 -04:00
Ajay Ramachandran
c5044d3ebd Decrease font size on help page 2021-08-19 11:45:32 -04:00
Ajay Ramachandran
db34f1fd5b Add keybind support to skip to highlight 2021-08-19 01:17:36 -04:00
Ajay Ramachandran
21f563fdb7 Fix confusing padding on options page 2021-08-18 13:33:28 -04:00
Ajay Ramachandran
3bbc699d98 Move highlight category on options page 2021-08-18 13:29:02 -04:00
Ajay Ramachandran
53d688f219 Fix skip button on control bar in firefox 2021-08-18 11:18:24 -04:00
Ajay Ramachandran
2231e2a345 Keep showing control bar button if hovered 2021-08-18 02:13:05 -04:00
Ajay Ramachandran
e126b59078 Added skip button in control bar instead of using skip notice 2021-08-18 02:07:24 -04:00
Ajay Ramachandran
2a0e893dfc Fix second notice fading too soon 2021-08-17 23:09:01 -04:00
Ajay Ramachandran
8b348a2aeb Rename highlight category to poi_highlight 2021-08-17 22:05:19 -04:00
Ajay Ramachandran
28096e1ba6 Don't show multiple skip notices after skipping highlight 2021-08-17 21:45:30 -04:00
Ajay Ramachandran
56b74d6863 Use "skipped to" for poi 2021-08-17 21:44:57 -04:00
Ajay Ramachandran
ffc8f0b6a0 Hide unskip by default on poi segments 2021-08-17 21:05:53 -04:00
Ajay Ramachandran
4fef6dcfa0 Remove preview category auto enable 2021-08-17 21:03:36 -04:00
Ajay Ramachandran
a3c80573fa Make unskip work with highlight segment 2021-08-17 20:47:40 -04:00
Ajay Ramachandran
a13f5d2359 Show skip notice when clicking poi segment in seek bar 2021-08-17 19:37:52 -04:00
Ajay Ramachandran
42beaf698c Make highlight larger on preview bar 2021-08-17 18:37:59 -04:00
Ajay Ramachandran
4e99754b8c Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-08-17 18:25:18 -04:00
Ajay Ramachandran
422139f474 Link to new wiki 2021-08-17 01:45:03 -04:00
Ajay Ramachandran
93e5bf5033 Merge pull request #887 from maximmax42/patch-1
Fix for an "enable category" popup
2021-08-14 21:54:16 -04:00
Maxim
1bd78ec1c4 Fix for an "enable category" popup
If you choose any category when editing a segment, and then choose the "Choose a category" one, it triggers the enable category message with an empty category name. This is a fix for that.
2021-08-15 02:42:47 +05:00
Ajay Ramachandran
f01a1ae4ec Never show negative formatted time 2021-08-13 23:19:08 -04:00
Ajay Ramachandran
9c54d141e9 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-07-31 01:02:41 -04:00
Ajay Ramachandran
4ef8e36821 Fix build step casing 2021-07-30 23:37:13 -04:00
Ajay Ramachandran
788d4bf73c Build before running test 2021-07-30 23:36:31 -04:00
Ajay Ramachandran
d73c666e1f Extract out setup steps 2021-07-30 23:34:15 -04:00
Ajay Ramachandran
3187efaf1a Add test for skipping preview segment 2021-07-30 16:00:59 -04:00
Ajay Ramachandran
b9bbbebc10 Add test for editing 2021-07-30 15:53:57 -04:00
Ajay Ramachandran
d93e9a7d8a Add basic selenium test 2021-07-30 15:04:05 -04:00
Ajay Ramachandran
8c9424b6c5 Show notice in first slot if available 2021-07-18 15:42:54 -04:00
Ajay Ramachandran
6fa5aea680 Use short skip notice for highlight category 2021-07-15 16:36:42 -04:00
Ajay Ramachandran
a839480a33 Add auto and manual skip at start 2021-07-15 16:01:22 -04:00
Ajay Ramachandran
0dd2d18b07 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-07-02 21:21:25 -04:00
Ajay Ramachandran
798221606d Revert padding change 2021-07-01 01:13:06 -04:00
Ajay Ramachandran
55b38dc30e Fix x button position 2021-07-01 01:11:34 -04:00
Ajay Ramachandran
a1722db8d5 Fix key issues and remove redundant css property 2021-07-01 01:03:14 -04:00
Ajay Ramachandran
d27ddc85ae Move code for smaller notice into general notice component
Fixes other notices
2021-07-01 00:54:52 -04:00
Ajay Ramachandran
6d07abf6c8 Added basic PoC expanding notice
todo: move code to the general notice
2021-06-30 23:43:45 -04:00
Ajay Ramachandran
7adf0ad169 Added a notice that starts faded 2021-06-30 21:50:54 -04:00
Ajay Ramachandran
0086f00889 Remove printing 2021-06-30 21:28:14 -04:00
Ajay Ramachandran
d458bb0cdf Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements
# Conflicts:
#	src/components/SkipNoticeComponent.tsx
#	src/config.ts
#	src/content.ts
2021-06-30 21:27:21 -04:00
Ajay Ramachandran
71ec724295 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-06-18 00:46:55 -04:00
Ajay Ramachandran
5472919866 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-05-22 23:08:11 -04:00
Ajay Ramachandran
92eafdb6f3 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-05-22 01:52:05 -04:00
Ajay Ramachandran
5fbb8c0d4a Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements
# Conflicts:
#	manifest/manifest.json
#	src/components/SponsorTimeEditComponent.tsx
#	src/config.ts
#	src/content.ts
#	src/types.ts
2021-05-22 01:28:24 -04:00
Ajay Ramachandran
ebf3b324b6 Added a smaller notice 2021-05-13 20:03:05 -04:00
Ajay Ramachandran
e680099cec Scroll to category in options page 2021-05-11 01:09:01 -04:00
Ajay Ramachandran
616981a2b7 Update react to fix chrome warnings 2021-05-11 00:27:18 -04:00
Ajay Ramachandran
2aaee2c1c4 Only show skip keybind hint on one notice 2021-05-11 00:18:40 -04:00
Ajay Ramachandran
ef7e5d1312 Made highlight category work with hover text 2021-05-11 00:06:22 -04:00
Ajay Ramachandran
a8af7a0d78 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements
# Conflicts:
#	public/_locales/en/messages.json
#	src/utils.ts
2021-05-10 20:17:17 -04:00
Ajay Ramachandran
97ed091432 Change highlight default 2021-05-06 15:58:27 -04:00
Ajay Ramachandran
756233a959 Update db link 2021-04-29 20:30:05 -04:00
Ajay Ramachandran
9c13b7e8fd Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-04-23 21:34:47 -04:00
Ajay Ramachandran
a812b16da5 Fix centering on cloudtube 2021-04-08 19:04:11 -04:00
Ajay Ramachandran
4020cdc4f2 Support CloudTube 2021-04-08 18:42:13 -04:00
Ajay Ramachandran
5cf6719681 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into improvements 2021-04-08 17:58:50 -04:00
Ajay Ramachandran
0a587ed98b Fix button visibility for highlight category and always show upload button 2021-04-07 21:44:42 -04:00
Ajay Ramachandran
a08dbf4da1 Add submitting for highlight category 2021-04-05 23:35:05 -04:00
Ajay Ramachandran
edcda31db4 Raise z index of notice to be in front of endcards 2021-04-01 21:15:11 -04:00
Ajay Ramachandran
a10d7c338c Add preview category
Closes https://github.com/ajayyy/SponsorBlock/issues/444
2021-03-30 22:50:36 -04:00
Ajay Ramachandran
3ff5fdb3a1 Prompt to accept youtube.com permission if video info fails to load
Should fix #698, #687, #611 and #635
2021-03-24 20:13:33 -04:00
Ajay Ramachandran
cc935624e9 Add homepage url 2021-03-20 12:24:49 -04:00
Ajay Ramachandran
2681dc1890 Submit video duration 2021-03-20 11:50:15 -04:00
84 changed files with 6715 additions and 5194 deletions

View File

@@ -3,6 +3,8 @@ module.exports = {
browser: true,
es2021: true,
node: true,
jest: true,
jasmine: true,
},
extends: [
"eslint:recommended",

View File

@@ -10,8 +10,8 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- run: npm install
- name: Copy configuration
run: cp config.json.example config.json
@@ -23,44 +23,44 @@ jobs:
# Create Chrome artifacts
- name: Create Chrome artifacts
run: npm run build:chrome
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: ChromeExtension
path: dist
- run: mkdir ./builds
- uses: montudor/action-zip@v0.1.0
- uses: montudor/action-zip@v1
with:
args: zip -qq -r ./builds/ChromeExtension.zip ./dist
# Create Firefox artifacts
- name: Create Firefox artifacts
run: npm run build:firefox
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: FirefoxExtension
path: dist
- uses: montudor/action-zip@v0.1.0
- uses: montudor/action-zip@v1
with:
args: zip -qq -r ./builds/FirefoxExtension.zip ./dist
# Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env.stream=beta
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: ChromeExtensionBeta
path: dist
- uses: montudor/action-zip@v0.1.0
- uses: montudor/action-zip@v1
with:
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist
- name: Create Firefox Beta artifacts
run: npm run build:firefox -- --env.stream=beta
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: FirefoxExtensionBeta
path: dist
- uses: montudor/action-zip@v0.1.0
- uses: montudor/action-zip@v1
with:
args: zip -qq -r ./builds/FirefoxExtensionBeta.zip ./dist

View File

@@ -12,8 +12,8 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- run: npm install
- name: Copy configuration
run: cp config.json.example config.json
@@ -21,7 +21,7 @@ jobs:
# Create Chrome artifacts
- name: Create Chrome artifacts
run: npm run build:chrome
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: ChromeExtension
path: dist
@@ -32,7 +32,7 @@ jobs:
# Create Firefox artifacts
- name: Create Firefox artifacts
run: npm run build:firefox
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: FirefoxExtension
path: dist
@@ -42,7 +42,7 @@ jobs:
# Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env.stream=beta
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: ChromeExtensionBeta
path: dist
@@ -75,7 +75,7 @@ jobs:
# Firefox Beta
- name: Create Firefox Beta artifacts
run: npm run build:firefox -- --env.stream=beta
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: FirefoxExtensionBeta
path: dist
@@ -92,7 +92,7 @@ jobs:
run: sudo apt-get install rename
- name: Rename signed file
run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' *
- uses: actions/upload-artifact@v1
- uses: actions/upload-artifact@v2
with:
name: FirefoxExtensionSigned.xpi
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi

View File

@@ -50,13 +50,13 @@ See the [Wiki](https://github.com/ajayyy/SponsorBlock/wiki) for important links.
The backend server code is available here: https://github.com/ajayyy/SponsorBlockServer
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database ([License](https://github.com/ajayyy/SponsorBlock/wiki/Database-and-API-License)). If you are planning on using the database in another project, please read the [API Docs](https://github.com/ajayyy/SponsorBlock/wiki/API-Docs) page for more information.
To make sure that this project doesn't die, I have made the database publicly downloadable at https://sponsor.ajay.app/database ([License](https://github.com/ajayyy/SponsorBlock/wiki/Database-and-API-License)). If you are planning on using the database in another project, please read the [API Docs](https://wiki.sponsor.ajay.app/index.php/API_Docs) page for more information.
The dataset and API are now being used in some [ports](https://github.com/ajayyy/SponsorBlock/wiki/3rd-Party-Ports) as well as a [neural network](https://github.com/andrewzlee/NeuralBlock).
# API
You can read the API docs [here](https://github.com/ajayyy/SponsorBlockServer#api-docs).
You can read the API docs [here](https://wiki.sponsor.ajay.app/index.php/API_Docs).
# Building
@@ -90,7 +90,7 @@ mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt
# Credit
The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) was previously used, and the server is now using [NewLeaf](https://git.sr.ht/~cadence/NewLeaf) as a to get video info from YouTube.
The awesome [Invidious API](https://docs.invidious.io/API.md) was previously used, and the server is now using [NewLeaf](https://git.sr.ht/~cadence/NewLeaf) as a to get video info from YouTube.
Originally forked from [YTSponsorSkip](https://github.com/NDevTK/YTSponsorSkip), but very little code remains.

View File

@@ -2,5 +2,15 @@
"serverAddress": "https://sponsor.ajay.app",
"testingServerAddress": "https://sponsor.ajay.app/test",
"serverAddressComment": "This specifies the default SponsorBlock server to connect to",
"categoryList": ["sponsor", "selfpromo", "interaction", "intro", "outro", "preview", "music_offtopic"]
"categoryList": ["sponsor", "selfpromo", "interaction", "poi_highlight", "intro", "outro", "preview", "music_offtopic"],
"categorySupport": {
"sponsor": ["skip", "mute"],
"selfpromo": ["skip", "mute"],
"interaction": ["skip", "mute"],
"intro": ["skip"],
"outro": ["skip"],
"preview": ["skip"],
"music_offtopic": ["skip"],
"poi_highlight": ["skip"]
}
}

View File

@@ -1,6 +1,6 @@
module.exports = {
"roots": [
"src"
"test"
],
"transform": {
"^.+\\.ts$": "ts-jest"

View File

@@ -1,9 +1,10 @@
{
"name": "__MSG_fullName__",
"short_name": "SponsorBlock",
"version": "2.2",
"version": "3.2",
"default_locale": "en",
"description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app",
"content_scripts": [{
"run_at": "document_start",
"matches": [
@@ -40,8 +41,11 @@
"icons/help.svg",
"icons/report.png",
"icons/close.png",
"icons/skipIcon.svg",
"icons/refresh.svg",
"icons/beep.ogg",
"icons/pause.svg",
"icons/stop.svg",
"icons/PlayerInfoIconSponsorBlocker.svg",
"icons/PlayerDeleteIconSponsorBlocker.svg",
"popup.html",

5326
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,15 +4,18 @@
"description": "",
"main": "background.js",
"dependencies": {
"@svgdotjs/svg.js": "^3.1.1",
"@types/react": "^16.9.22",
"@types/react-dom": "^16.9.5",
"@types/selenium-webdriver": "^4.0.15",
"babel": "^6.23.0",
"babel-core": "^6.26.3",
"babel-loader": "^8.0.6",
"babel-preset-env": "^1.7.0",
"concurrently": "^5.1.0",
"react": "^16.12.0",
"react-dom": "^16.12.0"
"react": "^17.0.2",
"react-dom": "^17.0.2",
"svgdom": "^0.1.8"
},
"devDependencies": {
"@types/chrome": "0.0.91",
@@ -21,11 +24,13 @@
"@types/jquery": "^3.3.31",
"@typescript-eslint/eslint-plugin": "^4.9.1",
"@typescript-eslint/parser": "^4.9.1",
"chromedriver": "^92.0.0",
"copy-webpack-plugin": "^6.0.3",
"eslint": "^7.15.0",
"eslint-plugin-react": "^7.21.5",
"jest": "^27.0.6",
"rimraf": "^3.0.0",
"selenium-webdriver": "^4.0.0-beta.4",
"ts-jest": "^27.0.3",
"ts-loader": "^6.2.1",
"typescript": "~4.3",
@@ -53,7 +58,8 @@
"dev:firefox": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox\" \"npm run build:watch:firefox\"",
"dev:firefox-android": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox-android\" \"npm run build:watch:firefox\"",
"clean": "rimraf dist",
"test": "npx jest",
"test": "npm run build:chrome && npx jest",
"test-without-building": "npx jest",
"lint": "eslint src",
"lint:fix": "eslint src --fix"
},

View File

@@ -57,5 +57,35 @@
},
"manualPaused": {
"message": "تم إيقاف الموقت"
},
"confirmMSG": {
"message": "لتحرير أو حذف قيّم فردياً، انقر فوق زر المعلومات أو فتح الإضافة عن طريق النقر على أيقونة الإضافة في الزاوية اليمنى العليا."
},
"clearThis": {
"message": "هل أنت متأكد أنك تريد حذف هذا؟\n\n"
},
"Unknown": {
"message": "حدث خطأ في إرسال توقيت الرعاة الخاص بك، الرجاء المحاولة مرة أخرى لاحقاً."
},
"sponsorFound": {
"message": "يحتوي هذا الفيديو على أجزاء في قاعدة البيانات!"
},
"sponsor404": {
"message": "لم يتم العثور على أجزاء"
},
"sponsorStart": {
"message": "يبدأ الجزء الآن"
},
"sponsorEnd": {
"message": "ينتهي الجزء الآن"
},
"sponsorCancel": {
"message": "إلغاء إنشاء جزء"
},
"noVideoID": {
"message": "لم يتم العثور على فيديو يوتيوب.\nإذا كان هذا غير صحيح، قم بتحديث الصفحة."
},
"refreshSegments": {
"message": "تحديث الأجزاء"
}
}

View File

@@ -1,6 +1,6 @@
{
"fullName": {
"message": "SponsorBlock за YouTube - пропускай спонсорства",
"message": "SponsorBlock за YouTube - пропускайте спонсорства",
"description": "Name of the extension."
},
"Description": {
@@ -8,16 +8,16 @@
"description": "Description of the extension."
},
"400": {
"message": "Сървърът каза, че тази заявка е невалидна"
"message": "Сървърът съобщава, че тази заявка е невалидна"
},
"429": {
"message": "Подали сте прекалено много спонсорства за едно видео, сигурни ли сте, че има толкова много?"
},
"409": {
"message": "Това спонсорство вече е подадено"
"message": "Това спонсорство е вече изпратено"
},
"channelWhitelisted": {
"message": "Каналът е добавен към Whitelist!"
"message": "Каналът е добавен към белия списък!"
},
"Segment": {
"message": "сегмент"
@@ -29,28 +29,31 @@
"message": "Одобряване на това предложение"
},
"reportButtonTitle": {
"message": "Докладвай"
"message": "Докладване"
},
"reportButtonInfo": {
"message": "Подайте сигнал за неправилно предложение."
},
"Dismiss": {
"message": "Отхвърли"
"message": "Отхвърляне"
},
"Loading": {
"message": "Зареждане..."
},
"Hide": {
"message": "Никога не показвай"
"message": "Никога да не се показва"
},
"hitGoBack": {
"message": "Натиснете \"върни\" за да се върнете където бяхте."
"message": "Натиснете „връщане“, за да се върнете там, където бяхте."
},
"unskip": {
"message": "Върни"
"message": "Връщане"
},
"reskip": {
"message": "Пропусни отново"
"message": "Пропускане отново"
},
"unmute": {
"message": "Вкл. на звука"
},
"paused": {
"message": "На пауза"
@@ -59,13 +62,13 @@
"message": "Таймерът е спрян"
},
"confirmMSG": {
"message": "За да редактирате или изтриете някои стойности, натиснете на \"инфо\" бутона или отворете изкачащият прозорец на добавката чрез кликване на иконата на добавката в горният ляв ъгъл."
"message": "За да редактирате или изтриете отделни стойности, щракнете върху бутона за информация или отворете изскачащия прозорец на разширението, като щракнете върху иконата на разширението в горния десен ъгъл."
},
"clearThis": {
"message": "Сигурни ли сте, че искате да изчистите това?\n\n"
"message": "Наистина ли искате да изчистите това?\n\n"
},
"Unknown": {
"message": "Възникна грешка при подаването на Вашите спонсорски времена, моля опитайте отново по-късно."
"message": "Възникна грешка при подаването на вашите времена на спонсорства, моля, опитайте отново по-късно."
},
"sponsorFound": {
"message": "Този видеоклип има сегменти в базата данни!"
@@ -74,10 +77,10 @@
"message": "Не са намерени сегменти"
},
"sponsorStart": {
"message": "Сегментът Започва Сега"
"message": "Сегментът започва сега"
},
"sponsorEnd": {
"message": "Сегментът Свършва Сега"
"message": "Сегментът свършва сега"
},
"sponsorCancel": {
"message": "Отказ от създаването на сегмент"
@@ -92,7 +95,7 @@
"message": "Успешно!"
},
"voted": {
"message": "Гласувано!"
"message": "Гласувахте!"
},
"serverDown": {
"message": "Изглежда, че сървърът не работи. Свържете се с програмиста незабавно."
@@ -100,14 +103,11 @@
"connectionError": {
"message": "Възникна грешка с връзката. Код на грешката: "
},
"wantToSubmit": {
"message": "Искате ли да изпратите сегментите за видеоклип с id"
},
"clearTimes": {
"message": "Изчистване на сегментите"
},
"openPopup": {
"message": "Отворете изскачащия прозорец на SponsorBlock"
"message": "Отваряне на изскачащия прозорец на SponsorBlock"
},
"closePopup": {
"message": "Затваряне на прозореца"
@@ -116,7 +116,7 @@
"message": "Изпращане на сегментите"
},
"submitCheck": {
"message": "Сигурни ли сте, че искате да подадете това?"
"message": "Наистина ли искате да изпратите това?"
},
"whitelistChannel": {
"message": "Добавяне на канала към белия списък"
@@ -161,20 +161,23 @@
"setUsername": {
"message": "Задайте потребителско име"
},
"copyPublicID": {
"message": "Копиране на публичния UserID"
},
"discordAdvert": {
"message": "Елате в официалния Discord сървър за да давате предложения!"
"message": "Елате в официалния Discord сървър, за да давате предложения!"
},
"hideThis": {
"message": "Скрий това"
"message": "Скриване на това"
},
"Options": {
"message": "Настройки"
"message": "Опции"
},
"showButtons": {
"message": "Показване на бутоните в YouTube Player-а"
"message": "Показване на бутоните в плейъра на YouTube"
},
"hideButtons": {
"message": "Скриване на бутоните в YouTube Player-а"
"message": "Скриване на бутоните в плейъра на YouTube"
},
"hideButtonsDescription": {
"message": "Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане."
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Отново покажете известието"
},
"showSkipNotice": {
"message": "Показване на известие след пропускане на сегмент"
},
"noticeVisibilityMode0": {
"message": "Известия за пропускане в пълен размер"
},
"noticeVisibilityMode1": {
"message": "Малки известия за пропускане при автоматично пропускане"
},
"noticeVisibilityMode2": {
"message": "Изцяло малки известия за пропускане"
},
"noticeVisibilityMode3": {
"message": "Плавни известия за пропускане при автоматично пропускане"
},
"noticeVisibilityMode4": {
"message": "Изцяло плавни известия за пропускане"
},
"longDescription": {
"message": "SponsorBlock ви позволява да прескачате спонсори, въведения, заключения, напомняния за абониране и други досадни части от видеоклиповете в YouTube. SponsorBlock е разширение за браузър, създадено от множество хора, което позволява на всеки да изпраща началния и крайния час на спонсорирани сегменти и други сегменти от видеоклиповете в YouTube. След като един човек подаде тази информация, всички останали с това разширение ще прескочат спонсорирания сегмент. Можете също да пропуснете части без музика при музикалните видеоклипове.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Пропускане"
},
"mute": {
"message": "Заглушаване"
},
"skip_category": {
"message": "Пропускане на {0}?"
},
"mute_category": {
"message": "Заглушаване на {0}?"
},
"skip_to_category": {
"message": "Прескачане до {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Пропуснато"
"message": "{0} пропуснат",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} заглушено",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Прескочено до {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Деактивиране на автоматичното пропускане"
@@ -336,7 +376,7 @@
"message": "Импортиране/експортиране на вашия UserID"
},
"whatChangeUserID": {
"message": "Това трябва да се пази тайно. То е като парола и не трябва да се споделя с никого. Ако някой го притежава, той може да се представи за вас."
"message": "Това трябва да се пази в тайна. То е като парола и не трябва да се споделя с никого. Ако някой го има, може да се представи за вас. Ако търсите своя публичен потребителски идентификатор, щракнете върху иконата на клипборда в изскачащия прозорец."
},
"setUserID": {
"message": "Задаване на UserID"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Създаден от"
},
"autoSkip": {
"message": "Автоматично пропускане"
},
"showSkipNotice": {
"message": "Показване на известие след пропускане на сегмент"
},
"keybindCurrentlySet": {
"message": ". В момента е настроено на:"
},
@@ -424,7 +458,7 @@
"message": "Начално състояние"
},
"customAddressError": {
"message": "Този адрес не е в правилната форма. Уверете се, че имате http:// или https:// в началото и няма последващи наклонени черти."
"message": "Този адрес не е в правилния формат. Уверете се, че имате http:// или https:// в началото и няма последващи наклонени черти."
},
"areYouSureReset": {
"message": "Наистина ли искате да върнете началното състояние?"
@@ -500,22 +534,22 @@
"message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
},
"category_selfpromo": {
"message": "Неплатена/Само-реклама"
"message": "Неплатени/Самореклама"
},
"category_selfpromo_description": {
"message": "Подобно на \"спонсорство\", но е неплатено. Това включва merchandise, дарения или информация с кого каналът има сътрудничество."
"message": "Подобно на спонсорство, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."
},
"category_interaction": {
"message": "Напомняне за действие (Абониране)"
"message": "Напомняне за действие (абониране)"
},
"category_interaction_description": {
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или заради нещо специфично, трябва да е под \"само-реклама\"."
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или за нещо специфично, трябва да е под самореклама."
},
"category_interaction_short": {
"message": "Напомняне за взаимодействие"
},
"category_intro": {
"message": "Пауза/Начална анимация"
"message": "Антракт/Начална анимация"
},
"category_intro_description": {
"message": "Интервал без реално съдържание. Може да бъде пауза, статичен кадър, повтаряща се анимация. Това не трябва да се използва за преходи, съдържащи информация."
@@ -530,7 +564,7 @@
"message": "Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация."
},
"category_preview": {
"message": "Предварително изявление/Обобщение"
"message": "Кратко резюме/Обобщение"
},
"category_preview_description": {
"message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
@@ -539,38 +573,59 @@
"message": "Музика: Част без музика"
},
"category_music_offtopic_description": {
"message": "Само за използване в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория."
"message": "За използване само в музикални видеоклипове. Това трябва да се използва само за части от музикални видеоклипове, които вече не са обхванати от друга категория."
},
"category_music_offtopic_short": {
"message": "Без музика"
},
"category_poi_highlight": {
"message": "Акцент"
},
"category_poi_highlight_description": {
"message": "Частта от видеото, която повечето хора търсят. Подобно на коментарите „Видеото започва от х“."
},
"category_livestream_messages": {
"message": "Поточно предаване: Четене на съобщения/дарения"
},
"category_livestream_messages_short": {
"message": "Четене на съобщения"
},
"disable": {
"message": "Забрани"
"autoSkip": {
"message": "Автоматично пропускане"
},
"manualSkip": {
"message": "Ръчно Прескачане"
"message": "Ръчно пропускане"
},
"showOverlay": {
"message": "Показване в seek лентата"
"message": "Показване в лентата на прогреса"
},
"disable": {
"message": "Деактивиране"
},
"autoSkip_POI": {
"message": "Автоматично прескачане до началото"
},
"manualSkip_POI": {
"message": "Питане, когато видеото се зарежда"
},
"showOverlay_POI": {
"message": "Показване в лентата на прогреса"
},
"autoSkipOnMusicVideos": {
"message": "Автоматично пропускане на всички сегменти, когато има сегмент без музика"
},
"muteSegments": {
"message": "Разрешаване на сегменти, които заглушават звука, вместо да се пропускат"
},
"colorFormatIncorrect": {
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен hex код с \"#\" в началото."
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен шестнадесетичен код с „#“ в началото."
},
"previewColor": {
"message": "Цвят на неизпратен сегмент",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Цвят на лентата за превъртане"
"message": "Цвят на лентата на прогреса"
},
"category": {
"message": "Категория"
@@ -601,6 +656,9 @@
"message": "За да изпратите сегменти с категория „{0}“, трябва да я активирате от опциите. Ще бъдете пренасочени към опциите сега.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Внимание: Само един сегмент от този тип може да е активен. Изпращането на няколко ще доведе до показване на случаен."
},
"youMustSelectACategory": {
"message": "Трябва да изберете категория за всички сегменти, които изпращате!"
},
@@ -645,33 +703,37 @@
"message": "Помислете за активиране на „Принудителна проверка на канала преди пропускане“"
},
"downvoteDescription": {
"message": "Грешно/Неправилно Време"
"message": "Грешно/Неправилно време"
},
"incorrectCategory": {
"message": "Грешна Категория"
"message": "Грешна категория"
},
"nonMusicCategoryOnMusic": {
"message": "Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани."
},
"multipleSegments": {
"message": "Няколко Сегмента"
"message": "Няколко сегмента"
},
"guidelines": {
"message": "Правила"
"message": "Насоки"
},
"readTheGuidelines": {
"message": "Прочетете указанията!",
"message": "Прочетете насоките!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "Категориите са тук!"
},
"categoryUpdate2": {
"message": "Отворете опциите за пропускане на въведения, заключения, продажба на стоки и т.н."
"message": "Отворете опциите, за да пропускате въведения, заключения, продажба на стоки и т.н."
},
"help": {
"message": "Помощ"
},
"GotIt": {
"message": "Разбрах",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Отказ от всички бъдещи експерименти",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Скриване завинаги"
},
"warningChatInfo": {
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени, и просто искаме да изясним правилата. Можете също да се присъедините към този чат с помощта на discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени, и просто искаме да изясним правилата. Можете също да се присъедините към този чат с помощта на discord.gg/SponsorBlock или matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Гласуването е отхвърлено поради предупреждение. Щракнете, за да отворите чат и да го разрешите, или се върнете по-късно, когато имате време.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Дарение"
},
"hideDonationLink": {
"message": "Скриване на връзката за дарение"
},
"helpPageThanksForInstalling": {
"message": "Благодарим ви, че инсталирахте SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Моля, прегледайте опциите по-долу"
},
"helpPageFeatureDisclaimer": {
"message": "Много функции са деактивирани по подразбиране. Ако искате да пропускате въведения, заключения, да използвате Invidious и т.н., активирайте ги по-долу. Можете също да скриете/покажете елементи от потребителския интерфейс."
},
"helpPageHowSkippingWorks": {
"message": "Как работи пропускането"
},
"helpPageHowSkippingWorks1": {
"message": "Видео сегментите автоматично ще бъдат пропуснати, ако бъдат намерени в базата данни. Можете да отворите изскачащия прозорец, като щракнете върху иконата на разширението, за да прегледате какви са сегментите."
},
"helpPageHowSkippingWorks2": {
"message": "Всеки път, когато пропуснете сегмент, ще получите известие. Ако времето изглежда грешно, гласувайте против, като щракнете на палец надолу! Можете също така да гласувате в изскачащия прозорец."
},
"Submitting": {
"message": "Изпращане"
},
"helpPageSubmitting1": {
"message": "Изпращането може да се извърши или в изскачащия прозорец, като натиснете бутона „Сегментът започва сега“, или във видеоплейъра с бутоните на плейъра."
},
"helpPageSubmitting2": {
"message": "Щракването върху бутона за възпроизвеждане показва началото на сегмента, а щракването върху иконата за спиране показва края. Можете да подготвите множество спонсори, преди да натиснете „изпращане“. Щракването върху бутона за качване ще изпрати данните. Щракването върху кошчето за боклук ще ги изтрие."
},
"Editing": {
"message": "Редактиране"
},
"helpPageEditing1": {
"message": "Ако сте объркали, можете да редактирате или изтриете сегментите си, след като щракнете върху бутона със стрелка нагоре."
},
"helpPageTooSlow": {
"message": "Това е твърде бавно"
},
"helpPageTooSlow1": {
"message": "Има клавишни комбинации, ако искате да ги използвате. Натиснете клавиша с точка и запетая, за да посочите началото/края на спонсориран сегмент и щракнете върху апострофа, за да го изпратите. Клавишите могат да бъдат променени в опциите. Ако не използвате подредба QWERTY, вероятно трябва да промените зададените клавиши."
},
"helpPageCopyOfDatabase": {
"message": "Мога ли да получа копие от базата данни? Какво ще стане, ако изчезнете?"
},
"helpPageCopyOfDatabase1": {
"message": "Базата данни е публична и достъпна на адрес"
},
"helpPageCopyOfDatabase2": {
"message": "Програмният код е достъпен свободно. Така че, дори нещо да ми се случи, вашият принос не се губи."
},
"helpPageNews": {
"message": "Новини и как се прави"
},
"helpPageSourceCode": {
"message": "Къде мога да получа програмния код?"
},
"Credits": {
"message": "Заслуги"
},
"highlightNewFeature": {
"message": "Ново! Отидете до съществената част на видеоклипа с едно щракване с новата категория „Акцент“"
},
"LearnMore": {
"message": "Научете повече"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Znovu přeskočit"
},
"unmute": {
"message": "Zrušit ztlumení"
},
"paused": {
"message": "Pozastaveno"
},
@@ -74,7 +77,7 @@
"message": "Nebyly nalezeny žádné segmenty"
},
"sponsorStart": {
"message": "Segment nyní začíná"
"message": "Nyní začíná segment"
},
"sponsorEnd": {
"message": "Segment nyní končí"
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Došlo k chybě připojení. Kód chyby: "
},
"wantToSubmit": {
"message": "Chcete odeslat segmenty pro video s id"
},
"clearTimes": {
"message": "Vymazat segmenty"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Nastavit uživatelské jméno"
},
"copyPublicID": {
"message": "Kopírovat veřejné uživatelské ID"
},
"discordAdvert": {
"message": "Připojte se k oficiálnímu Discord serveru k podání návrhů a zpětné vazby!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Znovu zobrazit upozornění"
},
"showSkipNotice": {
"message": "Zobrazit upozornění po přeskočení segmentu"
},
"noticeVisibilityMode0": {
"message": "Oznámení o přeskočení v plné velikosti"
},
"noticeVisibilityMode1": {
"message": "Malá oznámení o automatickém přeskočení"
},
"noticeVisibilityMode2": {
"message": "Všechna malá oznámení o přeskočení"
},
"noticeVisibilityMode3": {
"message": "Vybledlá oznámení o automatickém přeskočení"
},
"noticeVisibilityMode4": {
"message": "Všechna vybledlá oznámení o přeskočení"
},
"longDescription": {
"message": "SponsorBlock vám umožní přeskakovat sponzorské sekce, intra, outra, oznámení k odběru a další otravné části YouTube videí. SponsorBlock je crowdsourcované rozšíření prohlížeče, které dává komukoli možnost odeslat začátek a konec sponzorovaných segmentů a dalších segmentů YouTube videí. Jakmile jedna osoba odešle tuto informaci, všichni ostatní s tímto rozšířením automaticky přeskočí sponzorovaný segment. Můžete také přeskakovat nehudební sekce v hudebních videích.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Přeskočit"
},
"mute": {
"message": "Ztlumit"
},
"skip_category": {
"message": "Přeskočit {0}?"
},
"mute_category": {
"message": "Ztlumit {0}?"
},
"skip_to_category": {
"message": "Přeskočit na {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "- přeskočeno"
"message": "Segment {0} přeskočen",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "Segment {0} ztlumen",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Přeskočeno na {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Zakázat automatické přeskočení"
@@ -336,7 +376,7 @@
"message": "Importovat / exportovat vaše UserID"
},
"whatChangeUserID": {
"message": "Toto byste měli udržet v soukromí. Je to jako heslo a neměli byste jej s nikým sdílet. Pokud jej někdo má, může se za vás vydávat."
"message": "Toto by mělo být ponecháno v soukromí. Je to jako heslo a nemělo by být s nikým sdíleno. Pokud to někdo má, může se za vás vydávat. Pokud hledáte vaše veřejné uživatelské ID, klikněte na ikonu schránky ve vyskakovacím okně."
},
"setUserID": {
"message": "Nastavit UserID"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Vytvořil"
},
"autoSkip": {
"message": "Automatické přeskočení"
},
"showSkipNotice": {
"message": "Zobrazit upozornění po přeskočení segmentu"
},
"keybindCurrentlySet": {
"message": ". Je momentálně nastaveno na:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Jiné než hudba"
},
"category_poi_highlight": {
"message": "Zvýraznění"
},
"category_poi_highlight_description": {
"message": "Část videa, kterou hledá většina lidí. Podobné komentářům typu \"Video začíná v x\"."
},
"category_livestream_messages": {
"message": "Livestream: Čtení donatů / zpráv"
},
"category_livestream_messages_short": {
"message": "Čtení zpráv"
},
"disable": {
"message": "Zakázat"
"autoSkip": {
"message": "Automatické přeskočení"
},
"manualSkip": {
"message": "Ruční přeskočení"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Zobrazit v liště"
},
"disable": {
"message": "Zakázat"
},
"autoSkip_POI": {
"message": "Automatické přeskočení na začátek"
},
"manualSkip_POI": {
"message": "Zeptat se při načtení videa"
},
"showOverlay_POI": {
"message": "Zobrazit v liště"
},
"autoSkipOnMusicVideos": {
"message": "Automaticky přeskočit všechny segmenty, když je ve videu nehudební segment"
},
"muteSegments": {
"message": "Povolit segmenty, které místo přeskočení ztlumují zvuk"
},
"colorFormatIncorrect": {
"message": "Vaše barva má nesprávný formát. Měl by to být 3 nebo 6 znaků dlouhý HEX kód s křížkem na začátku."
},
@@ -601,6 +656,9 @@
"message": "Pro odeslání segmentů v kategorii \"{0}\" to nejprve musíte povolit v nastavení. Nyní budete přesměrováni do nastavení.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Varování: tento typ segmentu může být aktivní najednou pouze jeden. Odeslání více segmentů způsobí zobrazení náhodného segmentu."
},
"youMustSelectACategory": {
"message": "Musíte vybrat kategorii pro všechny odeslané segmenty!"
},
@@ -672,6 +730,10 @@
"help": {
"message": "Nápověda"
},
"GotIt": {
"message": "Rozumím",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Odhlásit se ze všech budoucích experimentů",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Skrýt napořád"
},
"warningChatInfo": {
"message": "Dostali jste varování a nemůžete dočasně přidávat segmenty. To znamená, že jsme si všimli, že děláte běžné chyby, které nejsou škodlivé, jen chceme vyjasnit pravidla. Také se můžete připojit do tohoto chatu pomocí discord.gg/SponsorBlock nebo matrix.to/#/+sponsor:ajay.app"
"message": "Dostali jste varování a nemůžete dočasně přidávat segmenty. To znamená, že jsme si všimli, že děláte běžné chyby, které nejsou škodlivé, jen chceme vyjasnit pravidla. Také se můžete připojit do tohoto chatu pomocí discord.gg/SponsorBlock nebo matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Hlas zamítnut kvůli varování. Klikněte pro otevření chatu pro vyřešení, nebo se vraťte později, až budete mít čas.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Přispět"
},
"hideDonationLink": {
"message": "Skrýt odkaz na přispění"
},
"helpPageThanksForInstalling": {
"message": "Děkujeme za instalaci SponsorBlocku."
},
"helpPageReviewOptions": {
"message": "Zkontrolujte prosím možnosti níže"
},
"helpPageFeatureDisclaimer": {
"message": "Spousta funkcí je ve výchozím nastavení zakázána. Pokud chcete přeskakovat intra, outra, používat Invidious atd., povolte je níže. Můžete také zobrazit/skrýt UI prvky."
},
"helpPageHowSkippingWorks": {
"message": "Jak funguje přeskakování"
},
"helpPageHowSkippingWorks1": {
"message": "Segmenty videa budou automaticky přeskočeny, pokud budou nalezeny v databázi. Můžete si otevřít vyskakovací okno kliknutím na ikonu rozšíření pro náhled, co jsou zač."
},
"helpPageHowSkippingWorks2": {
"message": "Kdykoli přeskočíte segment, dostanete oznámení. Pokud je časování nesprávné, můžete hlasovat proti kliknutím na palec dolů! Také můžete hlasovat ve vyskakovacím okně."
},
"Submitting": {
"message": "Odesílání"
},
"helpPageSubmitting1": {
"message": "Odeslání může být provedeno buď ve vyskakovacím okně kliknutím na tlačítko \"Nyní začíná segment\" v přehrávači videa nebo na tlačítkách na přehrávači."
},
"helpPageSubmitting2": {
"message": "Kliknutím na tlačítko přehrávání označí začátek segmentu a kliknutí na ikonu stop označuje konec. Před odesláním si můžete připravit více segmentů. Kliknutím na tlačítko k nahrání odešlete vaše segmenty. Kliknutím na ikonu koše vše smažete."
},
"Editing": {
"message": "Úprava"
},
"helpPageEditing1": {
"message": "Pokud jste něco pokazili, můžete kliknutím na šipku nahoru upravit nebo odstranit své segmenty."
},
"helpPageTooSlow": {
"message": "Je to příliš pomalé"
},
"helpPageTooSlow1": {
"message": "Pokud je chcete použít, jsou zde zkratky. Stiskněte pomlčku pro označení začátku/konce sponzorského segmentu a klikněte na apostrof pro odeslání. Tyto zkratky lze změnit v možnostech. Pokud nepoužíváte QWERTY, měli byste si je nejspíše změnit."
},
"helpPageCopyOfDatabase": {
"message": "Mohu získat kopii databáze? Co se stane, pokud zmizíte?"
},
"helpPageCopyOfDatabase1": {
"message": "Databáze je veřejná a dostupná na"
},
"helpPageCopyOfDatabase2": {
"message": "Zdrojový kód je volně dostupný. Takže i když se mi něco stane, vaše příspěvky nebudou ztraceny."
},
"helpPageNews": {
"message": "Novinky a jak to funguje"
},
"helpPageSourceCode": {
"message": "Kde získám zdrojový kód?"
},
"Credits": {
"message": "Poděkování"
},
"highlightNewFeature": {
"message": "Novinka! Dostaňte se k pointě videa jedním kliknutím s novou kategorií zvýraznění"
},
"LearnMore": {
"message": "Zjistit více"
}
}

View File

@@ -4,7 +4,7 @@
"description": "Name of the extension."
},
"Description": {
"message": "Überspringe Sponsoren, Betteln um Abonnenten und mehr in YouTube-Videos. Melde Sponsoren in Videos, die du guckst, um Anderen Zeit zu sparen.",
"message": "Überspringe Sponsoren, Betteln um Abonnenten und mehr in YouTube-Videos. Melde Sponsoren in Videos, die du schaust, um Anderen Zeit zu ersparen.",
"description": "Description of the extension."
},
"400": {
@@ -32,7 +32,7 @@
"message": "Melden"
},
"reportButtonInfo": {
"message": "Diesen Beitrag als falsch melden."
"message": "Beitrag als unzulässig melden."
},
"Dismiss": {
"message": "Abbrechen"
@@ -52,6 +52,9 @@
"reskip": {
"message": "Nochmal überspringen"
},
"unmute": {
"message": "Ton an"
},
"paused": {
"message": "Pausiert"
},
@@ -85,8 +88,11 @@
"noVideoID": {
"message": "Kein YouTube-Video gefunden.\nWenn dies falsch ist, aktualisiere den Tab."
},
"refreshSegments": {
"message": "Segmente aktualisieren"
},
"success": {
"message": "Geschafft!"
"message": "Erfolg!"
},
"voted": {
"message": "Abgestimmt!"
@@ -97,9 +103,6 @@
"connectionError": {
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
},
"wantToSubmit": {
"message": "Möchtest du für Video-ID einreichen"
},
"clearTimes": {
"message": "Alle Segmente löschen"
},
@@ -158,6 +161,9 @@
"setUsername": {
"message": "Benutzernamen festlegen"
},
"copyPublicID": {
"message": "Öffentliche Benutzer-ID kopieren"
},
"discordAdvert": {
"message": "Tritt dem offiziellen Discord-Server bei und teile Anregungen und Feedback!"
},
@@ -185,6 +191,9 @@
"whatInfoButton": {
"message": "Dieser Knopf öffnet ein Pop-up auf der Youtube-Seite."
},
"autoHideInfoButton": {
"message": "Info-Button automatisch ausblenden"
},
"hideDeleteButton": {
"message": "Deaktiviere den Löschen-Knopf im Youtube-Videoplayer"
},
@@ -200,6 +209,9 @@
"whatViewTracking": {
"message": "Diese Funktion erfasst, welche Segmente du übersprungen hast, um andere Nutzer zu zeigen, wie hilfreich ihre Beiträge sind. Außerdem stellt dies zusammen mit positiven Bewertungen sicher, dass keine unerwünschten Inhalte in die Datenbank gelangen. Die Erweiterung sendet jedes Mal, wenn du ein Segment überspringst, eine Meldung an den Server. Hoffentlich verändern die meisten Nutzer diese Einstellung nicht, um unsere Statistik zu verbessern :)"
},
"enableViewTrackingInPrivate": {
"message": "Aktiviere den Übersprungen Zähler in Privaten/Incognito Tabs"
},
"enableQueryByHashPrefix": {
"message": "Abfrage nach Hash-Präfix"
},
@@ -215,6 +227,24 @@
"showNotice": {
"message": "Hinweis erneut anzeigen"
},
"showSkipNotice": {
"message": "Zeige Pop-up nach dem Überspringen eines Segments"
},
"noticeVisibilityMode0": {
"message": "Skip-Meldung in voller größe"
},
"noticeVisibilityMode1": {
"message": "Kleine Skip-Meldung für Auto-Skips"
},
"noticeVisibilityMode2": {
"message": "Alles kleine Skip-Meldungen"
},
"noticeVisibilityMode3": {
"message": "Verblasste Skip-Meldung für Auto-Skip"
},
"noticeVisibilityMode4": {
"message": "Alles verblasste Skip-Meldungen"
},
"longDescription": {
"message": "SponsorBlock lässt dich gesponserte Videosegmente, Intros, Outros, Interaktions-Erinnerungen, Musikvideoteile ohne Musik und andere nervige Teile von YouTube-Videos überspringen. SponsorBlock ist eine crowdsourced Browser-Erweiterung, in der jeder die Start- und Endzeit gesponserter Videosegmente und anderer Segmente von YouTube-Videos einreicht. Sobald eine Person diese Informationen einreicht, überspringen alle anderen mit dieser Erweiterung das gesponserte Segment.",
"description": "Full description of the extension on the store pages."
@@ -272,11 +302,30 @@
"skip": {
"message": "Überspringen"
},
"mute": {
"message": "Ton aus"
},
"skip_category": {
"message": "{0} überspringen?"
},
"mute_category": {
"message": "{0} stummschalten?"
},
"skip_to_category": {
"message": "Zu {0} springen?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Übersprungen"
"message": "{0} übersprungen",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} stummgeschalten",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Zu {0} gesprungen",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Automatisches Überspringen deaktivieren"
@@ -327,7 +376,7 @@
"message": "Benutzer-ID importieren/exportieren"
},
"whatChangeUserID": {
"message": "Halte diese ID geheim. Sie ist dazu in der Lage dich eindeutig zu identifizieren und sollte mit niemanden geteilt werden."
"message": "Dies sollte geheim gehalten werden. Dies ist wie ein Passwort und sollte mit niemandem geteilt werden. Sollte es jemand haben, könnte er sich als dich ausgeben. Wenn du nach deiner öffentlichen Benutzer-ID suchst, klicke das \"Kopieren\"-Symbol bei deinem Benutzernamen im Popup."
},
"setUserID": {
"message": "Interne Benutzer-ID festlegen"
@@ -338,18 +387,16 @@
"createdBy": {
"message": "Erstellt von"
},
"autoSkip": {
"message": "Automatisch überspringen"
},
"showSkipNotice": {
"message": "Zeige Pop-up nach dem Überspringen eines Segments"
},
"keybindCurrentlySet": {
"message": ". Aktuelle Einstellung:"
},
"supportOtherSites": {
"message": "Drittanbieter YouTube-Sites unterstützen"
},
"supportOtherSitesDescription": {
"message": "Unterstütze Drittanbieter YouTube Clients. Zum unterstützen müssen zusätzlichliche Berechtigungen akzeptiert werden. Dies funktioniert NICHT im Incognitomodus auf Chrome oder anderen Chromium Varianten.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Unterstützte Seiten: "
},
@@ -383,6 +430,12 @@
"minDurationDescription": {
"message": "Videosegmente, die kürzer als der festgelegte Wert sind, werden nicht übersprungen oder im Player angezeigt."
},
"skipNoticeDuration": {
"message": "Benachrichtigungsdauer überspringen (Sekunden):"
},
"skipNoticeDurationDescription": {
"message": "Die Überspringen Benachrichtigung wird mindestens so lange angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein."
},
"shortCheck": {
"message": "Die folgende Einreichung ist kürzer als deine Mindestdauer. Das könnte bedeuten, dass dieses Videosegment bereits eingereicht wurde und aufgrund dieser Option einfach ignoriert wird. Bist du dir sicher, dass du es übermitteln möchtest?"
},
@@ -417,7 +470,7 @@
"message": "Import/Export aller Einstellungen"
},
"whatExportOptions": {
"message": "Dies ist deine gesamte Konfiguration im JSON-Format. Sie beinhält unter anderem auch deine interne Benutzer-ID und sollte daher ebenfalls mit niemanden geteilt werden."
"message": "Dies ist deine gesamte Konfiguration im JSON-Format. Da diese auch deine Benutzer-ID enthält, solltest du dir genau überlegen, mit wem du diese teilen möchtest."
},
"setOptions": {
"message": "Konfiguration aus dem Eingabefeld übernehmen"
@@ -444,7 +497,7 @@
"message": "Vorschau"
},
"unsubmitted": {
"message": "Nicht eingereicht"
"message": "Nicht übermittelt"
},
"inspect": {
"message": "Überprüfen"
@@ -513,6 +566,9 @@
"category_preview": {
"message": "Vorschau/Zusammenfassung"
},
"category_preview_description": {
"message": "Kurze Zusammenfassung bisheriger Videos oder eine Vorschau auf das aktuelle Video. Für zusammengeschnittene Clips gedacht, jedoch nicht für mündliche Zusammenfassungen."
},
"category_music_offtopic": {
"message": "Musikvideoteile ohne Musik"
},
@@ -522,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Musikvideoteile ohne Musik"
},
"category_poi_highlight": {
"message": "Hervorheben"
},
"category_poi_highlight_description": {
"message": "Der Teil des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare."
},
"category_livestream_messages": {
"message": "In Livestreams Spenden/Nachrichten vorlesen"
},
"category_livestream_messages_short": {
"message": "Wertschätzungen im Livestream"
},
"disable": {
"message": "Deaktivieren"
"autoSkip": {
"message": "Automatisch überspringen"
},
"manualSkip": {
"message": "Manuelles Überspringen"
@@ -537,6 +599,24 @@
"showOverlay": {
"message": "In der Video-Zeitleiste anzeigen"
},
"disable": {
"message": "Deaktivieren"
},
"autoSkip_POI": {
"message": "Automatisch zum Start springen"
},
"manualSkip_POI": {
"message": "Beim Laden des Videos fragen"
},
"showOverlay_POI": {
"message": "In Suchleiste anzeigen"
},
"autoSkipOnMusicVideos": {
"message": "Alle Segmente automatisch überspringen, wenn ein nicht-Musiksegment vorhanden ist"
},
"muteSegments": {
"message": "Segmente zulassen, die den Ton ausschalten anstatt zu überspringen"
},
"colorFormatIncorrect": {
"message": "Die Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einer Raute am Anfang sein."
},
@@ -576,6 +656,9 @@
"message": "Um Segmente aus der Kategorie \"{0}\" zu senden, musst du diese in den Optionen aktivieren. Du wirst jetzt zu den Optionen weitergeleitet.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Achtung: Diese Art von Segment kann nur einmal pro Video aktiv sein. Sollten mehrere eingereicht werden, wird ein zufälliges angezeigt werden."
},
"youMustSelectACategory": {
"message": "Du musst eine Kategorie für jedes zu übermittelnde Segment auswählen!"
},
@@ -644,11 +727,94 @@
"categoryUpdate2": {
"message": "Öffne die Optionen um das Verhalten bei Intros, Outros, Merchandising (Fanartikel) usw. einzustellen."
},
"help": {
"message": "Hilfe"
},
"GotIt": {
"message": "Verstanden",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Aus allen zukünftigen Experimenten abmelden",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Dauerhaft verbergen"
},
"warningChatInfo": {
"message": "Du wurdest ermahnt und kannst zur Zeit keine Segmente einreichen. Uns ist nämlich aufgefallen, dass du ein paar gängige Fehler machst, die nicht bösartig sind. Um die Regeln klarzustellen laden wir dich zu einem kurzem Gespräch auf discord.gg/SponsorBlock oder matrix.to/#/+sponsor:ajay.app ein"
"message": "Du wurdest verwarnt und kannst vorrübergehend keine Segmente einreichen. Es ist uns aufgefallen, dass du gängige Fehler machst, welche nicht schädlich sind, und wir wollen dir nur die Regeln klar machen. Du kannst auch dem Chat durch discord.gg/SponsorBlock oder matrix.to/#/#sponsor:ajay.app beitreten"
},
"voteRejectedWarning": {
"message": "Abstimmung wegen einer Warnung abgelehnt. Um über sie zu reden, klicke hier, oder schreibe uns später.",
"message": "Abstimmung wegen einer Warnung abgelehnt. Klicke hier um einen Chat zu öffnen, oder versuch es später erneut, wenn du Zeit hast.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Spenden"
},
"hideDonationLink": {
"message": "Verstecke Spendenlink"
},
"helpPageThanksForInstalling": {
"message": "Danke fürs installieren von SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Bitte überprüfe die unten stehenden Optionen"
},
"helpPageFeatureDisclaimer": {
"message": "Viele Funktionen sind standardmäßig deaktiviert. Wenn du Intros und Outtros überspringen willst, Invidious verwenden willst, usw. aktiviere sie unten. Du kannst auch UI-Elemente verstecken/anzeigen."
},
"helpPageHowSkippingWorks": {
"message": "Wie überspringen funktioniert"
},
"helpPageHowSkippingWorks1": {
"message": "Videosegmente werden automatisch übersprungen, wenn sie in der Datenbank gefunden werden. Du kannst das Popup öffnen, indem du auf das Erweiterungssymbol klickst, um eine Vorschau darüber zu erhalten, was diese sind."
},
"helpPageHowSkippingWorks2": {
"message": "Wannimmer du ein Segment überspringst, wirst du benachrichtigt. Wenn das Timing falsch erscheint, kannst du as durch klicken auf den Downvote button downvoten! Du kannst auch im Popup voten."
},
"Submitting": {
"message": "Übermitteln"
},
"helpPageSubmitting1": {
"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."
},
"Editing": {
"message": "Bearbeitung"
},
"helpPageEditing1": {
"message": "Wenn du etwas falsch gemacht hast, kannst du ein Segment bearbeiten oder löschen nachdem du auf den Auf-Pfeil Knopf gedrückt hast."
},
"helpPageTooSlow": {
"message": "Das ist zu langsam"
},
"helpPageTooSlow1": {
"message": "Es gibt Hotkeys, wenn du diese verwenden möchtest. Drücke die Semikolon-Taste um den Anfang/das Ende eines Sponsor-Segments zu markieren und die Abostrophe-Taste um es zu übermitteln. Diese können in den Optionen geändert werden. Wenn du keine QWERTY-Tastatur verwendest, solltest du eventuell die Keybinds ändern."
},
"helpPageCopyOfDatabase": {
"message": "Kann ich eine kopie der Datenbank erhalten? Was passiert wenn du verschwindest?"
},
"helpPageCopyOfDatabase1": {
"message": "Die Datenbank ist öffentlich und verfügbar unter"
},
"helpPageCopyOfDatabase2": {
"message": "Der Quellcode ist frei verfügbar. Selbst wenn mir etwas passieren würde wären deine Übermittlungen nicht verloren."
},
"helpPageNews": {
"message": "Nachrichten und wie es gemacht wird"
},
"helpPageSourceCode": {
"message": "Wo kann ich den Quellcode kriegen?"
},
"Credits": {
"message": "Mitwirkende"
},
"highlightNewFeature": {
"message": "Neu! Gehe mit einem Klick zum Punkt des Videos mit der neuen \"Hervorheben\" Kategorie"
},
"LearnMore": {
"message": "Erfahre mehr"
}
}

View File

@@ -62,9 +62,6 @@
"skip": {
"message": "Παράκαμψη"
},
"skipped": {
"message": "Παραλείφθηκε"
},
"minLower": {
"message": "λεπτό"
},

View File

@@ -19,7 +19,7 @@
"channelWhitelisted": {
"message": "Channel Whitelisted!"
},
"Segment": {
"Segment": {
"message": "segment"
},
"Segments": {
@@ -52,6 +52,9 @@
"reskip": {
"message": "Reskip"
},
"unmute": {
"message": "Unmute"
},
"paused": {
"message": "Paused"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "A connection error has occured. Error code: "
},
"wantToSubmit": {
"message": "Do you want to submit for video id"
},
"clearTimes": {
"message": "Clear Segments"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Set Username"
},
"copyPublicID": {
"message": "Copy Public UserID"
},
"discordAdvert": {
"message": "Come join the official discord server to give suggestions and feedback!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Show Notice Again"
},
"showSkipNotice": {
"message": "Show Notice After A Segment Is Skipped"
},
"noticeVisibilityMode0": {
"message": "Full Size Skip Notices"
},
"noticeVisibilityMode1": {
"message": "Small Skip Notices for Auto Skip"
},
"noticeVisibilityMode2": {
"message": "All Small Skip Notices"
},
"noticeVisibilityMode3": {
"message": "Faded Skip Notices for Auto Skip"
},
"noticeVisibilityMode4": {
"message": "All Faded Skip Notices"
},
"longDescription": {
"message": "SponsorBlock lets you skip over sponsors, intros, outros, subscription reminders, and other annoying parts of YouTube videos. SponsorBlock is a crowdsourced browser extension that let's anyone submit the start and end time's of sponsored segments and other segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. You can also skip over non music sections of music videos.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,34 @@
"skip": {
"message": "Skip"
},
"mute": {
"message": "Mute"
},
"visual": {
"message": "Visual",
"description": "This is the name of the option to create visual obstructions on top of the video to hide logos when a skip doesn't work."
},
"skip_category": {
"message": "Skip {0}?"
},
"mute_category": {
"message": "Mute {0}?"
},
"skip_to_category": {
"message": "Skip to {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Skipped"
"message": "{0} Skipped",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Muted",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Skipped to {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Disable Auto Skip"
@@ -336,7 +380,7 @@
"message": "Import/Export Your UserID"
},
"whatChangeUserID": {
"message": "This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you."
"message": "This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you. If you are looking for your public userID, click the clipboard icon in the popup."
},
"setUserID": {
"message": "Set UserID"
@@ -347,12 +391,6 @@
"createdBy": {
"message": "Created By"
},
"autoSkip": {
"message": "Auto Skip"
},
"showSkipNotice": {
"message": "Show Notice After A Segment Is Skipped"
},
"keybindCurrentlySet": {
"message": ". It is currently set to:"
},
@@ -544,14 +582,20 @@
"category_music_offtopic_short": {
"message": "Non-Music"
},
"category_poi_highlight": {
"message": "Highlight"
},
"category_poi_highlight_description": {
"message": "The part of the video that most people are looking for. Similar to \"Video starts at x\" comments."
},
"category_livestream_messages": {
"message": "Livestream: Donation/Message Readings"
},
"category_livestream_messages_short": {
"message": "Message Reading"
},
"disable": {
"message": "Disable"
"autoSkip": {
"message": "Auto Skip"
},
"manualSkip": {
"message": "Manual Skip"
@@ -559,9 +603,24 @@
"showOverlay": {
"message": "Show In Seek Bar"
},
"disable": {
"message": "Disable"
},
"autoSkip_POI": {
"message": "Auto skip to the start"
},
"manualSkip_POI": {
"message": "Ask when video loads"
},
"showOverlay_POI": {
"message": "Show In Seek Bar"
},
"autoSkipOnMusicVideos": {
"message": "Auto skip all segments when there is a non-music segment"
},
"muteSegments": {
"message": "Allow segments that mute audio instead of skip"
},
"colorFormatIncorrect": {
"message": "Your color is formatted incorrectly. It should be a 3 or 6 digit hex code with a number sign at the beginning."
},
@@ -601,6 +660,9 @@
"message": "To submit segments with the category of \"{0}\", you must enable it in the options. You will be redirected to the options now.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Warning: This type of segment can have a maximum of one active at a time. Submitting multiple will cause a random one to be shown."
},
"youMustSelectACategory": {
"message": "You must select a category for all segments you are submitting!"
},
@@ -672,6 +734,10 @@
"help": {
"message": "Help"
},
"GotIt": {
"message": "Got it",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Opt-out of all future experiments",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +746,79 @@
"message": "Hide forever"
},
"warningChatInfo": {
"message": "You got a warning and cannot submit segments temporarily. This means that we noticed you were making some common mistakes that are not malicious, and we just want to clarify the rules. You can also join this chat using discord.gg/SponsorBlock or matrix.to/#/+sponsor:ajay.app"
"message": "You got a warning and cannot submit segments temporarily. This means that we noticed you were making some common mistakes that are not malicious, and we just want to clarify the rules. You can also join this chat using discord.gg/SponsorBlock or matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Vote rejected due to a warning. Click to open a chat to resolve it, or come back later when you have time.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Donate"
},
"hideDonationLink": {
"message": "Hide Donation Link"
},
"helpPageThanksForInstalling": {
"message": "Thanks for installing SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Please review the options below"
},
"helpPageFeatureDisclaimer": {
"message": "Many features are disabled by default. If you want to skip intros, outros, use Invidious, etc., enable them below. You can also hide/show UI elements."
},
"helpPageHowSkippingWorks": {
"message": "How skipping works"
},
"helpPageHowSkippingWorks1": {
"message": "Video segments will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are."
},
"helpPageHowSkippingWorks2": {
"message": "Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup."
},
"Submitting": {
"message": "Submitting"
},
"helpPageSubmitting1": {
"message": "Submitting can either be done in the popup by hitting the \"Segment Starts Now\" button or in the video player with the buttons on the player."
},
"helpPageSubmitting2": {
"message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete."
},
"Editing": {
"message": "Editing"
},
"helpPageEditing1": {
"message": "If you messed up, you can edit or delete your segments after clicking the up arrow button."
},
"helpPageTooSlow": {
"message": "This is too slow"
},
"helpPageTooSlow1": {
"message": "There are hotkeys if you want to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit. These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding."
},
"helpPageCopyOfDatabase": {
"message": "Can I get a copy of the Database? What happens if you disappear?"
},
"helpPageCopyOfDatabase1": {
"message": "The database is public and available at"
},
"helpPageCopyOfDatabase2": {
"message": "The source code is freely available. So, even if something happens to me, your submissions are not lost."
},
"helpPageNews": {
"message": "News and how it is made"
},
"helpPageSourceCode": {
"message": "Where can I get the source code?"
},
"Credits": {
"message": "Credits"
},
"highlightNewFeature": {
"message": "New! Get to the point of the video with one click with the new highlight category"
},
"LearnMore": {
"message": "Learn More"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Volver a saltar"
},
"unmute": {
"message": "Restaurar sonido"
},
"paused": {
"message": "Pausado"
},
@@ -74,10 +77,10 @@
"message": "No se han encontrado segmentos"
},
"sponsorStart": {
"message": "El segmento comienza ahora"
"message": "El Segmento Inicia Ahora"
},
"sponsorEnd": {
"message": "El segmento termina ahora"
"message": "El Segmento Termina Ahora"
},
"sponsorCancel": {
"message": "Cancelar Creación de Segmento"
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Ha ocurrido un error de conexión. Código de error: "
},
"wantToSubmit": {
"message": "¿Quiere enviar el segmento para el video con ID"
},
"clearTimes": {
"message": "Borrar Segmentos"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Escoger Nombre De Usuario"
},
"copyPublicID": {
"message": "Copiar el ID de usuario público"
},
"discordAdvert": {
"message": "¡Únete al servidor oficial de discord para darnos sugerencias y comentarios!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Mostrar aviso de nuevo"
},
"showSkipNotice": {
"message": "Mostrar aviso después de que se omita un segmento"
},
"noticeVisibilityMode0": {
"message": "Avisos de Omisión de Tamaño Completo"
},
"noticeVisibilityMode1": {
"message": "Avisos de Omisión Pequeños para la Omisión Automática"
},
"noticeVisibilityMode2": {
"message": "Todos los Avisos de Omisión Pequeños"
},
"noticeVisibilityMode3": {
"message": "Avisos de Omisión Desvanecidos para la Omisión Automática"
},
"noticeVisibilityMode4": {
"message": "Todos los Avisos de Omisión Desvanecidos"
},
"longDescription": {
"message": "SponsorBlock te permite saltarte los patrocinadores, intros, outros, recordatorios de suscripción y otras partes molestas de los videos de YouTube. SponsorBlock es una extensión de navegador de código abierto que permite a cualquiera enviar el tiempo de inicio y fin de los segmentos de patrocinadores y otros segmentos de los videos de YouTube. Una vez que una persona envía esta información, todos los que tengan esta extensión podrán saltearse ese segmento. También es posible saltar las secciones no musicales de los videos musicales.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Omitir"
},
"mute": {
"message": "Silenciar"
},
"skip_category": {
"message": "¿Saltar {0}?"
},
"mute_category": {
"message": "¿Silenciar {0}?"
},
"skip_to_category": {
"message": "¿Saltar a {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Omitido/as"
"message": "{0} Omitido/as",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Silenciado",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Se ha saltado a {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Desactivar la omisión automática"
@@ -333,26 +373,20 @@
"message": "Comprueba status.sponsor.ajay.app para ver el estado del servidor."
},
"changeUserID": {
"message": "Importar/Exportar tu UserID"
"message": "Importar/Exportar tu ID de usuario"
},
"whatChangeUserID": {
"message": "Esto debería mantenerse privado. Es como una contraseña y no debe ser compartido con nadie. Si alguien tiene esto, pueden imitarte."
"message": "Esto se debería mantener privado. Esto es como una contraseña y no debe ser compartido con nadie. Si alguien tiene esto, puede suplantarte. Si estás buscando tu ID de usuario público, haz clic en el icono de portapapeles en la ventana emergente."
},
"setUserID": {
"message": "Establecer la ID de usuario"
"message": "Establecer el ID de usuario"
},
"userIDChangeWarning": {
"message": "Advertencia: El cambio de la ID de usuario es irreversible. ¿Está seguro de que le desea hacerlo? Asegúrese de hacer una copia de respaldo de la anterior por si acaso."
"message": "Advertencia: El cambio del ID de usuario es irreversible. ¿Está seguro de que le desea hacerlo? Asegúrese de hacer una copia de respaldo de la anterior por si acaso."
},
"createdBy": {
"message": "Creado Por"
},
"autoSkip": {
"message": "Omitir automáticamente"
},
"showSkipNotice": {
"message": "Mostrar aviso después de que se omita un segmento"
},
"keybindCurrentlySet": {
"message": ". Actualmente está configurado para:"
},
@@ -542,7 +576,13 @@
"message": "Sólo para el uso en vídeos musicales. Esto sólo debe utilizarse para secciones de vídeos musicales que no están ya cubiertos por otra categoría."
},
"category_music_offtopic_short": {
"message": "No musical"
"message": "Sin Música"
},
"category_poi_highlight": {
"message": "Destacado"
},
"category_poi_highlight_description": {
"message": "La parte del video que la mayoría de gente está buscando. Similar a los comentarios que dicen \"El video comienza en x\"."
},
"category_livestream_messages": {
"message": "Directo: Lecturas de donaciones y mensajes"
@@ -550,8 +590,8 @@
"category_livestream_messages_short": {
"message": "Lectura del mensaje"
},
"disable": {
"message": "Desactivar"
"autoSkip": {
"message": "Omitir automáticamente"
},
"manualSkip": {
"message": "Omisión manual"
@@ -559,8 +599,23 @@
"showOverlay": {
"message": "Mostrar en la barra de búsqueda"
},
"disable": {
"message": "Desactivar"
},
"autoSkip_POI": {
"message": "Omitir automáticamente al inicio"
},
"manualSkip_POI": {
"message": "Preguntar cuando cargue el video"
},
"showOverlay_POI": {
"message": "Mostrar en la barra de búsqueda"
},
"autoSkipOnMusicVideos": {
"message": "Saltar automáticamente todos los segmentos cuando hay un segmento no musical"
"message": "Omitir automáticamente todos los segmentos cuando hay un segmento sin música"
},
"muteSegments": {
"message": "Permitir segmentos que silencian el audio en lugar de omitir"
},
"colorFormatIncorrect": {
"message": "Su color está formateado incorrectamente. Debería ser un código hexadecimal de 3 o 6 dígitos con un signo numérico al principio."
@@ -601,6 +656,9 @@
"message": "Para enviar segmentos con la categoría de \"{0}\", debes activarlo en las opciones. Serás redirigido a las opciones ahora.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Advertencia: Solo puede haber uno de este tipo de segmento activo a la vez. Enviar múltiples causará que se muestre uno al azar."
},
"youMustSelectACategory": {
"message": "¡Debes seleccionar una categoría para todos los segmentos que estés presentando!"
},
@@ -639,7 +697,7 @@
"message": "Comprobación forzada del canal antes de saltarse"
},
"whatForceChannelCheck": {
"message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."
"message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso, ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."
},
"forceChannelCheckPopup": {
"message": "Considere la posibilidad de activar \"Comprobación del canal de fuerza antes de saltar\""
@@ -651,7 +709,7 @@
"message": "Categoría Incorrecta"
},
"nonMusicCategoryOnMusic": {
"message": "Este video está clasificado como música. ¿Estás seguro de que esto tiene un patrocinador? Si esto es realmente un \"Segmento sin música\", abre las opciones de extensión y habilita esta categoría. Entonces, puedes enviar este segmento como \"No-Música\" en lugar de patrocinador. Por favor, lee las directrices si estás confundido."
"message": "Este video está clasificado como música. ¿Estás seguro de que esto tiene un sponsor? Si esto es realmente un \"Segmento Sin Música\", abre las opciones de la extensión y activa esta categoría. Entonces, puedes enviar este segmento como \"Sin Música\" en lugar de sponsor. Por favor, lee las instrucciones si estás confundido/a."
},
"multipleSegments": {
"message": "Múltiples segmentos"
@@ -672,6 +730,10 @@
"help": {
"message": "Ayuda"
},
"GotIt": {
"message": "Entendido",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "No participar en futuros experimentos",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Ocultar para siempre"
},
"warningChatInfo": {
"message": "Ha recibido una advertencia y no puede enviar segmentos temporalmente. Esto significa que hemos notado de que estaba cometiendo algunos errores comunes que no son maliciosos, y solo queremos aclarar las reglas. Puedes unirte a este chat usando discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
"message": "Ha recibido una advertencia y no puede enviar segmentos temporalmente. Esto significa que hemos notado de que estaba cometiendo algunos errores comunes que no son maliciosos, y solo queremos aclarar las reglas. Puedes unirte a este chat usando discord.gg/SponsorBlock o matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Voto rechazado debido a una advertencia. Haga clic aquí para abrir un chat para resolverlo, o vuelva más tarde cuando tenga tiempo.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Donar"
},
"hideDonationLink": {
"message": "Ocular Enlace de Donación"
},
"helpPageThanksForInstalling": {
"message": "Gracias por instalar SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Por favor, revise las siguientes opciones"
},
"helpPageFeatureDisclaimer": {
"message": "Muchas funciones están desactivadas por defecto. Si quiere saltar intros, outros, usar Invidious, etc., actívelos a continuación. También puede ocular/mostrar los elementos de la interfaz."
},
"helpPageHowSkippingWorks": {
"message": "Como funciona el salteo"
},
"helpPageHowSkippingWorks1": {
"message": "Los segmentos de video serán omitidos automáticamente si son encontrados en la base de datos. Puede abrir la ventana emergente haciendo clic en el ícono de la extensión para obtener una vista previa de los que son."
},
"helpPageHowSkippingWorks2": {
"message": "Cada vez que salte un segmento, recibirá un aviso. ¡Si el tiempo parece equivocado, dele un voto negativo! También puede votar en la ventana emergente."
},
"Submitting": {
"message": "Envío"
},
"helpPageSubmitting1": {
"message": "El envío puede realizarse desde la ventana emergente pulsando el botón \"El Segmento Inicia Ahora\" o en el reproductor de video con los botones de este."
},
"helpPageSubmitting2": {
"message": "Hacer clic en el botón de reproducir indica el inicio de un segmento y hacer clic en el icono de detener indica el final de este. Puede preparar múltiples sponsors antes de enviarlos. Hacer clic en el botón de subida lo(s) enviará. Hacer clic en la papelera lo(s) borrará."
},
"Editing": {
"message": "Edición"
},
"helpPageEditing1": {
"message": "Si se equivoca, puede editar o eliminar sus segmentos después de hacer clic en el botón de flecha hacia arriba."
},
"helpPageTooSlow": {
"message": "Esto es muy lento"
},
"helpPageTooSlow1": {
"message": "Hay teclas de acceso directo, si quiere usarlas. Presione la tecla de punto y coma para indicar el inicio/final de un segmento de sponsor y haga clic en el apóstrofe para enviar. Estas se pueden cambiar en las opciones. Si no usa un teclado QWERTY, probablemente debería cambiar la asignación de teclas."
},
"helpPageCopyOfDatabase": {
"message": "¿Puedo obtener una copia de la base de datos? ¿Qué sucede si tú desapareces?"
},
"helpPageCopyOfDatabase1": {
"message": "La base de datos es pública y disponible en"
},
"helpPageCopyOfDatabase2": {
"message": "El código fuente está disponible libremente. Así que, aun si algo me sucede, sus envíos no se perderán."
},
"helpPageNews": {
"message": "Noticias y cómo se hace"
},
"helpPageSourceCode": {
"message": "¿Dónde puedo conseguir el código fuente?"
},
"Credits": {
"message": "Créditos"
},
"highlightNewFeature": {
"message": "¡Nuevo! Llega al punto del video con un solo clic con la nueva categoría \"destacado\""
},
"LearnMore": {
"message": "Aprenda Más"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Jäta uuesti vahele"
},
"unmute": {
"message": "Tühista vaigistus"
},
"paused": {
"message": "Pausil"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Ühendusega esines tõrge. Veakood: "
},
"wantToSubmit": {
"message": "Kas soovid segmendid saata video IDle"
},
"clearTimes": {
"message": "Tühjenda segmendid"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Määra kasutajanimi"
},
"copyPublicID": {
"message": "Kopeeri avalik UserID"
},
"discordAdvert": {
"message": "Tule liitu ametliku Discordi serveriga, et anda soovitusi ja tagasisidet!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Kuva märkus uuesti"
},
"showSkipNotice": {
"message": "Kuva segmendi vahelejätmisel teatis"
},
"noticeVisibilityMode0": {
"message": "Täissuuruses vahelejätmise teavitused"
},
"noticeVisibilityMode1": {
"message": "Väikesed vahelejätmise teavitused autom. vahelejätmistele"
},
"noticeVisibilityMode2": {
"message": "Kõik vahelejätmise teavitused on väikesed"
},
"noticeVisibilityMode3": {
"message": "Hääbuvad vahelejätmise teavitused autom. vahelejätmistele"
},
"noticeVisibilityMode4": {
"message": "Kõik vahelejätmise teavitused hääbuvad"
},
"longDescription": {
"message": "SponsorBlock lubab sul vahele jätta sponsorid, vaheajad, kanali tellimise meeldetuletused ja muud YouTube'i videote tüütud kohad. SponsorBlock on rahva ühistööna toimiv brauserilaiendus, mis lubab igaühel saata sponsoreeritud segmendi algus- ja lõpuaegu ning teiste video segmentide aegu. Kui üks inimene saadab sponsoreeritud segmendi, jätavad teised laienduse kasutajad kohe selle vahele. Laiendus võimaldab ka muusikavideotel mitte-muusika jaotised vahele jätta.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Jäta vahele"
},
"mute": {
"message": "Vaigista"
},
"skip_category": {
"message": "Jätad {0} vahele?"
},
"mute_category": {
"message": "Vaigistad {0}?"
},
"skip_to_category": {
"message": "Jäta {0}-ni vahele?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "vahelejäetud"
"message": "{0} vahelejäetud",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} vaigistatud",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "{0}-ni vahelejäetud",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Keela automaatne vahelejätmine"
@@ -336,7 +376,7 @@
"message": "Impordi/ekspordi oma UserID"
},
"whatChangeUserID": {
"message": "Seda tuleks privaatsena hoida. See on nagu parool ning seda ei tohiks kellegagi jagada. Kui kellelgi see on, saavad nad sinuna esineda."
"message": "Seda tuleks privaatsena hoida. See on nagu parool ning seda ei tohiks kellegagi jagada. Kui kellelgi see on, saavad nad sinuna esineda.\nKui otsid avalikku UserID'd, klõpsa hüpikus olevat lõikelaua ikooni."
},
"setUserID": {
"message": "Seadista UserID"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Autor"
},
"autoSkip": {
"message": "Autom. vahelejätmine"
},
"showSkipNotice": {
"message": "Kuva segmendi vahelejätmisel teatis"
},
"keybindCurrentlySet": {
"message": ". Hetkel on selleks määratud:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Mitte-muusika"
},
"category_poi_highlight": {
"message": "Esiletõst"
},
"category_poi_highlight_description": {
"message": "Video osa, mida enamus inimesed otsivad. Sarnaneb kommentaaridele stiilis \"video algab ajal x\"."
},
"category_livestream_messages": {
"message": "Otseülekanne: annetuste ja sõnumite lugemine"
},
"category_livestream_messages_short": {
"message": "Sõnumite lugemine"
},
"disable": {
"message": "Keela"
"autoSkip": {
"message": "Autom. vahelejätmine"
},
"manualSkip": {
"message": "Käsitsi vahelejätmine"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Kuva mängija ajaribal"
},
"disable": {
"message": "Keela"
},
"autoSkip_POI": {
"message": "Jäta automaatselt alguseni vahele"
},
"manualSkip_POI": {
"message": "Küsi video laadimisel"
},
"showOverlay_POI": {
"message": "Kuva mängija ajaribal"
},
"autoSkipOnMusicVideos": {
"message": "Jäta automaatselt kõik segmendid vahele, kui eksisteerib mitte-muusika segment"
},
"muteSegments": {
"message": "Luba segmente, mis vahelejätmise asemel vaigistavad heli"
},
"colorFormatIncorrect": {
"message": "Sinu värv on sobimatult vormistatud. See peaks olema 3- või 6-numbriline 16-kümmendsüsteemis kood, arvu ees trellid."
},
@@ -672,6 +727,10 @@
"help": {
"message": "Abi"
},
"GotIt": {
"message": "Sain aru",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Keeldu kõigist tulevikus tehtavatatest eksperimentidest",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +739,31 @@
"message": "Peida igaveseks"
},
"warningChatInfo": {
"message": "Sa said hoiatuse ning ei saa ajutiselt segmente saata. See tähendab, et me leidsime sind tegemast teatud sagedasi, mitte-pahatahtlikke vigu, ning soovime sulle meie reegleid täpsustada (inglise keeles). Sa võid selle vestlusega liituda ka discord.gg/SponsorBlock või matrix.to/#/+sponsor:ajay.app kaudu."
"message": "Sa said hoiatuse ning ei saa ajutiselt segmente saata. See tähendab, et me leidsime sind tegemast teatud sagedasi, mitte-pahatahtlikke vigu, ning soovime sulle meie reegleid täpsustada (inglise keeles). Sa võid selle vestlusega liituda ka discord.gg/SponsorBlock või matrix.to/#/#sponsor:ajay.app kaudu."
},
"voteRejectedWarning": {
"message": "Hääletus hoiatuse tõttu tagasilükatud. Klõpsa, et avada selle lahendamiseks vestlus või tule hiljem tagasi, kui aega saad.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Anneta"
},
"hideDonationLink": {
"message": "Peida annetuste link"
},
"helpPageThanksForInstalling": {
"message": "Täname SponsorBlocki paigaldamise eest."
},
"helpPageNews": {
"message": "Uudised ja kuidas see on valmistatud"
},
"Credits": {
"message": "Tiitrid"
},
"highlightNewFeature": {
"message": "Uus! Mine ühe klõpsuga video eesmärgi juurde uue \"esiletõstu\" kategooriaga"
},
"LearnMore": {
"message": "Lisateave"
}
}

View File

@@ -6,6 +6,9 @@
"400": {
"message": "سرور گفت که این درخواست نامعتبر است"
},
"429": {
"message": "شما برای این یک ویدیو تعداد بیش از حدی زمان اسپانسر ثبت کرده‌اید، آیا مطمئن هستید که به این تعداد وجود دارد؟"
},
"409": {
"message": "این قبلاً ثبت شده است"
},
@@ -24,6 +27,9 @@
"reportButtonTitle": {
"message": "گزارش"
},
"reportButtonInfo": {
"message": "گزارش این ارسال به‌عنوان غیر صحیح."
},
"Dismiss": {
"message": "رد کردن"
},
@@ -42,6 +48,9 @@
"reskip": {
"message": "دوباره رد کردن"
},
"unmute": {
"message": "صدادار"
},
"paused": {
"message": "وقفه شده"
},
@@ -54,6 +63,9 @@
"Unknown": {
"message": "اشکالی در ثبت کردن زمان های ارسالی شما پیش آمد. لطفا بعداً دوباره تلاش کنید."
},
"sponsorFound": {
"message": "این ویدیو دارای بخش‌هایی در پایگاه‌داده است!"
},
"sponsor404": {
"message": "هیچ بخشی پیدا نشد"
},
@@ -63,6 +75,15 @@
"sponsorEnd": {
"message": "بخش اینجا پایان می‌یابد"
},
"sponsorCancel": {
"message": "لغو ساختن بخش"
},
"noVideoID": {
"message": "هیچ ویدیوی یوتیوب‌ای یافت نشد.\nاگر این صحیح نیست، زبانه را تازه کنید."
},
"refreshSegments": {
"message": "تازه‌کردن بخش‌ها"
},
"success": {
"message": "موفقیت!"
},
@@ -75,9 +96,6 @@
"connectionError": {
"message": "خطای شبکه رخ داده است. کد خطا: "
},
"wantToSubmit": {
"message": "آی می‌خواهید که گزارش را ثبت کنید برای ویدیوی"
},
"clearTimes": {
"message": "پاک‌نمودن بخش‌ها"
},
@@ -93,15 +111,36 @@
"submitCheck": {
"message": "مطمئن هستید که میخواهید این را ثبت کنید؟"
},
"whitelistChannel": {
"message": "قرار دادن کانال در لیست سفید"
},
"removeFromWhitelist": {
"message": "حذف کانال از لیست سفید"
},
"voteOnTime": {
"message": "رأی دهی به یک بخش"
},
"Submissions": {
"message": "ارسالی‌ها"
},
"savedPeopleFrom": {
"message": "شما دیگران را نجات دادید از "
},
"viewLeaderboard": {
"message": "لیست سرنشینان"
},
"recordTimesDescription": {
"message": "ثبت"
},
"clearTimesButton": {
"message": "حذف دفعات"
},
"submitTimesButton": {
"message": "ثبت دفعات"
},
"Username": {
"message": "نام‌کاربری"
},
"setUsername": {
"message": "تنظیم نام کاربری"
},
@@ -132,5 +171,101 @@
"noticeUpdate2": {
"message": "اگر همچنان این را نمی‌پسندید، گزینه هرگز نمایش نده را انتخاب کنید.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"disableSkipping": {
"message": "ردکردن فعال است"
},
"enableSkipping": {
"message": "ردکردن غیرفعال است"
},
"yourWork": {
"message": "کار شما",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"errorCode": {
"message": "کد خطا: "
},
"skip": {
"message": "رد کردن"
},
"mute": {
"message": "بی‌صدا"
},
"createdBy": {
"message": "ایجاد شده توسط"
},
"add": {
"message": "افزودن"
},
"save": {
"message": "ذخیره"
},
"reset": {
"message": "بازنشانی"
},
"areYouSureReset": {
"message": "آيا مطمئن هستيد که مي خواهيد این را بازنشانی کنید؟"
},
"mobileUpdateInfo": {
"message": "m.youtube.com اکنون پشتیبانی می‌شود"
},
"setOptions": {
"message": "تنظیم گزینه‌ها"
},
"submit": {
"message": "ثبت"
},
"cancel": {
"message": "لغو"
},
"delete": {
"message": "حذف"
},
"preview": {
"message": "پیش‌نمایش"
},
"unsubmitted": {
"message": "ثبت‌نشده"
},
"inspect": {
"message": "مشاهده"
},
"edit": {
"message": "ویرایش"
},
"to": {
"message": "به",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "اسپانسر"
},
"category_music_offtopic_short": {
"message": "غیر موسیقی"
},
"category_poi_highlight": {
"message": "برجسته"
},
"autoSkip": {
"message": "ردکردن خودکار"
},
"manualSkip": {
"message": "ردکردن دستی"
},
"bracketNow": {
"message": "(اکنون)"
},
"bracketEnd": {
"message": "(پایان)"
},
"help": {
"message": "راهنما"
},
"GotIt": {
"message": "فهمیدم",
"description": "Used as the button to dismiss a tooltip"
},
"Donate": {
"message": "کمک مالی"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Ohita uudelleen"
},
"unmute": {
"message": "Poista mykistys"
},
"paused": {
"message": "Pysäytetty"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Yhteysvirhe on tapahtunut. Virhekoodi: "
},
"wantToSubmit": {
"message": "Haluatko lähettää segmentit videotunnukselle"
},
"clearTimes": {
"message": "Tyhjennä segmentit"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Aseta käyttäjänimi"
},
"copyPublicID": {
"message": "Kopio julkinen UserID"
},
"discordAdvert": {
"message": "Liity mukaan viralliselle Discord-palvelimelle, jotta voit antaa ehdotuksia ja palautetta!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Näytä ilmoitus uudelleen"
},
"showSkipNotice": {
"message": "Näytä ilmoitus ohitetun segmentin jälkeen"
},
"noticeVisibilityMode0": {
"message": "Täysikokoiset ohitusilmoitukset"
},
"noticeVisibilityMode1": {
"message": "Pienet ohitusilmoitukset automaattiselle ohitukselle"
},
"noticeVisibilityMode2": {
"message": "Kaikki pienet ohitusilmoitukset"
},
"noticeVisibilityMode3": {
"message": "Haalistuneet ohitusilmoitukset automaattiselle ohitukselle"
},
"noticeVisibilityMode4": {
"message": "Kaikki haalistuneet ohitusilmoitukset"
},
"longDescription": {
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on joukkoistettu selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden segmenttien aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun segmentin. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,23 @@
"skip": {
"message": "Ohita"
},
"mute": {
"message": "Mykistä"
},
"skip_category": {
"message": "Ohita {0}?"
},
"skip_to_category": {
"message": "Ohita kohtaan: {0}",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Ohitettu"
"message": "{0} ohitettu",
"description": "Example: Sponsor Skipped"
},
"skipped_to_category": {
"message": "Ohitettiin kohtaan: {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Poista automaattinen ohitus käytöstä"
@@ -336,7 +369,7 @@
"message": "Tuo/vie UserID:si"
},
"whatChangeUserID": {
"message": "Tämä tulisi pitää yksityisenä. Tämä on kuin salasana eikä sitä pitäisi jakaa kenellekään. Jos joku saa tämän, hän voi esiintyä sinuna."
"message": "Tämä pitäisi pitää yksityisenä. Tämä on kuin salasana, eikä sitä pitäisi jakaa kenenkään kanssa. Jos jollakulla on tämä, he voivat esiintyä sinuna. Jos etsit julkista userID:täsi, napsauta leikepöydän kuvaketta ponnahdusikkunassa."
},
"setUserID": {
"message": "Aseta UserID"
@@ -347,12 +380,6 @@
"createdBy": {
"message": "Luonut"
},
"autoSkip": {
"message": "Ohita automaattisesti"
},
"showSkipNotice": {
"message": "Näytä ilmoitus ohitetun segmentin jälkeen"
},
"keybindCurrentlySet": {
"message": ". Tällä hetkellä se on asetettu näppäimeen:"
},
@@ -544,14 +571,20 @@
"category_music_offtopic_short": {
"message": "Musiikiton"
},
"category_poi_highlight": {
"message": "Kohokohta"
},
"category_poi_highlight_description": {
"message": "Kohta videossa, mitä suurin osa ihmisistä etsivät.\nSamankaltainen \"Video alkaa kohdassa x\" kommenttien kanssa."
},
"category_livestream_messages": {
"message": "Livestream: lahjoitusten/viestien lukeminen"
},
"category_livestream_messages_short": {
"message": "Viestien lukeminen"
},
"disable": {
"message": "Poista käytöstä"
"autoSkip": {
"message": "Ohita automaattisesti"
},
"manualSkip": {
"message": "Manuaalinen ohitus"
@@ -559,9 +592,24 @@
"showOverlay": {
"message": "Näytä liukusäätimessä"
},
"disable": {
"message": "Poista käytöstä"
},
"autoSkip_POI": {
"message": "Ohita automaattisesti alkuun"
},
"manualSkip_POI": {
"message": "Kysy kun video latautuu"
},
"showOverlay_POI": {
"message": "Näytä liukusäätimessä"
},
"autoSkipOnMusicVideos": {
"message": "Ohita kaikki segmentit automaattisesti, kun videossa on \"Musiikiton\" segmentti"
},
"muteSegments": {
"message": "Salli segmentit, jotka mykistävät äänen ohittamisen sijaan"
},
"colorFormatIncorrect": {
"message": "Väriformaattisi on muotoiltu väärin. Sen pitäisi olla 3 tai 6 numeroinen hex-koodi, jossa on # alussa."
},
@@ -601,6 +649,9 @@
"message": "Lähettääksesi segmenttejä \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Varoitus: Tämäntyyppisiä segmenttejä voi olla aktiivisena enintään yksi. Usean lähettäminen aiheuttaa sen, että satunnainen segmentti näytetään."
},
"youMustSelectACategory": {
"message": "Sinun täytyy valita kategoria kaikille segmenteille, joita olet lähettämässä!"
},
@@ -672,6 +723,10 @@
"help": {
"message": "Ohje"
},
"GotIt": {
"message": "Selvä",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Jättäydy pois kaikista tulevista kokeiluista",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +735,79 @@
"message": "Piilota ikuisesti"
},
"warningChatInfo": {
"message": "Sait varoituksen ja et voi lähettää segmenttejä väliaikaisesti. Tämä tarkoittaa, että huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahallisia, ja haluamme vain selventää säännöt. Voit myös liittyä tähän keskusteluun käyttäen discord.gg/SponsorBlock tai matrix.to/#/+sponsor:ajay.app"
"message": "Sait varoituksen ja et voi lähettää segmenttejä väliaikaisesti. Tämä tarkoittaa, että huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahallisia, ja haluamme vain selventää säännöt. Voit myös liittyä tähän keskusteluun käyttäen discord.gg/SponsorBlock tai matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Ääni hylättiin varoituksen takia. Klikkaa avataksesi chatin sen ratkaisemiseksi, tai tule takaisin myöhemmin kun sinulla on siihen aikaa.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Lahjoita"
},
"hideDonationLink": {
"message": "Piilota lahjoituslinkki"
},
"helpPageThanksForInstalling": {
"message": "Kiitos, että asensit SponsorBlockin."
},
"helpPageReviewOptions": {
"message": "Tarkista alla olevat vaihtoehdot kiitos"
},
"helpPageFeatureDisclaimer": {
"message": "Monet ominaisuudet ovat oletuksena pois päältä. Jos haluat ohittaa introt, outrot, käyttää Invidiousta, jne., ota ne käyttöön alhaalla. Voit myös piilottaa/näyttää käyttöliittymäelementtejä."
},
"helpPageHowSkippingWorks": {
"message": "Miten ohittaminen toimii"
},
"helpPageHowSkippingWorks1": {
"message": "Videosegmentit ohitetaan automaattisesti, jos ne löytyvät tietokannasta. Voit avata ponnahdusikkunan klikkaamalla laajennuksen kuvaketta saadaksesi esikatselun siitä, mitä ne ovat."
},
"helpPageHowSkippingWorks2": {
"message": "Aina kun ohitat segmentin, saat ilmoituksen. Jos ajoitus näyttää väärältä, äänestä alaspäin klikkaamalla 👎! Voit myös äänestää ponnahdusikkunassa."
},
"Submitting": {
"message": "Lähettäminen"
},
"helpPageSubmitting1": {
"message": "Lähettäminen voidaan tehdä joko ponnahdusikkunassa painamalla \"Segmentti alkaa nyt\" -painiketta tai videosoittimessa olevilla painikkeilla."
},
"helpPageSubmitting2": {
"message": "Toistopainikkeen klikkaaminen osoittaa segmentin alun ja pysäytyskuvakkeen klikkaaminen sen lopun. Voit valmistella useita sponsoreita ennen kuin painat lähetä. Lähetä-painikkeen klikkaaminen lähettää segmentin. Roskakorin klikkaaminen poistaa."
},
"Editing": {
"message": "Muokkaus"
},
"helpPageEditing1": {
"message": "Jos jokin meni pieleen, voit muokata tai poistaa segmenttisi ylänuolipainikkeen klikkaamisen jälkeen."
},
"helpPageTooSlow": {
"message": "Tämä on liian hidasta"
},
"helpPageTooSlow1": {
"message": "Voit käyttää pikanäppäimiä jos haluat. Paina puolipiste näppäintä merkitäksesi sponsori segmentin alun/lopun, ja paina heittomerkkiä lähettääksesi sen. Nämä voidaan vaihtaa asetuksista. Jos et käytä QWERTYä, sinun varmaan kannattaisi vaihtaa pikanäppäimet."
},
"helpPageCopyOfDatabase": {
"message": "Voinko saada kopion tietokannasta? Mitä tapahtuu, jos katoat?"
},
"helpPageCopyOfDatabase1": {
"message": "Tietokanta on julkinen ja saatavilla osoitteessa"
},
"helpPageCopyOfDatabase2": {
"message": "Lähdekoodi on vapaasti saatavilla. Joten, vaikka jotain tapahtuisi minulle, sinun lähetyksesi eivät katoa."
},
"helpPageNews": {
"message": "Uutiset ja miten se on tehty"
},
"helpPageSourceCode": {
"message": "Mistä voin saada lähdekoodin?"
},
"Credits": {
"message": "Tekijät"
},
"highlightNewFeature": {
"message": "Uutta! Pääse videon asiaan yhdellä klikkauksella uudella kohokohta kategorialla"
},
"LearnMore": {
"message": "Opi lisää"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Sauter"
},
"unmute": {
"message": "Réactiver le son"
},
"paused": {
"message": "En pause"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Erreur de connexion. Code d'erreur : "
},
"wantToSubmit": {
"message": "Voulez-vous soumettre vos segments pour la vidéo"
},
"clearTimes": {
"message": "Effacer les segments"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Choisir un pseudonyme"
},
"copyPublicID": {
"message": "Copier l'ID utilisateur"
},
"discordAdvert": {
"message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Afficher la notification"
},
"showSkipNotice": {
"message": "Notifier après qu'un segment ait été sauté"
},
"noticeVisibilityMode0": {
"message": "Notifications de passage"
},
"noticeVisibilityMode1": {
"message": "Petite notifications de passage pour l'auto skip"
},
"noticeVisibilityMode2": {
"message": "Toute les petites notifications de passage"
},
"noticeVisibilityMode3": {
"message": "Notifications de passage qui disparaissent pour l'auto skip"
},
"noticeVisibilityMode4": {
"message": "Toute les notifications de passage qui disparaissent"
},
"longDescription": {
"message": "SponsorBlock vous permet de passer les sponsors, les intros, les outros, les rappels d'abonnement et autres parties ennuyeuses des vidéos YouTube. SponsorBlock est une extension de navigateur qui permet à n'importe qui de soumettre les temps de début et de fin des segments sponsorisés et d'autres segments de vidéos YouTube. Une fois qu'une personne a soumis ces informations, toutes les autres personnes possédant cette extension passeront directement les segments sponsorisés. Vous pouvez également sauter les sections non musicales des vidéos musicales.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Passer"
},
"mute": {
"message": "Couper le son"
},
"skip_category": {
"message": "Passer {0} ?"
},
"mute_category": {
"message": "Mute {0}?"
},
"skip_to_category": {
"message": "Passer à {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Passé"
"message": "{0} ignoré",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} mis en sourdine",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Sauté à {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Désactiver le passage automatique"
@@ -336,7 +376,7 @@
"message": "Importer/Exporter Votre ID d'Utilisateur"
},
"whatChangeUserID": {
"message": "Cette information doit rester confidentielle. C'est comme un mot de passe et ne devrait pas être partagé avec quiconque. Si quelqu'un l'obtient, il pourra se faire passer pour vous."
"message": "Cela devrait rester privé. C'est comme un mot de passe et ne devrait être partagé avec personne. Si quelqu'un a cela, il peut vous usurper. Si vous recherchez votre identifiant d'utilisateur public, cliquez sur l'icône du presse-papiers dans le popup."
},
"setUserID": {
"message": "Définir \"UserID\""
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Créé par"
},
"autoSkip": {
"message": "Passage automatique"
},
"showSkipNotice": {
"message": "Notifier après qu'un segment ait été sauté"
},
"keybindCurrentlySet": {
"message": ". Il est actuellement réglé sur :"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Hors musique"
},
"category_poi_highlight": {
"message": "Surligner"
},
"category_poi_highlight_description": {
"message": "La partie de la vidéo que la plupart des gens veulent voir. Similaire à \"la vidéo commence à x mins\"."
},
"category_livestream_messages": {
"message": "Stream : lecture de dons et messages"
},
"category_livestream_messages_short": {
"message": "Lecture de messages"
},
"disable": {
"message": "Désactiver"
"autoSkip": {
"message": "Passage automatique"
},
"manualSkip": {
"message": "Passer manuellement"
@@ -559,6 +599,24 @@
"showOverlay": {
"message": "Afficher dans la barre de progression"
},
"disable": {
"message": "Désactiver"
},
"autoSkip_POI": {
"message": "Passer automatiquement au début"
},
"manualSkip_POI": {
"message": "Demander lors du chargement de la vidéo"
},
"showOverlay_POI": {
"message": "Afficher dans la barre de recherche"
},
"autoSkipOnMusicVideos": {
"message": "Ignorer automatiquement tous les segments lorsqu'il y a un segment non-musical"
},
"muteSegments": {
"message": "Autoriser les segments qui bloquent l'audio au lieu de le passer"
},
"colorFormatIncorrect": {
"message": "Votre couleur est mal formatée. Il devrait s'agir d'un code hexadécimal à 3 ou 6 chiffres avec un signe numérique au début."
},
@@ -669,11 +727,91 @@
"help": {
"message": "Aide"
},
"GotIt": {
"message": "Compris",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Se désinscrire de toutes les futures expériences",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Cacher pour toujours"
},
"warningChatInfo": {
"message": "Vous avez reçu un avertissement et ne pouvez pas soumettre des segments temporairement. Cela signifie que nous avons remarqué que vous commettez des erreurs courantes qui ne sont pas malveillantes, et que nous voulons simplement clarifier les règles. Vous pouvez également rejoindre ce chat en utilisant discord.gg/SponsorBlock ou matrix.to/#/+sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Le vote a été rejeté en raison d'un avertissement. Cliquez pour ouvrir un chat et y mettre fin , ou revenez plus tard lorsque vous avez le temps.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Faire un don"
},
"hideDonationLink": {
"message": "Cacher le lien de don"
},
"helpPageThanksForInstalling": {
"message": "Merci d'avoir installé SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Veuillez vérifier les options ci-dessous"
},
"helpPageFeatureDisclaimer": {
"message": "De nombreuses fonctionnalités sont désactivées par défaut. Si vous voulez ignorer les intros, outros, utiliser Invidious, etc., activez-les ci-dessous. Vous pouvez également masquer/afficher les éléments de l'interface."
},
"helpPageHowSkippingWorks": {
"message": "Comment fonctionne le saut d'un segment"
},
"helpPageHowSkippingWorks1": {
"message": "Les segments vidéo seront automatiquement ignorés s'ils sont trouvés dans la base de données. Vous pouvez ouvrir le popup en cliquant sur l'icône de l'extension pour obtenir un aperçu de ces segments."
},
"helpPageHowSkippingWorks2": {
"message": "À chaque fois que vous sautez un segment, vous en serez averti. Si le timing semble incorrect, vous pouvez disliker le segment, vous pouvez également voter dans le popup."
},
"Submitting": {
"message": "Soumission en cours"
},
"helpPageSubmitting1": {
"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."
},
"Editing": {
"message": "Édition en cours"
},
"helpPageEditing1": {
"message": "Si vous avez fait une erreur, vous pouvez modifier ou supprimer vos segments après avoir cliqué sur le bouton avec la flèche vers le haut."
},
"helpPageTooSlow": {
"message": "Ceci est trop lent"
},
"helpPageTooSlow1": {
"message": "Il y a des raccourcis clavier si vous voulez les utiliser. Appuyez sur la touche point-virgule pour indiquer le début / la fin d'un segment sponsorisé et cliquez sur l'apostrophe pour soumettre. Cela peut être modifié dans les options. Si vous n'utilisez pas un clavier QWERTY, vous devriez probablement changer la touche assignée de base."
},
"helpPageCopyOfDatabase": {
"message": "Puis-je obtenir une copie de la base de données ? Que se passe-t-il si vous disparaissez ?"
},
"helpPageCopyOfDatabase1": {
"message": "La base de données est publique et disponible à"
},
"helpPageCopyOfDatabase2": {
"message": "Le code source est librement disponible. Donc, même si il m'arrive quelque chose, vos soumissions ne seront pas perdues."
},
"helpPageNews": {
"message": "Nouvelles et comment elles sont faites"
},
"helpPageSourceCode": {
"message": "Où puis-je obtenir le code source ?"
},
"Credits": {
"message": "Crédits"
},
"highlightNewFeature": {
"message": "Nouveau! Aller à l'essentiel de la vidéo en un clic avec la nouvelle catégorie points essentiels"
},
"LearnMore": {
"message": "En savoir plus"
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "התקבלה שגיאת חיבור. קוד השגיאה: "
},
"wantToSubmit": {
"message": "האם אתה רוצה לדווח עבור סרטון שמספר הזיהוי שלו הוא"
},
"clearTimes": {
"message": "נקה מקטעים"
},
@@ -183,10 +180,10 @@
"createdBy": {
"message": "נוצר על ידי"
},
"autoSkip": {
"message": "דילוג אוטומטי"
},
"add": {
"message": "הוסף"
},
"autoSkip": {
"message": "דילוג אוטומטי"
}
}

View File

@@ -91,9 +91,6 @@
"connectionError": {
"message": "Dogodija se greška u povezivanju. Kod pogreške: "
},
"wantToSubmit": {
"message": "Želiš li unijeti za video id"
},
"clearTimes": {
"message": "Očisti isječke"
},
@@ -131,6 +128,9 @@
"Options": {
"message": "Opcije"
},
"showSkipNotice": {
"message": "Pokaži obavijest nakon preskakanja isječka"
},
"website": {
"message": "Web-stranica",
"description": "Used on Firefox Store Page"
@@ -158,9 +158,6 @@
"skip_category": {
"message": "Preskočiti {0}?"
},
"skipped": {
"message": "Preskočeno"
},
"disableAutoSkip": {
"message": "Deaktiviraj automatsko preskakanje"
},
@@ -179,9 +176,6 @@
"hoursLower": {
"message": "h"
},
"whatChangeUserID": {
"message": "Ovo bi trebalo ostati privatno. slično je lozinki i ne bi se smjelo dijeliti ni s kime. Ako netko ovo ima, mogu se lažno predstavljati kao ti."
},
"setUserID": {
"message": "Postavi UserID"
},
@@ -191,12 +185,6 @@
"createdBy": {
"message": "Izradio"
},
"autoSkip": {
"message": "Automatsko preskakanje"
},
"showSkipNotice": {
"message": "Pokaži obavijest nakon preskakanja isječka"
},
"keybindCurrentlySet": {
"message": ". Trenutno je postavljeno na:"
},
@@ -290,6 +278,9 @@
"category_music_offtopic_short": {
"message": "Ne-glazbeni"
},
"autoSkip": {
"message": "Automatsko preskakanje"
},
"manualSkip": {
"message": "Ručno preskakanje"
},

View File

@@ -100,9 +100,6 @@
"connectionError": {
"message": "Kapcsolódási probléma merült fel. Error kód: "
},
"wantToSubmit": {
"message": "Szeretné beküldeni a szegmenst ehhez a videóhoz:"
},
"clearTimes": {
"message": "Szegmensek törlése"
},
@@ -221,6 +218,9 @@
"showNotice": {
"message": "Értesítés megjelenítése ismét"
},
"showSkipNotice": {
"message": "Jelezzen, ha egy szegmens át lett ugorva"
},
"longDescription": {
"message": "A SponsorBlock-al átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé tesz bárkit arra, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Ha megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a zene videók nem-zene részei is átugorhatóak.",
"description": "Full description of the extension on the store pages."
@@ -278,9 +278,6 @@
"skip_category": {
"message": "Átugorja ezt: {0}?"
},
"skipped": {
"message": "Átugorva"
},
"disableAutoSkip": {
"message": "Auto átugrás kikapcsolása"
},
@@ -329,9 +326,6 @@
"changeUserID": {
"message": "UserID importálása / exportálása"
},
"whatChangeUserID": {
"message": "Ezt titokban kell tartani. Olyan, mint egy jelszó, nem szabad senkivel megosztania. Ha valakinek megvan, megszemélyesítheti Önt."
},
"setUserID": {
"message": "UserID beállítása"
},
@@ -341,12 +335,6 @@
"createdBy": {
"message": "Készítette"
},
"autoSkip": {
"message": "Auto átugrás"
},
"showSkipNotice": {
"message": "Jelezzen, ha egy szegmens át lett ugorva"
},
"keybindCurrentlySet": {
"message": ". Jelenleg erre van állítva:"
},
@@ -437,6 +425,9 @@
"preview": {
"message": "Előnézet"
},
"unsubmitted": {
"message": "Nincs beküldve"
},
"inspect": {
"message": "Megvizsgál"
},
@@ -501,6 +492,9 @@
"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_preview": {
"message": "Előzetes/Ismétlés"
},
"category_music_offtopic": {
"message": "Zene: nem-zene szegmens"
},
@@ -513,8 +507,8 @@
"category_livestream_messages_short": {
"message": "Üzenet beolvasása"
},
"disable": {
"message": "Kikapcsol"
"autoSkip": {
"message": "Auto átugrás"
},
"manualSkip": {
"message": "Átugrás manuálisan"
@@ -522,6 +516,9 @@
"showOverlay": {
"message": "Megjelenítés a keresősávban"
},
"disable": {
"message": "Kikapcsol"
},
"colorFormatIncorrect": {
"message": "A szín helytelenül van formázva. Egy 3 vagy 6 számjegyből álló hex kódnak kell lennie egy kettőskereszttel az elején."
},
@@ -600,5 +597,33 @@
},
"help": {
"message": "Segítség"
},
"GotIt": {
"message": "Értettem",
"description": "Used as the button to dismiss a tooltip"
},
"hideForever": {
"message": "Eltüntetés örökre"
},
"Donate": {
"message": "Támogatás"
},
"Submitting": {
"message": "Küldés"
},
"Editing": {
"message": "Szerkesztés"
},
"helpPageTooSlow": {
"message": "Ez túl lassú"
},
"helpPageNews": {
"message": "Hírek és hogyan készül"
},
"Credits": {
"message": "Készítők"
},
"LearnMore": {
"message": "Tudj meg többet"
}
}

View File

@@ -97,9 +97,6 @@
"connectionError": {
"message": "Kesalahan koneksi terjadi. Kode kesalahan: "
},
"wantToSubmit": {
"message": "Apakah anda ingin mengirim untuk id video"
},
"clearTimes": {
"message": "Hapus Segmen"
},
@@ -218,6 +215,9 @@
"showNotice": {
"message": "Tampilkan Pemberitahuan Lagi"
},
"showSkipNotice": {
"message": "Tampilkan pemberitahuan setelah melewati segmen"
},
"longDescription": {
"message": "SponsorBlock membuat anda melewati sponsor, intro, outro, pengingat berlangganan dan segmen mengganggu lainnya di video YouTube. SponsorBlock adalah ekstensi browser crowdsourced yang membolehkan siapa saja mengirim waktu awal dan akhir dari segmen sponsor dan segmen video YouTube lainnya. Setelah seseorang mengirim informasi ini, orang lain yang memakai ekstensi ini akan melewati segmen sponsor di video yang sama. Anda juga dapat melewati bagian non-musik di musik video.",
"description": "Full description of the extension on the store pages."
@@ -278,8 +278,17 @@
"skip_category": {
"message": "Lewati {0}?"
},
"skip_to_category": {
"message": "Lompat ke {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Dilewati"
"message": "{0} dilewati",
"description": "Example: Sponsor Skipped"
},
"skipped_to_category": {
"message": "Melewati ke {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Nonaktifkan Lewati Otomatis"
@@ -329,9 +338,6 @@
"changeUserID": {
"message": "Impor/Ekspor UserID"
},
"whatChangeUserID": {
"message": "Ini sebaiknya dirahasiakan. Ini terlihat seperti password dan sebaiknya tidak dibagikan ke orang lain. Jika seseorang mempunyai ini, dia dapat berpura-pura menjadi anda."
},
"setUserID": {
"message": "Atur UserID"
},
@@ -341,15 +347,12 @@
"createdBy": {
"message": "Dibuat Oleh"
},
"autoSkip": {
"message": "Lewati Otomatis"
},
"showSkipNotice": {
"message": "Tampilkan pemberitahuan setelah melewati segmen"
},
"keybindCurrentlySet": {
"message": ". Saat ini diatur pada:"
},
"supportOtherSites": {
"message": "Dukung Situs Youtube Pihak Ketiga"
},
"optionsInfo": {
"message": "Aktifkan dukungan Invidious, nonaktifkan lewati otomatis, tombol sembunyi dan lainnya."
},
@@ -434,6 +437,9 @@
"preview": {
"message": "Pratinjau"
},
"unsubmitted": {
"message": "Belum dikirim"
},
"inspect": {
"message": "Inspeksi"
},
@@ -498,6 +504,12 @@
"category_outro_description": {
"message": "Kredit atau saat kartu akhir YouTube muncul. Tidak untuk kesimpulan dengan informasi."
},
"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_music_offtopic": {
"message": "Musik: Bagian Non-Musik"
},
@@ -513,8 +525,8 @@
"category_livestream_messages_short": {
"message": "Membaca Pesan Chat"
},
"disable": {
"message": "Nonaktif"
"autoSkip": {
"message": "Lewati Otomatis"
},
"manualSkip": {
"message": "Lewati Manual"
@@ -522,9 +534,25 @@
"showOverlay": {
"message": "Tampilkan Di Bilah Waktu"
},
"disable": {
"message": "Nonaktif"
},
"manualSkip_POI": {
"message": "Tanya saat video dimuat"
},
"showOverlay_POI": {
"message": "Tampilkan di Bilah Waktu"
},
"autoSkipOnMusicVideos": {
"message": "Lewati semua segmen secara otomatis ketika ada segmen non-music"
},
"colorFormatIncorrect": {
"message": "Warna anda tidak diformat dengan benar. Harusnya terdiri dari 3 atau 6 digit kode heksa dengan tagar di awal."
},
"previewColor": {
"message": "Warna yang Belum Dikirim",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Warna Bilah Waktu"
},
@@ -625,7 +653,29 @@
"categoryUpdate2": {
"message": "Buka opsi untuk melewati intro, outro, merch, dll."
},
"help": {
"message": "Bantuan"
},
"GotIt": {
"message": "Mengerti",
"description": "Used as the button to dismiss a tooltip"
},
"hideForever": {
"message": "Sembunyikan selamanya"
},
"Donate": {
"message": "Donasi"
},
"hideDonationLink": {
"message": "Sembunyikan tautan donasi"
},
"helpPageThanksForInstalling": {
"message": "Terima kasih telah menginstall SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Haram ditinjau opsi di bawah ini"
},
"helpPageHowSkippingWorks": {
"message": "Cara kerja melewati segmen"
}
}

View File

@@ -4,20 +4,20 @@
"description": "Name of the extension."
},
"Description": {
"message": "Salta sponsorizzazioni, implorazioni di iscrizione ai canali e molto altro sui video di YouTube. Segnala gli sponsor sui video che guardi per salvare il tempo ad altri.",
"message": "Salta sponsorizzazioni, richieste d'iscrizione ai canali e molto altro sui video di YouTube. Segnala gli sponsor sui video che guardi per salvare il tempo agli altri.",
"description": "Description of the extension."
},
"400": {
"message": "Richiesta non valida"
},
"429": {
"message": "Stai inviando troppi spezzoni per questo video, sei sicuro che ce ne siano così tanti?"
"message": "Stai inviando troppi segmenti per questo video, sei sicuro che ce ne siano così tanti?"
},
"409": {
"message": "Questo spezzone è già stato inviato"
"message": "Questo è già stato inviato"
},
"channelWhitelisted": {
"message": "Canale aggiunto alla whitelist!"
"message": "Canale aggiunto alla lista delle esclusioni!"
},
"Segment": {
"message": "segmento"
@@ -52,11 +52,14 @@
"reskip": {
"message": "Salta ancora"
},
"unmute": {
"message": "Riattiva il microfono"
},
"paused": {
"message": "In pausa"
},
"manualPaused": {
"message": "Timer Fermato"
"message": "Timer fermato"
},
"confirmMSG": {
"message": "\n\nPer modificare o eliminare valori specifici, premi il pulsante delle informazioni o apri il popup cliccando l'icona dell'estensione nell'angolo in alto a destra."
@@ -65,7 +68,7 @@
"message": "Sei sicuro di volerlo cancellare?\n\n"
},
"Unknown": {
"message": "Si è verificato un errore durante l'invio dello spezzone sponsorizzato, per favore riprova più tardi."
"message": "Si è verificato un errore durante l'invio del segmento, per favore riprova più tardi."
},
"sponsorFound": {
"message": "Questo video ha dei segmenti nel database!"
@@ -74,10 +77,10 @@
"message": "Nessun segmento trovato"
},
"sponsorStart": {
"message": "Il Segmento Inizia Ora"
"message": "Il segmento inizia qui"
},
"sponsorEnd": {
"message": "Il Segmento Termina Ora"
"message": "Il segmento finisce ora"
},
"sponsorCancel": {
"message": "Annulla Creazione del Segmento"
@@ -89,7 +92,7 @@
"message": "Ricarica i segmenti"
},
"success": {
"message": "Successo!"
"message": "Ha funzionato!"
},
"voted": {
"message": "Votato!"
@@ -100,20 +103,17 @@
"connectionError": {
"message": "Si è verificato un errore durante la connessione. Codice errore: "
},
"wantToSubmit": {
"message": "Desideri inviare per l'id video"
},
"clearTimes": {
"message": "Pulisci Segmenti"
"message": "Rimuovi i segmenti"
},
"openPopup": {
"message": "Apri il Popup di SponsorBlock"
"message": "Apri il popup di SponsorBlock"
},
"closePopup": {
"message": "Chiudi il popup"
},
"SubmitTimes": {
"message": "Invia Segmenti"
"message": "Invia i segmenti"
},
"submitCheck": {
"message": "Sei sicuro di volerlo inviare?"
@@ -125,7 +125,7 @@
"message": "Rimuovi il canale dalle eccezioni"
},
"voteOnTime": {
"message": "Vota un Segmento"
"message": "Vota un segmento"
},
"Submissions": {
"message": "Contributi"
@@ -147,19 +147,22 @@
"message": "Suggerimento: puoi configurare dei comandi rapidi nelle opzioni"
},
"clearTimesButton": {
"message": "Cancella Minutaggi"
"message": "Cancella minutaggio"
},
"submitTimesButton": {
"message": "Invia Minutaggi"
"message": "Invia minutaggio"
},
"publicStats": {
"message": "Viene utilizzato nelle pagine delle statistiche pubbliche che mostrano quanto hai contribuito. Vedi"
"message": "Questo è usato nelle pagine pubbliche delle statistiche per mostrare quanto hai contribuito. Vedilo"
},
"Username": {
"message": "Nome utente"
},
"setUsername": {
"message": "Imposta Username"
"message": "Imposta nome utente"
},
"copyPublicID": {
"message": "Copia UserID Pubblico"
},
"discordAdvert": {
"message": "Entra nel server Discord ufficiale per darci suggerimenti e feedback!"
@@ -171,19 +174,19 @@
"message": "Opzioni"
},
"showButtons": {
"message": "Mostra i Pulsanti nel Lettore di YouTube"
"message": "Mostra i pulsanti sul video"
},
"hideButtons": {
"message": "Nascondi i Pulsanti nel Lettore di YouTube"
"message": "Nascondi i pulsanti sul video"
},
"hideButtonsDescription": {
"message": "Nasconde i pulsanti che appaiono nel lettore di YouTube per inviare spezzoni sponsorizzati. Capisco che può essere fastidioso per alcune\n persone. Invece di utilizzare quei pulsanti, è possibile utilizzare questo popup per inviare gli spezzoni sponsorizzati. Per nascondere l'avviso che appare, \nusa il bottone \"Non mostrare più\" nell'avviso. Potrai sempre abilitare nuovamente queste impostazioni in futuro."
"message": "Nasconde i pulsanti che appaiono sul video per inviare i segmenti da nascondere."
},
"showInfoButton": {
"message": "Mostra il Pulsante Informazioni nel Lettore di YouTube"
"message": "Mostra il pulsante delle informazioni sopra al video"
},
"hideInfoButton": {
"message": "Nascondi il Pulsante Informazioni nel Lettore di YouTube"
"message": "Nascondi il pulsante d'informazioni sopra al video"
},
"whatInfoButton": {
"message": "Questo è il pulsante che apre un popup nella pagina YouTube."
@@ -192,19 +195,19 @@
"message": "Nascondi in automatico il Pulsante di Informazioni"
},
"hideDeleteButton": {
"message": "Nascondi il Pulsante Elimina nel Lettore di YouTube"
"message": "Nascondi il pulsante elimina"
},
"showDeleteButton": {
"message": "Mostra il Pulsante Elimina nel Lettore di YouTube"
"message": "Mostra il pulsante elimina"
},
"whatDeleteButton": {
"message": "Questo è il pulsante che ti permette di cancellare tutti gli spezzoni sponsorizzati nel lettore di YouTube."
"message": "Questo è il pulsante che ti permette di cancellare tutti i segmenti non inviati del video attuale."
},
"enableViewTracking": {
"message": "Attiva Monitoraggio Salti"
"message": "Attiva il conteggio dei salti"
},
"whatViewTracking": {
"message": "Questa funzionalità tiene traccia dei segmenti che hai saltato, per far sapere agli utenti quanto il loro contributo abbia aiutato gli altri e sia stato utilizzato come metrica insieme ai voti positivi, per garantire che lo spam non entri nel database. L'estensione invierà un messaggio al server ogni volta che salterai un segmento. Si spera che la maggior parte delle persone non modifichino questa impostazione, in modo da non intaccare l'accuratezza dei numeri di visualizzazione. :)"
"message": "Questa funzionalità tiene traccia dei segmenti che hai saltato per far sapere agli utenti quanto il loro contributo abbia aiutato gli altri e anche come statistica, insieme ai voti positivi, per garantire che lo spam non entri nel database. L'estensione invierà un messaggio al server ogni volta che salterai un segmento. Si spera che la maggior parte delle persone non modifichino questa impostazione, in modo da non intaccare l'accuratezza dei numeri di visualizzazione. :)"
},
"enableViewTrackingInPrivate": {
"message": "Abilita il conteggio dei salti nelle schede private/anonime"
@@ -216,24 +219,42 @@
"message": "Invece di richiedere i segmenti dal server utilizzando l'ID del video, viene inviato un hash dei primi 4 caratteri dell'ID. Questo server invierà i dati per tutti i video con hash simili."
},
"enableRefetchWhenNotFound": {
"message": "Ricarica I Segmenti Su Nuovi Video"
"message": "Ricarica i segmenti su nuovi video"
},
"whatRefetchWhenNotFound": {
"message": "Se il video è nuovo, e non risultano esserci segmenti, continueremo a cercarne di nuovi ogni pochi minuti."
},
"showNotice": {
"message": "Mostra di Nuovo l'Avviso"
"message": "Mostra di nuovo l'avviso"
},
"showSkipNotice": {
"message": "Mostra Avviso Dopo Aver Saltato un Segmento"
},
"noticeVisibilityMode0": {
"message": "Salta Avvisi di Dimensioni Complete"
},
"noticeVisibilityMode1": {
"message": "Piccoli Salta Avvisi per Salto Automatico"
},
"noticeVisibilityMode2": {
"message": "Tutti i Piccoli Salta Avvisi"
},
"noticeVisibilityMode3": {
"message": "Salta Avvisi Offuscati per Salto Automatico"
},
"noticeVisibilityMode4": {
"message": "Tutti i Salta Avvisi Offuscati"
},
"longDescription": {
"message": "SponsorBlock ti consente di saltare sponsorizzazioni, introduzioni, conclusioni, promemoria di iscrizione e altre componenti fastidiose dei video su YouTube. SponsorBlock è un'estensione per browser in crowdsourcing, che consente a chiunque di inviare l'ora di inizio e di fine dei segmenti sponsorizzati e altri segmenti video su YouTube. Quando una persona invia queste informazioni, chiunque altro in possesso di questa estensione sarà in grado di saltare direttamente il segmento sponsorizzato. È possibile saltare anche le sezioni non musicali dei video musicali.",
"message": "SponsorBlock ti consente di saltare sponsorizzazioni, introduzioni, conclusioni, promemoria di iscrizione e altri elementi fastidiosi dai video YouTube. SponsorBlock è un'estensione per browser di crowdsourcing, cioè che consente a chiunque di inviare l'ora di inizio e di fine dei segmenti sponsorizzati e di altro tipo. Quando una persona invia queste informazioni, chiunque altro in possesso di questa estensione sarà in grado di saltare automaticamente il segmento sponsorizzato. È possibile saltare anche le sezioni non musicali dei video musicali.",
"description": "Full description of the extension on the store pages."
},
"website": {
"message": "Sito Web",
"message": "Sito web",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "Codice Sorgente",
"message": "Codice sorgente",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
@@ -257,7 +278,7 @@
"message": "Seleziona un tasto premendolo sulla tastiera"
},
"keybindDescriptionComplete": {
"message": "L'associazione di tasti è stata impostata a: "
"message": "Il comando rapido è stato impostato come: "
},
"0": {
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
@@ -281,11 +302,30 @@
"skip": {
"message": "Salta"
},
"mute": {
"message": "Silenzia"
},
"skip_category": {
"message": "Vuoi saltare {0}?"
},
"mute_category": {
"message": "Silenziare {0}?"
},
"skip_to_category": {
"message": "Saltare a {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Saltato"
"message": "{0} Saltato",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} silenziato",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Saltato a {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Disabilita Salto Automatico"
@@ -336,7 +376,7 @@
"message": "Importa/Esporta Il Tuo ID Utente"
},
"whatChangeUserID": {
"message": "Questo dovrebbe essere tenuto privato. Questo è come una password e non dovrebbe essere condiviso con nessuno. Se qualcuno ha questo, ti può impersonare."
"message": "Questo dovrebbe esser mantenuto privato. È come una password e non dovrebbe esser condiviso con nessuno. Se qualcuno lo possiede, può impersonarti. Se stai cercando il tuo userID pubblico, clicca l'icona degli appunti nel popup."
},
"setUserID": {
"message": "Imposta ID utente"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Creato da"
},
"autoSkip": {
"message": "Salta Automaticamente"
},
"showSkipNotice": {
"message": "Mostra Avviso Dopo Aver Saltato un Segmento"
},
"keybindCurrentlySet": {
"message": ". Attualmente è impostato su:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Non-Musicale"
},
"category_poi_highlight": {
"message": "Evidenzia"
},
"category_poi_highlight_description": {
"message": "La parte del video che gran parte delle persone stanno cercando. Simile ai commenti \"Il video inizia a x\"."
},
"category_livestream_messages": {
"message": "Livestream: Donazione/Letture dei Messaggi"
},
"category_livestream_messages_short": {
"message": "Lettura Messaggi"
},
"disable": {
"message": "Disattiva"
"autoSkip": {
"message": "Salta Automaticamente"
},
"manualSkip": {
"message": "Salto Manuale"
@@ -559,6 +599,24 @@
"showOverlay": {
"message": "Mostra nella Barra di Ricerca"
},
"disable": {
"message": "Disattiva"
},
"autoSkip_POI": {
"message": "Salta automaticamente all'avvio"
},
"manualSkip_POI": {
"message": "Chiedi quando il video carica"
},
"showOverlay_POI": {
"message": "Mostra Nella Barra di Ricerca"
},
"autoSkipOnMusicVideos": {
"message": "Salta automaticamente tutti i segmenti quando c'è un segmento non musicale"
},
"muteSegments": {
"message": "Silenzia i segmenti invece di saltarli, quando possibile"
},
"colorFormatIncorrect": {
"message": "Il tuo colore è formattato in modo errato. Dovrebbe essere un codice esadecimale a 3 o 6 cifre con un segno numerico iniziale."
},
@@ -598,6 +656,9 @@
"message": "Per inviare segmenti della categoria \"{0}\", è necessario abilitarlo nelle opzioni. Sarai reindirizzato alle opzioni.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Attenzione: questo tipo di segmento può essere presente una sola volta. Inviarne più di uno causerà la visualizzazione casuale di uno solo."
},
"youMustSelectACategory": {
"message": "Devi selezionare una categoria per tutti i segmenti che stai inviando!"
},
@@ -669,6 +730,10 @@
"help": {
"message": "Aiuto"
},
"GotIt": {
"message": "Capito",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Disiscriviti dagli esperimenti futuri",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -677,10 +742,79 @@
"message": "Nascondi per sempre"
},
"warningChatInfo": {
"message": "Hai ricevuto un ammonimento and non puoi inviare segmenti temporaneamente. Ciò significa che abbiamo notato che stavi commettendo alcuni errori comuni senza scopo malevolo, e vogliamo che tu ricontrollassi le regole. Puoi anche partecipare a questa chat su discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
"message": "Hai ricevuto un avvertimento e non puoi temporaneamente inviare i segmenti. Questo significa che abbiamo notato che stavi commettendo alcuni errori comuni non malevoli, e vogliamo solo chiarire le regole. Puoi anche unirti a questa chat usando discord.gg/SponsorBlock o matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Voto rifiutato a causa di un ammonimento. Clicca per aprire una chat per risolverlo, oppure torna dopo quando hai tempo.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Dona"
},
"hideDonationLink": {
"message": "Nascondi Link di Donazione"
},
"helpPageThanksForInstalling": {
"message": "Grazie per aver installato SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Sei pregato di revisionare le seguenti opzioni"
},
"helpPageFeatureDisclaimer": {
"message": "Molte funzionalità sono disabilitate di default. Se vuoi saltare intro, outro, usare Invidious, etc. abilitale sotto. Puoi anche nascondere/mostrare gli elementi dell'UI."
},
"helpPageHowSkippingWorks": {
"message": "Come funziona il salto"
},
"helpPageHowSkippingWorks1": {
"message": "I segmenti video saranno automaticamente ignorati se sono trovati nel database. Puoi aprire il popup cliccando l'icona dell'estensione per ottenere un'anteprima di cosa sono."
},
"helpPageHowSkippingWorks2": {
"message": "Ogni volta che salti un segmento, sarai avvisato. Se il momento sembra sbagliato, vota in negativo cliccando downvote! Puoi anche votare nel popup."
},
"Submitting": {
"message": "Inviando"
},
"helpPageSubmitting1": {
"message": "L'invio può esser eseguito nel popup cliccando il pulsante il \"Segmento Inizia Ora\" o nel lettore video con i pulsanti sul lettore."
},
"helpPageSubmitting2": {
"message": "Cliccare il pulsante di riproduzione indica l'inizio di un segmento e cliccare l'icona di interruzione indica la fine. Puoi preparare più sponsor prima di cliccare invio. Cliccare il pulsante carica invierà. Cliccare il cestino eliminerà."
},
"Editing": {
"message": "Modifica"
},
"helpPageEditing1": {
"message": "Se hai fatto casino, puoi modificare o eliminare i tuoi segmenti dopo aver cliccato il pulsante della freccia in su."
},
"helpPageTooSlow": {
"message": "Questo è troppo lento"
},
"helpPageTooSlow1": {
"message": "Esistono dei tasti di scelta rapida se desideri usarli. Premi il tasto del punto e virgola per indicare l'inizio/la fine di un segmento dello sponsor e clicca l'apostrofo per inviare. Questi sono modificabili nelle opzioni. Se non usi QWERTY, dovresti probabilmente cambiare l'associazione dei tasti."
},
"helpPageCopyOfDatabase": {
"message": "Posso ottenere una copia del Database? Che succede se scompari?"
},
"helpPageCopyOfDatabase1": {
"message": "Il database è pubblico e disponibile a"
},
"helpPageCopyOfDatabase2": {
"message": "Il codice sorgente è liberamente disponibile. Quindi, anche se mi succede qualcosa, i tuoi contributi non saranno persi."
},
"helpPageNews": {
"message": "Notizie e come è fatto"
},
"helpPageSourceCode": {
"message": "Dove posso ottenere il codice sorgente?"
},
"Credits": {
"message": "Crediti"
},
"highlightNewFeature": {
"message": "Novità! Vai al punto del video con un click con la nuova categoria d'evidenziazione"
},
"LearnMore": {
"message": "Scopri di Più"
}
}

View File

@@ -100,9 +100,6 @@
"connectionError": {
"message": "接続エラーが発生しました。 エラーコード: "
},
"wantToSubmit": {
"message": "次の動画IDで提出します:"
},
"clearTimes": {
"message": "セグメントを消去"
},
@@ -137,17 +134,17 @@
"message": "リーダーボード"
},
"recordTimesDescription": {
"message": "送信"
"message": "提出"
},
"submissionEditHint": {
"message": "提出をクリックするとセクション編集画面が表示されます",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "ヒント: オプションから提出時のキーバインドを設定できます"
"message": "心得: 利用者設定で提出時のキーバインドを設定できます"
},
"clearTimesButton": {
"message": "時間をクリア"
"message": "時間を消去"
},
"submitTimesButton": {
"message": "時間を提出"
@@ -224,6 +221,24 @@
"showNotice": {
"message": "再度通知を表示する"
},
"showSkipNotice": {
"message": "セグメントがスキップされた後に通知を表示する"
},
"noticeVisibilityMode0": {
"message": "飛び越し通知(全体)"
},
"noticeVisibilityMode1": {
"message": "自動飛び越し通知(小)"
},
"noticeVisibilityMode2": {
"message": "すべての飛び越し通知(小)"
},
"noticeVisibilityMode3": {
"message": "表示の終了した自動飛び越し通知"
},
"noticeVisibilityMode4": {
"message": "表示の終了した全ての飛び越し通知"
},
"longDescription": {
"message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。",
"description": "Full description of the extension on the store pages."
@@ -284,8 +299,17 @@
"skip_category": {
"message": "{0} をスキップしますか?"
},
"skip_to_category": {
"message": "{0}まで飛び越しますか?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "スキップしました"
"message": "{0}を飛び越しました",
"description": "Example: Sponsor Skipped"
},
"skipped_to_category": {
"message": "{0}まで飛び越しました",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "自動スキップを無効にする"
@@ -335,9 +359,6 @@
"changeUserID": {
"message": "ユーザーIDのインポート/エクスポート"
},
"whatChangeUserID": {
"message": "ユーザーIDは公開しないでください。これはパスワードのようなもので誰とも共有するべきではありません。 他の誰かが知った場合、あなたになりすます可能性があります。"
},
"setUserID": {
"message": "ユーザーIDを設定"
},
@@ -347,12 +368,6 @@
"createdBy": {
"message": "作成者:"
},
"autoSkip": {
"message": "自動スキップ"
},
"showSkipNotice": {
"message": "セグメントがスキップされた後に通知を表示する"
},
"keybindCurrentlySet": {
"message": "。現在の設定は:"
},
@@ -544,14 +559,20 @@
"category_music_offtopic_short": {
"message": "音楽以外の部分"
},
"category_poi_highlight": {
"message": "強調表示"
},
"category_poi_highlight_description": {
"message": "ほとんどの人が必要としている動画の箇所。「xx:xx 開始」というようなコメントと類似。"
},
"category_livestream_messages": {
"message": "ライブ配信: 寄付/メッセージの読み上げ"
},
"category_livestream_messages_short": {
"message": "寄付などの読み上げ"
},
"disable": {
"message": "無効"
"autoSkip": {
"message": "自動スキップ"
},
"manualSkip": {
"message": "手動スキップ"
@@ -559,6 +580,18 @@
"showOverlay": {
"message": "シークバーに表示"
},
"disable": {
"message": "無効"
},
"autoSkip_POI": {
"message": "動画の開始時刻まで飛び越し"
},
"manualSkip_POI": {
"message": "動画を読み込んだ際に確認する"
},
"showOverlay_POI": {
"message": "シークバーに表示"
},
"autoSkipOnMusicVideos": {
"message": "非音楽区域がある場合,全区域を自動的に飛び越す"
},
@@ -672,6 +705,10 @@
"help": {
"message": "ヘルプ"
},
"GotIt": {
"message": "了解",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "実験的機能をすべて無効にする",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +717,55 @@
"message": "二度と表示しない"
},
"warningChatInfo": {
"message": "警告のため,区域の送信が一時的に禁止されています。これは利用者さまが間違いを犯されているというこちらどもの判断ではありますが,この間違いが悪意あるものとは思っておりません。単に,利用者さまに区域送信における規則を知っていただきたいだけです。連絡先: discord.gg/SponsorBlockmatrix.to/#/+sponsor:ajay.app"
"message": "警告のため,区域の送信が一時的に禁止されています。これは利用者さまが間違いを犯されているというこちらどもの判断ではありますが,この間違いが悪意あるものとは思っておりません。単に,利用者さまに区域送信における規則を知っていただきたいだけです。連絡先: discord.gg/SponsorBlockmatrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "警告により投票が拒否されました。クリックして運営に連絡するか,少し時間を置いてからやりなおしてください。",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "寄付"
},
"hideDonationLink": {
"message": "寄付のお願いを表示しない"
},
"helpPageThanksForInstalling": {
"message": "SponsorBlockを導入いただきありがとうございます。"
},
"helpPageReviewOptions": {
"message": "以下の設定を確認してください"
},
"helpPageFeatureDisclaimer": {
"message": "多くの機能は既定では無効となっています。動画の導入部や最後の余計な部分を飛び越したい場合は「非本質的な内容」を飛び越すようにしてください。またUI要素の表示・非表示を切り替えることもできます。"
},
"helpPageHowSkippingWorks": {
"message": "飛び越しの仕組み"
},
"helpPageHowSkippingWorks1": {
"message": "データベースにある動画区域が自動的に飛び越されます。この拡張機能のアイコンをクリックすると,区域の位置や範囲を確かめることができます。"
},
"helpPageHowSkippingWorks2": {
"message": "区域を飛び越すたびに通知されます。区域の範囲がおかしいと思ったら,その区域を低評価してください。ポップアップ画面でも同様に投票ができます。"
},
"Submitting": {
"message": "提出中"
},
"Editing": {
"message": "編集中"
},
"helpPageCopyOfDatabase2": {
"message": "ソースコードは自由に利用できます。運営になにがあろうとも,あなたの貢献(提出された区域)が失われることはありません。"
},
"helpPageNews": {
"message": "お知らせと作成方法"
},
"helpPageSourceCode": {
"message": "ソースコードの入手先"
},
"Credits": {
"message": "謝辞"
},
"LearnMore": {
"message": "さらに詳しく"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "다시 건너뛰기"
},
"unmute": {
"message": "음소거 해제"
},
"paused": {
"message": "정지됨"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "서버 오류가 발생하였습니다. 오류 코드: "
},
"wantToSubmit": {
"message": "영상 id를 제출하시겠습니까"
},
"clearTimes": {
"message": "구간 제거"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "사용자 이름 설정"
},
"copyPublicID": {
"message": "공개 사용자 ID 복사"
},
"discordAdvert": {
"message": "공식 디스코드 서버에 들어와서 기능 제안을 해주시거나 피드백을 남겨주세요!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "알림 다시 보여주기"
},
"showSkipNotice": {
"message": "구간을 건너뛴 후 알림 표시"
},
"noticeVisibilityMode0": {
"message": "건너뛰기 알림 크게"
},
"noticeVisibilityMode1": {
"message": "자동 건너뛰기에 대해서는 건너뛰기 알림 작게"
},
"noticeVisibilityMode2": {
"message": "모든 건너뛰기 알림 작게"
},
"noticeVisibilityMode3": {
"message": "자동 건너뛰기에 대해서는 건너뛰기 알림 숨김"
},
"noticeVisibilityMode4": {
"message": "모든 건너뛰기 알림 숨김"
},
"longDescription": {
"message": "SponsorBlock을 사용하면 영상에서 스폰서 광고, 인트로 영상, 아웃트로 영상, 구독 광고와 그 외 쓸데없는 부분을 즉시 건너뛸 수 있습니다. SponsorBlock은 모든 사람들이 참여하는 브라우저 확장 기능으로 확장 기능 사용자는 스폰서 광고 또는 다른 광고의 시작 시간과 끝 시간을 확인하여 서버로 전송할 수 있습니다. 이러한 정보가 전송되면 그 영상을 보는 다른 사용자들은 광고 구간이 나오기 전에 자동으로 건너뛸 수 있습니다. SponsorBlock을 사용하면 뮤직 비디오에서 음악이나 노래가 아닌 구간도 건너뛸 수 있습니다.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "스킵"
},
"mute": {
"message": "음소거"
},
"skip_category": {
"message": "{0} 을(를) 건너뛰겠어요?"
},
"mute_category": {
"message": "{0} 카테고리를 음소거하시겠습니까?"
},
"skip_to_category": {
"message": "{0}(으)로 건너뛰겠어요?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "스킵됨"
"message": "{0} 건너뜀",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} 음소거됨",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "{0}(으)로 건너뛰었습니다",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "자동 스킵 비활성화"
@@ -336,7 +376,7 @@
"message": "사용자 ID 가져오기/내보내기"
},
"whatChangeUserID": {
"message": "이 정보는 다른 사람에게 공개하지 마세요. 이것은 비밀번호처럼 절대로 알려주면 안되는 정보입니다. 다른 사람이 이 정보를 습득했을 경우 사용자를 사칭할 수도 있습니다."
"message": "이 정보는 다른 사람에게 공개하지 마세요. 이것은 비밀번호처럼 절대로 알려주면 안되는 정보입니다. 다른 사람이 이 정보를 습득했을 경우 사용자를 사칭할 수도 있습니다. 혹시 공개 사용자 ID를 찾고 있다면, 팝업 내 클립보드 아이콘을 누르시기 바랍니다."
},
"setUserID": {
"message": "사용자ID 설정"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "개발자: "
},
"autoSkip": {
"message": "자동으로 건너뛰기"
},
"showSkipNotice": {
"message": "구간을 건너뛴 후 알림 표시"
},
"keybindCurrentlySet": {
"message": ". 현재 다음으로 설정되어 있습니다:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "음악이 아닌 구간"
},
"category_poi_highlight": {
"message": "하이라이트"
},
"category_poi_highlight_description": {
"message": "대부분의 사람들이 찾는 동영상의 파트를 말합니다. \"바쁘신 분들은...\" 댓글과 유사합니다."
},
"category_livestream_messages": {
"message": "라이브스트림: 후원/메시지 읽기"
},
"category_livestream_messages_short": {
"message": "메시지 읽기"
},
"disable": {
"message": "비활성화"
"autoSkip": {
"message": "자동으로 건너뛰기"
},
"manualSkip": {
"message": "수동 스킵"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "재생 시간 바 표시"
},
"disable": {
"message": "비활성화"
},
"autoSkip_POI": {
"message": "시점으로 자동 건너뛰기"
},
"manualSkip_POI": {
"message": "동영상을 불러왔을 때 묻기"
},
"showOverlay_POI": {
"message": "재생 시간 바에 표시"
},
"autoSkipOnMusicVideos": {
"message": "음악이 아닌 구간이 있을 때는 모든 구간 자동 건너뛰기"
},
"muteSegments": {
"message": "구간을 건너뛰지 않고 음소거 처리"
},
"colorFormatIncorrect": {
"message": "올바르지 않은 색상 코드입니다. 색상 코드는 샵 (#) 기호로 시작하여 3자리 또는 6자리의 16진수로 구성되어야 합니다."
},
@@ -601,6 +656,9 @@
"message": "\"{0}\" 카테고리의 세그먼트를 제출하려면 설정에서 활성화 해주셔야 합니다. 지금 설정으로 이동합니다.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "경고: 이 유형의 세그먼트는 한 번에 최대 하나씩 활성화될 수 있습니다. 여러 개를 제출하면 무작위로 표시됩니다."
},
"youMustSelectACategory": {
"message": "제출 해야하는 모든 구간의 카테고리를 설정해야합니다!"
},
@@ -672,6 +730,10 @@
"help": {
"message": "도움"
},
"GotIt": {
"message": "확인",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "향후 모든 실험 기능 비활성화",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "다시 보지 않음"
},
"warningChatInfo": {
"message": "현재 귀하가 악의적이지 않은 일반적인 실수를 저지르고 있음을 발견했습니다. 이에 따라 경고 조치가 내려져 일시적으로 구간을 제출할 수 없게 되었습니다. 저희는 단지 규칙을 명확히 전달하고자 합니다. discord.gg/SponsorBlock 또는 matrix.to/#/+sponsor:ajay.app 링크를 통해 대화에 참여할 수도 있습니다."
"message": "현재 귀하가 악의적이지 않은 일반적인 실수를 저지르고 있음을 발견했습니다. 이에 따라 경고 조치가 내려져 일시적으로 구간을 제출할 수 없게 되었습니다. 저희는 단지 규칙을 명확히 전달하고자 합니다. discord.gg/SponsorBlock 또는 matrix.to/#/#sponsor:ajay.app 링크를 통해 대화에 참여할 수도 있습니다."
},
"voteRejectedWarning": {
"message": "경고로 인해 투표가 거부되었습니다. 클릭하여 대화로 해결하거나, 나중에 시간이 나면 다시 오세요.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "후원"
},
"hideDonationLink": {
"message": "후원 링크 숨기기"
},
"helpPageThanksForInstalling": {
"message": "SponsorBlock을 설치해 주셔서 감사드립니다."
},
"helpPageReviewOptions": {
"message": "아래 설정들을 확인해 주세요"
},
"helpPageFeatureDisclaimer": {
"message": "많은 기능들이 기본적으로 비활성화되어 있습니다. 인트로, 아웃트로나 기타 불필요한 부분을 건너뛰고 싶으시면 아래에서 설정을 켜세요. UI 요소를 볼 것인지 말 것인지도 선택하실 수 있습니다."
},
"helpPageHowSkippingWorks": {
"message": "건너뛰기가 작동하는 방법"
},
"helpPageHowSkippingWorks1": {
"message": "데이터베이스에서 동영상 구간을 찾으면 이를 자동으로 건너뛸 것입니다. 확장 프로그램 아이콘을 눌러 팝업 창을 열면 어떤 것이 무엇인지 미리 확인할 수 있습니다."
},
"helpPageHowSkippingWorks2": {
"message": "구간을 건너뛰면 알림을 받게 됩니다. 알림 팝업에서는 투표도 진행할 수 있습니다. 타이밍이 잘못되었다면 반대 아이콘을 눌러 반대 투표를 보낼 수 있습니다!"
},
"Submitting": {
"message": "제출"
},
"helpPageSubmitting1": {
"message": "\"광고 구간 시작\" 버튼을 누른 다음 팝업에서 제출할 수도 있으며 동영상 플레이어 내 버튼으로 제출할 수도 있습니다."
},
"helpPageSubmitting2": {
"message": "재생 아이콘을 누르면 구간의 시점을 정할 수 있고 중지 아이콘을 누르면 구간의 종점을 정할 수 있습니다. 제출하기 전 여러 구간을 설정할 수 있습니다. 업로드 아이콘을 눌러 제출할 수 있습니다. 휴지통 아이콘을 눌러 구간을 제거할 수 있습니다."
},
"Editing": {
"message": "수정"
},
"helpPageEditing1": {
"message": "구간을 잘못 설정했다면, 위쪽 화살표 버튼을 누른 다음 구간을 편집하거나 삭제할 수 있습니다."
},
"helpPageTooSlow": {
"message": "너무 느립니다"
},
"helpPageTooSlow1": {
"message": "원하는 경우 단축키를 이용할 수 있습니다. 쌍반점 키를 눌러 스폰서 구간의 시점/종점을 설정할 수 있으며 작은따옴표 키를 눌러 구간을 제출할 수 있습니다. 설정에서 이를 변경할 수 있습니다. QWERTY 자판을 사용하지 않는 경우, 단축키 설정을 변경해야 할 수 있습니다."
},
"helpPageCopyOfDatabase": {
"message": "데이터베이스의 사본을 구할 수 있을까요? 개발자에게 무슨 일이 생기면 어떻게 되는 거죠?"
},
"helpPageCopyOfDatabase1": {
"message": "데이터베이스는 공개되어 있으며 다음 주소를 통해 접근할 수 있습니다"
},
"helpPageCopyOfDatabase2": {
"message": "소스 코드는 자유롭게 이용할 수 있습니다. 따라서 제게 무슨 일이 생기더라도, 기여 사항이 사라지는 일은 없습니다."
},
"helpPageNews": {
"message": "소식 및 제작 방법"
},
"helpPageSourceCode": {
"message": "소스 코드는 어디에서 볼 수 있나요?"
},
"Credits": {
"message": "크레딧"
},
"highlightNewFeature": {
"message": "새 기능! 새로운 하이라이트 카테고리를 통해 동영상의 중요 지점으로 이동하세요"
},
"LearnMore": {
"message": "더보기"
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "ഒരു കണക്ഷൻ പിശക് സംഭവിച്ചു. പിശക് കോഡ്: "
},
"wantToSubmit": {
"message": "വീഡിയോ ഐഡിക്ക് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ"
},
"clearTimes": {
"message": "സെഗ്‌മെന്റുകൾ മായ്‌ക്കുക"
},
@@ -212,6 +209,9 @@
"showNotice": {
"message": "അറിയിപ്പ് വീണ്ടും കാണിക്കുക"
},
"showSkipNotice": {
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കിയതിനുശേഷം അറിയിപ്പ് കാണിക്കുക"
},
"longDescription": {
"message": "സ്പോൺസർമാർ, ആമുഖങ്ങൾ, ros ട്ട്‌ട്രോകൾ, സബ്‌സ്‌ക്രിപ്‌ഷൻ ഓർമ്മപ്പെടുത്തലുകൾ, YouTube വീഡിയോകളുടെ മറ്റ് ശല്യപ്പെടുത്തുന്ന ഭാഗങ്ങൾ എന്നിവ ഒഴിവാക്കാൻ സ്‌പോൺസർബ്ലോക്ക് നിങ്ങളെ അനുവദിക്കുന്നു. സ്പോൺ‌സർ‌ബ്ലോക്ക് ഒരു ക്ര crow ഡ്സോഴ്സ്ഡ് ബ്ര browser സർ എക്സ്റ്റൻഷനാണ്, ഇത് സ്പോൺസർ ചെയ്ത സെഗ്‌മെന്റുകളുടെയും YouTube വീഡിയോകളുടെ മറ്റ് സെഗ്‌മെൻറുകളുടെയും ആരംഭ, അവസാന സമയങ്ങൾ സമർപ്പിക്കാൻ ആരെയും അനുവദിക്കുക. ഒരു വ്യക്തി ഈ വിവരങ്ങൾ‌ സമർപ്പിച്ചുകഴിഞ്ഞാൽ‌, ഈ വിപുലീകരണമുള്ള മറ്റെല്ലാവരും സ്പോൺ‌സർ‌ ചെയ്‌ത സെഗ്‌മെൻറിനെ മറികടക്കും. സംഗീത വീഡിയോകളുടെ സംഗീതേതര വിഭാഗങ്ങളും നിങ്ങൾക്ക് ഒഴിവാക്കാം.",
"description": "Full description of the extension on the store pages."
@@ -269,9 +269,6 @@
"skip_category": {
"message": "{0} ഒഴിവാക്കുക?"
},
"skipped": {
"message": "ഒഴിവാക്കി"
},
"disableAutoSkip": {
"message": "യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനരഹിതമാക്കുക"
},
@@ -320,9 +317,6 @@
"changeUserID": {
"message": "നിങ്ങളുടെ യൂസർ ഐഡി ഇറക്കുമതി ചെയ്യുക / കയറ്റുമതി ചെയ്യുക"
},
"whatChangeUserID": {
"message": "ഇത് സ്വകാര്യമായി സൂക്ഷിക്കണം. ഇത് ഒരു പാസ്‌വേഡ് പോലെയാണ്, ഇത് ആരുമായും പങ്കിടാൻ പാടില്ല. ആർക്കെങ്കിലും ഇത് ഉണ്ടെങ്കിൽ, അവർക്ക് നിങ്ങളെ ആൾമാറാട്ടം നടത്താം."
},
"setUserID": {
"message": "യൂസർ ഐഡി സജ്ജമാക്കുക"
},
@@ -332,12 +326,6 @@
"createdBy": {
"message": "ഉണ്ടാക്കിയത്"
},
"autoSkip": {
"message": "യാന്ത്രിക ഒഴിവാക്കുക"
},
"showSkipNotice": {
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കിയതിനുശേഷം അറിയിപ്പ് കാണിക്കുക"
},
"keybindCurrentlySet": {
"message": ". ഇത് നിലവിൽ ഇതായി സജ്ജീകരിച്ചിരിക്കുന്നു:"
},
@@ -504,8 +492,8 @@
"category_livestream_messages_short": {
"message": "സന്ദേശ വായന"
},
"disable": {
"message": "പ്രവർത്തനരഹിതമാക്കുക"
"autoSkip": {
"message": "യാന്ത്രിക ഒഴിവാക്കുക"
},
"manualSkip": {
"message": "സ്വമേധയാലുള്ള ഒഴിവാക്കൽ"
@@ -513,6 +501,9 @@
"showOverlay": {
"message": "സീക്ക് ബാറിൽ കാണിക്കുക"
},
"disable": {
"message": "പ്രവർത്തനരഹിതമാക്കുക"
},
"colorFormatIncorrect": {
"message": "നിങ്ങളുടെ നിറം തെറ്റായി ഫോർമാറ്റുചെയ്‌തു. ഇത് തുടക്കത്തിൽ ഒരു നമ്പർ ചിഹ്നമുള്ള 3 അല്ലെങ്കിൽ 6 അക്ക ഹെക്സ് കോഡായിരിക്കണം."
},

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "Ralat sambungan telah berlaku. Kod salah: "
},
"wantToSubmit": {
"message": "Adakah anda ingin menghantar untuk id video"
},
"clearTimes": {
"message": "Kosongkan Segmen"
},
@@ -212,6 +209,9 @@
"showNotice": {
"message": "Tunjukkan Notis Lagi"
},
"showSkipNotice": {
"message": "Tunjukkan Makluman Setelah Segmen Dilangkau"
},
"longDescription": {
"message": "SponsorBlock membolehkan anda melewati penaja, intro, outro, peringatan langganan, dan bahagian lain dari video YouTube yang menjengkelkan. SponsorBlock adalah pelanjutan penyemak imbas yang banyak untuk membolehkan sesiapa sahaja menghantar segmen tajaan dan masa tayangan dari segmen video YouTube yang lain. Setelah satu orang menyerahkan maklumat ini, semua orang yang mempunyai pelanjutan ini akan melangkau segmen yang ditaja. Anda juga boleh melangkau bahagian muzik video muzik bukan.",
"description": "Full description of the extension on the store pages."
@@ -269,9 +269,6 @@
"skip_category": {
"message": "Langkau {0}?"
},
"skipped": {
"message": "Langkau"
},
"disableAutoSkip": {
"message": "Lumpuhkan Langkau Auto"
},
@@ -320,9 +317,6 @@
"changeUserID": {
"message": "Import / Eksport Id Pengguna Anda"
},
"whatChangeUserID": {
"message": "Perkara ini harus dirahsiakan. Ini seperti kata laluan dan tidak boleh dikongsi dengan sesiapa pun. Sekiranya seseorang mempunyai ini, mereka boleh menyamar sebagai anda."
},
"setUserID": {
"message": "Tetapkan Id Pengguna"
},
@@ -332,12 +326,6 @@
"createdBy": {
"message": "Dicipta oleh"
},
"autoSkip": {
"message": "Langkau Auto"
},
"showSkipNotice": {
"message": "Tunjukkan Makluman Setelah Segmen Dilangkau"
},
"keybindCurrentlySet": {
"message": ". Pada masa ini ditetapkan untuk:"
},
@@ -504,8 +492,8 @@
"category_livestream_messages_short": {
"message": "Bacaan Mesej"
},
"disable": {
"message": "Nyahaktifkan"
"autoSkip": {
"message": "Langkau Auto"
},
"manualSkip": {
"message": "Langkau Manual"
@@ -513,6 +501,9 @@
"showOverlay": {
"message": "Tunjukkan Di Bar Mencari"
},
"disable": {
"message": "Nyahaktifkan"
},
"colorFormatIncorrect": {
"message": "Warna anda tidak diformat dengan betul. Ia mestilah kod hex 3 atau 6 digit dengan tanda nombor pada awalnya."
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Opnieuw overslaan"
},
"unmute": {
"message": "Niet meer dempen"
},
"paused": {
"message": "Gepauzeerd"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Er is een verbindingsfout opgetreden. Foutcode: "
},
"wantToSubmit": {
"message": "Wilt u indienen voor video-id"
},
"clearTimes": {
"message": "Segmenten verwijderen"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Gebruikersnaam instellen"
},
"copyPublicID": {
"message": "Publieke gebruikers-ID kopiëren"
},
"discordAdvert": {
"message": "Word lid van de officiële Discord-server om suggesties en feedback te geven!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Melding opnieuw weergeven"
},
"showSkipNotice": {
"message": "Melding weergeven nadat een segment is overgeslagen"
},
"noticeVisibilityMode0": {
"message": "Volledige grootte overslaan-meldingen"
},
"noticeVisibilityMode1": {
"message": "Kleine overslaan-meldingen voor automatisch overslaan"
},
"noticeVisibilityMode2": {
"message": "Allemaal kleine overslaan-meldingen"
},
"noticeVisibilityMode3": {
"message": "Vervaagde overslaan-meldingen"
},
"noticeVisibilityMode4": {
"message": "Allemaal vervaagde overslaan-meldingen"
},
"longDescription": {
"message": "SponsorBlock laat u sponsoring, intro's, outro's, herinneringen om te abonneren en andere vervelende onderdelen van YouTube-video's overslaan. SponsorBlock is een gecrowdsourcete browser-extensie waarmee iedereen de begin- en eindtijd van gesponsorde segmenten en andere segmenten van YouTube-video's kan indienen. Zodra één persoon deze informatie indient, zal iedereen met deze extensie het gesponsorde segment overslaan. U kunt ook secties zonder muziek in muziekvideo's overslaan.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Overslaan"
},
"mute": {
"message": "Dempen"
},
"skip_category": {
"message": "{0} overslaan?"
},
"mute_category": {
"message": "{0} dempen?"
},
"skip_to_category": {
"message": "Overslaan naar {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Overgeslagen"
"message": "{0} overgeslagen",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} gedempt",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Overgeslagen naar {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Automatisch overslaan uitschakelen"
@@ -336,7 +376,7 @@
"message": "Uw gebruikers-ID importeren/exporteren"
},
"whatChangeUserID": {
"message": "Dit moet privé gehouden worden. Dit is als een wachtwoord en mag met niemand gedeeld worden. Als iemand dit heeft, kan hij zich voordoen als u."
"message": "Dit moet privé gehouden worden. Dit is als een wachtwoord en mag met niemand gedeeld worden. Als iemand dit heeft, kan hij zich voordoen als u. Klik op het klembordpictogram in de popup als u op zoek bent naar uw publieke gebrukers-ID."
},
"setUserID": {
"message": "Gebruikers-ID instellen"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Gemaakt door"
},
"autoSkip": {
"message": "Automatisch overslaan"
},
"showSkipNotice": {
"message": "Melding weergeven nadat een segment is overgeslagen"
},
"keybindCurrentlySet": {
"message": ". Hij is momenteel ingesteld op:"
},
@@ -397,10 +431,10 @@
"message": "Segmenten korter dan de ingestelde waarde worden niet overgeslagen of weergegeven in de speler."
},
"skipNoticeDuration": {
"message": "Duur van melding om over te slaan (seconden):"
"message": "Duur van overslaan-melding (seconden):"
},
"skipNoticeDurationDescription": {
"message": "De melding om over te slaan blijft ten minste zo lang op het scherm staan. Voor handmatig overslaan kan dit misschien zelfs langer zichtbaar zijn."
"message": "De overslaan-melding blijft ten minste zo lang op het scherm staan. Voor handmatig overslaan kan dit misschien zelfs langer zichtbaar zijn."
},
"shortCheck": {
"message": "De volgende inzending is korter dan uw \"minimale tijdsduur\"-instelling. Dit kan betekenen dat dit al is ingediend en genegeerd wordt door deze optie. Weet u zeker dat u dit wilt indienen?"
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Niet-muziek"
},
"category_poi_highlight": {
"message": "Hoogtepunt"
},
"category_poi_highlight_description": {
"message": "Het deel van de video waar de meeste mensen naar op zoek zijn. Gelijkaardig aan \"video begint bij x\"-opmerkingen."
},
"category_livestream_messages": {
"message": "Livestream: donaties/lezen van berichten"
},
"category_livestream_messages_short": {
"message": "Lezen van berichten"
},
"disable": {
"message": "Uitschakelen"
"autoSkip": {
"message": "Automatisch overslaan"
},
"manualSkip": {
"message": "Handmatig overslaan"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Weergeven in tijdbalk"
},
"disable": {
"message": "Uitschakelen"
},
"autoSkip_POI": {
"message": "Automatisch overslaan naar het begin"
},
"manualSkip_POI": {
"message": "Vragen wanneer de video wordt geladen"
},
"showOverlay_POI": {
"message": "Weergeven in tijdbalk"
},
"autoSkipOnMusicVideos": {
"message": "Automatisch alle segmenten overslaan wanneer er een niet-muziek-segment is"
},
"muteSegments": {
"message": "Segmenten toestaan die audio dempen in plaats van overslaan"
},
"colorFormatIncorrect": {
"message": "Uw kleur is verkeerd geformatteerd. Het moet een hexadecimale code van 3 of 6 cijfers zijn met een hekje aan het begin."
},
@@ -601,6 +656,9 @@
"message": "Om segmenten met de categorie \"{0}\" in te dienen, moet u deze in de opties inschakelen. U wordt nu doorgestuurd naar de opties.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Waarschuwing: dit type segment kan maximaal één keer tegelijk actief zijn. Meerdere segmenten indienen zal weergave van een willekeurig segment veroorzaken."
},
"youMustSelectACategory": {
"message": "U moet een categorie selecteren voor alle segmenten die u indient!"
},
@@ -672,6 +730,10 @@
"help": {
"message": "Help"
},
"GotIt": {
"message": "Begrepen",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Uitschrijven van alle toekomstige experimenten",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Voor altijd verbergen"
},
"warningChatInfo": {
"message": "U heeft een waarschuwing gekregen en kunt tijdelijk geen segmenten indienen. Dit betekent dat we gemerkt hebben dat u een aantal veelvoorkomende fouten maakt die niet kwaadaardig zijn, en we willen gewoon de regels verduidelijken. U kunt ook deelnemen aan deze chat via discord.gg/SponsorBlock of matrix.to/#/+sponsor:ajay.app"
"message": "U heeft een waarschuwing gekregen en kunt tijdelijk geen segmenten indienen. Dit betekent dat we gemerkt hebben dat u een aantal veelvoorkomende fouten maakt die niet kwaadaardig zijn, en we willen gewoon de regels verduidelijken. U kunt ook deelnemen aan deze chat via discord.gg/SponsorBlock of matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Stem geweigerd vanwege een waarschuwing. Klik om een chat te openen om het op te lossen, of kom later terug als u tijd hebt.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Doneren"
},
"hideDonationLink": {
"message": "Donatiekoppeling verbergen"
},
"helpPageThanksForInstalling": {
"message": "Bedankt voor het installeren van SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Bekijk de onderstaande opties"
},
"helpPageFeatureDisclaimer": {
"message": "Veel functies zijn standaard uitgeschakeld. Als u intro's of outro's wilt overslaan, Invidious wilt gebruiken, enz., schakelt u ze hieronder in. U kunt ook UI-elementen verbergen/weergeven."
},
"helpPageHowSkippingWorks": {
"message": "Hoe overslaan werkt"
},
"helpPageHowSkippingWorks1": {
"message": "Videosegmenten zullen automatisch worden overgeslagen als ze in de database worden gevonden. U kunt de popup openen door op het pictogram van de extensie te klikken om een voorbeeld te krijgen van wat ze zijn."
},
"helpPageHowSkippingWorks2": {
"message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op downvote te klikken! U kunt ook stemmen in de popup."
},
"Submitting": {
"message": "Indienen"
},
"helpPageSubmitting1": {
"message": "Indienen kan ofwel in de popup door op de knop \"segment begint nu\" te drukken of in de videospeler met de knoppen op de speler."
},
"helpPageSubmitting2": {
"message": "Klikken op de afspelen-knop geeft het begin van een segment aan en klikken op het stop-pictogram geeft het einde aan. U kunt meerdere sponsors voorbereiden voordat u op indienen klikt. Klikken op de uploadknop zal indienen. Klikken op de vuilnisbak zal verwijderen."
},
"Editing": {
"message": "Bewerken"
},
"helpPageEditing1": {
"message": "Als u een fout hebt gemaakt, kunt u uw segmenten bewerken of verwijderen nadat u op de knop met de pijl omhoog hebt geklikt."
},
"helpPageTooSlow": {
"message": "Dit is te traag"
},
"helpPageTooSlow1": {
"message": "Er zijn sneltoetsen als u die wilt gebruiken. Druk op de puntkomma-toets om het begin/einde van een sponsorsegment aan te geven en klik op de apostrof om in te dienen. Deze kunnen worden veranderd in de opties. Als u geen QWERTY gebruikt, moet u waarschijnlijk de toetsencombinatie veranderen."
},
"helpPageCopyOfDatabase": {
"message": "Kan ik een kopie van de database krijgen? Wat gebeurt er als u verdwijnt?"
},
"helpPageCopyOfDatabase1": {
"message": "De database is openbaar en beschikbaar op"
},
"helpPageCopyOfDatabase2": {
"message": "De broncode is vrij beschikbaar. Dus, zelfs als mij iets overkomt, zijn uw inzendingen niet verloren."
},
"helpPageNews": {
"message": "Nieuws en hoe het gemaakt is"
},
"helpPageSourceCode": {
"message": "Waar kan ik de broncode krijgen?"
},
"Credits": {
"message": "Dank aan"
},
"highlightNewFeature": {
"message": "Nieuw! Ga met één klik naar de kern van de video met de nieuwe hoogtepunt-categorie"
},
"LearnMore": {
"message": "Meer informatie"
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "En tilkoblingsfeil har oppstått. Feilkode: "
},
"wantToSubmit": {
"message": "Vil du sende inn for video-ID-en"
},
"clearTimes": {
"message": "Tøm segmenter"
},
@@ -212,6 +209,9 @@
"showNotice": {
"message": "Vis varselet igjen"
},
"showSkipNotice": {
"message": "Vis varsel etter at et segment har blitt hoppet over"
},
"longDescription": {
"message": "SponsorBlock lar deg hoppe over sponsorer, introer, outro-er, abonnementspåminnelser, og andre irriterende deler av YouTube-videoer. SponsorBlock er en fellesskapsdrevet nettleserutvidelser som lar alle sende inn start- og sluttidspunktene til sponsede segmenter og andre segmenter i YouTube-videoer. Når en person sender inn denne informasjonen, vil alle andre med denne utvidelsen hoppe rett over det sponsede segmentet. Du kan også hoppe over ikke-musikk-seksjoner i musikkvideoer.",
"description": "Full description of the extension on the store pages."
@@ -269,9 +269,6 @@
"skip_category": {
"message": "Vil du hoppe over {0}?"
},
"skipped": {
"message": "Hoppet over"
},
"disableAutoSkip": {
"message": "Skru av autohopping"
},
@@ -320,9 +317,6 @@
"changeUserID": {
"message": "Importer/Eksporter din bruker-ID"
},
"whatChangeUserID": {
"message": "Dette burde holdes privat. Dette er som et passord og burde ikke deles med noen. Hvis noen har dette, kan de etterligne deg."
},
"setUserID": {
"message": "Angi bruker-ID"
},
@@ -332,12 +326,6 @@
"createdBy": {
"message": "Opprettet av"
},
"autoSkip": {
"message": "Hopp over automatisk"
},
"showSkipNotice": {
"message": "Vis varsel etter at et segment har blitt hoppet over"
},
"keybindCurrentlySet": {
"message": ". Den er før øyeblikket satt til:"
},
@@ -504,8 +492,8 @@
"category_livestream_messages_short": {
"message": "Høytlesning av meldinger"
},
"disable": {
"message": "Deaktiver"
"autoSkip": {
"message": "Hopp over automatisk"
},
"manualSkip": {
"message": "Manuelt hopp"
@@ -513,6 +501,9 @@
"showOverlay": {
"message": "Vis i tidsstripen"
},
"disable": {
"message": "Deaktiver"
},
"colorFormatIncorrect": {
"message": "Fargen din er formattert feil. Det burde være en 3- eller 6-sifret heksadesimal kode med et nummertegn foran."
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Pomiń"
},
"unmute": {
"message": "Odcisz"
},
"paused": {
"message": "Zatrzymany"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Wystąpił błąd połączenia. Kod błędu: "
},
"wantToSubmit": {
"message": "Czy chcesz wysłać dla filmu o id"
},
"clearTimes": {
"message": "Wyczyść segmenty"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Ustaw nazwę użytkownika"
},
"copyPublicID": {
"message": "Kopiuj Publiczne ID Użytkownika"
},
"discordAdvert": {
"message": "Dołącz do oficjalnego serwera na discordzie i podziel się wrażeniami i sugestiami!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Pokaż informacje ponownie"
},
"showSkipNotice": {
"message": "Pokaż informację po pominięciu segmentu"
},
"noticeVisibilityMode0": {
"message": "Duże powiadomienia o przewinięciu"
},
"noticeVisibilityMode1": {
"message": "Małe powiadomienia o automatycznym przewijaniu"
},
"noticeVisibilityMode2": {
"message": "Małe powiadomienia o przewinięciu"
},
"noticeVisibilityMode3": {
"message": "Znikające powiadomienia o automatycznym przewijaniu"
},
"noticeVisibilityMode4": {
"message": "Znikające powiadomienia o przewijaniu"
},
"longDescription": {
"message": "SponsorBlock pozwala pomijać sponsorów, intra, outra, przypomnienia o subskrypcjach i inne irytujące fragmenty filmów na YouTube. SponsorBlock jest opartym na crowdsourcingu rozszerzeniem do przeglądarki, które pozwala każdemu zgłosić początek i koniec segmentów sponsorowanych oraz innych segmentów w filmach na YouTube. Kiedy ktoś już zamieści te informacje, wszyscy pozostali z tym rozszerzeniem będą pomijać segment sponsorowany. Możesz również pomijać fragmenty teledysków bez muzyki.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Pomiń"
},
"mute": {
"message": "Wycisz"
},
"skip_category": {
"message": "Pominąć {0}?"
},
"mute_category": {
"message": "Wyciszyć {0}?"
},
"skip_to_category": {
"message": "Przejść do {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Pominięto"
"message": "Pominięto {0}",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "Wyciszono {0}",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Przewinięto do {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Wyłącz autopomijanie"
@@ -336,7 +376,7 @@
"message": "Importuj/Eksportuj swój identyfikator użytkownika"
},
"whatChangeUserID": {
"message": "Ta informacja jest poufna i działa jak hasło. Użytkownik, który ma do niej dostęp, może zgłaszać treści jako ty."
"message": "Powinno pozostać prywatne. Jest to niczym hasło i nie powinno być nikomu udostępniane. Przy jego użyciu może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie."
},
"setUserID": {
"message": "Ustaw identyfikator użytkownika"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Stworzony przez"
},
"autoSkip": {
"message": "Autopomijanie"
},
"showSkipNotice": {
"message": "Pokaż informację po pominięciu segmentu"
},
"keybindCurrentlySet": {
"message": ". Obecnie ustawiony:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Bez muzyki"
},
"category_poi_highlight": {
"message": "Wyróżnione"
},
"category_poi_highlight_description": {
"message": "Część filmu, która interesuje większość osób. Podobne do komentarzy typu „Filmik zaczyna się od x”."
},
"category_livestream_messages": {
"message": "Transmisja live: Dotacja/Czytanie wiadomości"
},
"category_livestream_messages_short": {
"message": "Czytanie wiadomości"
},
"disable": {
"message": "Wyłączone"
"autoSkip": {
"message": "Autopomijanie"
},
"manualSkip": {
"message": "Ręczne pomijanie"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Pokaż na pasku"
},
"disable": {
"message": "Wyłączone"
},
"autoSkip_POI": {
"message": "Automatycznie przewiń do początku"
},
"manualSkip_POI": {
"message": "Zapytaj, gdy wideo się załaduje"
},
"showOverlay_POI": {
"message": "Pokaż na pasku"
},
"autoSkipOnMusicVideos": {
"message": "Automatycznie pomiń wszystkie segmenty, gdy istnieje segment niemuzyczny"
},
"muteSegments": {
"message": "Zezwalaj na segmenty, które wyciszą dźwięk zamiast pomijać"
},
"colorFormatIncorrect": {
"message": "Nieprawidłowy format koloru. Powinien to być zapis szesnastkowy (heksadecymalny) składający się z 3 lub 6 znaków poprzedzonych kratką (#)."
},
@@ -601,6 +656,9 @@
"message": "Aby przesyłać segmenty o kategorii „{0}”, musisz ją włączyć w opcjach. Za chwilę nastąpi przekierowanie do ustawień.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Ostrzeżenie: Ten typ segmentu, może być maksymalnie jeden. Przesyłanie kilku na raz spowoduje, że pojawi się losowy."
},
"youMustSelectACategory": {
"message": "Musisz wybrać kategorię dla każdego segmentu, który zamieszczasz!"
},
@@ -672,6 +730,10 @@
"help": {
"message": "Pomoc"
},
"GotIt": {
"message": "Rozumiem",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Wyłączenie wszystkich przyszłych eksperymentów",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Schowaj na zawsze"
},
"warningChatInfo": {
"message": "Otrzymałeś ostrzeżenie i nie możesz tymczasowo przesłać segmentów. Oznacza to, że zauważyliśmy, że popełniałeś pewne pospolite błędy, które nie są złośliwe i po prostu chcemy wyjaśnić zasady. Możesz również dołączyć do tego czatu używając discord.gg/SponsorBlock lub matrix.to/#/+sponsor:ajay.app"
"message": "Otrzymałeś ostrzeżenie i nie możesz tymczasowo przesłać segmentów. Oznacza to, że zauważyliśmy, że popełniałeś pewne pospolite błędy, które nie są złośliwe i po prostu chcemy wyjaśnić zasady. Możesz również dołączyć do tego czatu używając discord.gg/SponsorBlock lub matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Głosowanie odrzucone z powodu ostrzeżenia. Kliknij, aby otworzyć czat w celu rozwiązania problemu lub wróć później, gdy będziesz miał czas.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Dotacje"
},
"hideDonationLink": {
"message": "Ukryj opcję dotacji"
},
"helpPageThanksForInstalling": {
"message": "Dziękujemy za zainstalowanie SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Przejrzyj poniższe opcje"
},
"helpPageFeatureDisclaimer": {
"message": "Wiele funkcji jest domyślnie wyłączonych. Jeśli chcesz pomijać intra, outra, używać Invidious, itp., włącz je poniżej. Możesz również ukryć/pokazać elementy interfejsu użytkownika."
},
"helpPageHowSkippingWorks": {
"message": "Jak działa pomijanie"
},
"helpPageHowSkippingWorks1": {
"message": "Segmenty filmu zostaną automatycznie pominięte, jeśli znajdują się w bazie danych. Możesz kliknąć na ikonę rozszerzenia, aby podejrzeć, czym one są."
},
"helpPageHowSkippingWorks2": {
"message": "Za każdym razem, gdy pominiesz segment, otrzymasz powiadomienie. Jeśli moment nie wydaje się być poprawny, kliknij łapkę w dół! Możesz również głosować w okienku pop-up."
},
"Submitting": {
"message": "Wysyłanie"
},
"helpPageSubmitting1": {
"message": "Wysyłanie może być wykonane w wyskakującym okienku, poprzez kliknięcie przycisku \"Początek segmentu\" lub za pomocą przycisków na odtwarzaczu wideo."
},
"helpPageSubmitting2": {
"message": "Kliknięcie przycisku odtwarzania wskazuje początek segmentu a kliknięcie ikony stop wskazuje koniec segmentu. Możesz przygotować wielu segmentów przed wysłaniem. Aby wysłać kliknij przycisk potwierdzający, a aby usunąć - na śmietnik."
},
"Editing": {
"message": "Edytowanie"
},
"helpPageEditing1": {
"message": "Jeśli się pomyliłeś, możesz edytować i usuwać swoje segmenty poprzez kliknięcie przycisku ze strzałką w górę."
},
"helpPageTooSlow": {
"message": "Zbyt wolno"
},
"helpPageTooSlow1": {
"message": "Istnieją skróty klawiszowe, jeśli chcesz ich używać. Naciśnij klawisz średnika, aby wskazać początek/koniec segmentu sponsora i kliknij w apostrof, aby przesłać. Można je zmienić w opcjach. Jeśli nie używasz QWERTY, prawdopodobnie powinieneś zmienić skrót klawiszowy."
},
"helpPageCopyOfDatabase": {
"message": "Czy mogę otrzymać kopię bazy danych? Co się stanie, jeśli przestaniecie istnieć?"
},
"helpPageCopyOfDatabase1": {
"message": "Baza danych jest publiczna i dostępna na stronie"
},
"helpPageCopyOfDatabase2": {
"message": "Kod źródłowy jest dostępny. Tak więc, nawet jeśli coś się ze mną stanie, wasze zgłoszenia nie zostaną utracone."
},
"helpPageNews": {
"message": "Wiadomości i jak to jest zrobione"
},
"helpPageSourceCode": {
"message": "Gdzie mogę otrzymać kod źródłowy?"
},
"Credits": {
"message": "Autorzy"
},
"highlightNewFeature": {
"message": "Nowość! Przejdź do interesującej części filmu jednym kliknięciem z nową kategorią wyróżnione"
},
"LearnMore": {
"message": "Dowiedz się więcej"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Pular novamente"
},
"unmute": {
"message": "Ativar som"
},
"paused": {
"message": "Pausado"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Ocorreu um erro de conexão. Código de erro: "
},
"wantToSubmit": {
"message": "Deseja enviar para o vídeo com id"
},
"clearTimes": {
"message": "Limpar Segmentos"
},
@@ -131,7 +131,7 @@
"message": "Envios"
},
"savedPeopleFrom": {
"message": "Poupaste a outros de "
"message": "Você poupou as pessoas de "
},
"viewLeaderboard": {
"message": "Placar de classificação"
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Definir nome de usuário"
},
"copyPublicID": {
"message": "Copiar ID Pública de Usuário"
},
"discordAdvert": {
"message": "Junte-se ao servidor do discord oficial para dar dicas e sugestões!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Mostrar notificação outra vez"
},
"showSkipNotice": {
"message": "Mostrar Aviso Após Um Segmento Ser Ignorado"
},
"noticeVisibilityMode0": {
"message": "Avisos de Ignorar em Tamanho Inteiro"
},
"noticeVisibilityMode1": {
"message": "Avisos de Ignorar pequenos quando Pulado Automaticamente"
},
"noticeVisibilityMode2": {
"message": "Todos os Avisos de Ignorar em Tamanho Pequeno"
},
"noticeVisibilityMode3": {
"message": "Avisos de Ignorar semi-transparentes quando Pulado Automaticamente"
},
"noticeVisibilityMode4": {
"message": "Todos os Avisos de Ignorar semi-transparentes"
},
"longDescription": {
"message": "O SponsorBlock permite que você pule patrocinadores, introduções, créditos finais, lembretes de inscrição, e outras partes irritantes dos vídeos do YouTube. O SponsorBlock é uma extensão de navegador de crowdsourcing que permite enviar a qualquer um o tempo inicial e final de segmentos patrocinados de vídeos do YouTube. Assim que uma pessoa enviar essa informação, todas as outras pessoas com essa extensão irão pular o segmento patrocinado. Você também pode pular seções que não são de música dos vídeos de música.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Pular"
},
"mute": {
"message": "Silenciar"
},
"skip_category": {
"message": "Pular {0}?"
},
"mute_category": {
"message": "Silenciar {0}?"
},
"skip_to_category": {
"message": "Pular para {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Pulado"
"message": "{0} Ignorado",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Silenciado",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Pulado para {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Desativar Salto Automático"
@@ -336,7 +376,7 @@
"message": "Importar/Exportar seu ID de usuário"
},
"whatChangeUserID": {
"message": "Isso deve ser mantido em segredo. É como se fosse uma senha e não deve ser compartilhado com ninguém. Se alguém tiver isso, poderá se passar por você."
"message": "Esta informação deve se mantida privada. Ela é como uma senha e não deve ser compartilhada. Outras pessoas poderão se passar por você caso obtenham acesso. Se estiver procurando por sua ID Pública de Usuário, clique no ícone de prancheta no popup."
},
"setUserID": {
"message": "Definir ID de usuário"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Criado por"
},
"autoSkip": {
"message": "Pular automaticamente"
},
"showSkipNotice": {
"message": "Mostrar Aviso Após um Segmento Ser Ignorado"
},
"keybindCurrentlySet": {
"message": ". Atualmente, está definido para:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Não musical"
},
"category_poi_highlight": {
"message": "Destaques"
},
"category_poi_highlight_description": {
"message": "A parte do vídeo que a maioria das pessoas procura. Similar aos comentários \"Vídeo começa aos x\"."
},
"category_livestream_messages": {
"message": "Livestream: Leituras de Doação/Mensagem"
},
"category_livestream_messages_short": {
"message": "Leitura de mensagens"
},
"disable": {
"message": "Desativar"
"autoSkip": {
"message": "Pular automaticamente"
},
"manualSkip": {
"message": "Pular manualmente"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Mostrar barra de progresso"
},
"disable": {
"message": "Desativar"
},
"autoSkip_POI": {
"message": "Pular automaticamente para o início"
},
"manualSkip_POI": {
"message": "Perguntar quando o vídeo carregar"
},
"showOverlay_POI": {
"message": "Mostrar na barra de progresso"
},
"autoSkipOnMusicVideos": {
"message": "Pular automaticamente todos os segmentos quando há um segmento que não é música"
},
"muteSegments": {
"message": "Permitir segmentos que silenciem o áudio ao invés de pular"
},
"colorFormatIncorrect": {
"message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma cerquilha (hashtag) no início."
},
@@ -672,6 +727,10 @@
"help": {
"message": "Ajuda"
},
"GotIt": {
"message": "Entendi",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Optar por sair de todos os experimentos futuros",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +739,79 @@
"message": "Ocultar para sempre"
},
"warningChatInfo": {
"message": "Você recebeu um aviso e temporariamente não poderá enviar segmentos. Isso significa que notamos que você cometeu alguns erros comuns que não são maliciosos, e queremos apenas clarificar as regras. Você também pode participar desse chat usando discord.gg/SponsorBlock ou matrix.to/#/+sponsor:ajay.app"
"message": "Você recebeu um aviso e temporariamente não poderá enviar segmentos. Isso significa que notamos que você cometeu alguns erros comuns que não são maliciosos, e queremos apenas clarificar as regras. Você também pode participar desse chat usando discord.gg/SponsorBlock ou matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Voto rejeitado devido a um aviso. Clique para abrir um chat para resolvê-lo, ou volte mais tarde quando tiver tempo.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Doar"
},
"hideDonationLink": {
"message": "Ocultar o Link de Doação"
},
"helpPageThanksForInstalling": {
"message": "Obrigado por instalar o SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Por favor revise as opções abaixo"
},
"helpPageFeatureDisclaimer": {
"message": "Muitoa recursos são desativados por padrão. Se você deseja pular introduções, encerramentos, usar o Invidious, etc, ative as opções abaixo. Você também pode ocultar/mostrar elementos da interface."
},
"helpPageHowSkippingWorks": {
"message": "Como a função pular funciona"
},
"helpPageHowSkippingWorks1": {
"message": "Segmentos do vídeo serão pulados automaticamente se forem encontrados na base de dados. Você pode abrir a pop-up clicando no ícone da extensão para ter uma prévia de quais são."
},
"helpPageHowSkippingWorks2": {
"message": "Sempre que você pular um segmento, você receberá um aviso. Se o tempo estiver errado vote contra clicando no voto negativo! Você também pode votar na pop-up."
},
"Submitting": {
"message": "Enviando"
},
"helpPageSubmitting1": {
"message": "O envio pode ser feito no pop-up apertando o botão \"Segmento começa Agora\" ou no reprodutor de vídeo com os botões no reprodutor."
},
"helpPageSubmitting2": {
"message": "Clicar no botão inicio indica o começo de um segmento e clicar no ícone parar indica o fim. Você pode preparar vários patrocinadores antes de clicar em enviar. Clicar no botão upload irá enviar. Clicar no lixo irá excluir."
},
"Editing": {
"message": "Editando"
},
"helpPageEditing1": {
"message": "Se você errar, você pode editar ou deletar seus segmentos clicando na seta para cima."
},
"helpPageTooSlow": {
"message": "Isto está muito devagar"
},
"helpPageTooSlow1": {
"message": "Há teclas de atalho se você quiser usá-las. Pressione a tecla ponto e vírgula para indicar o início/fim de um segmento de patrocinador e clique no apóstrofo para enviar. Estas podem ser alteradas nas opções. Se você não usa QWERTY, você provavelmente deve alterar as teclas vinculadas."
},
"helpPageCopyOfDatabase": {
"message": "Posso baixar uma cópia do banco de dados? O que acontece se vocês desaparecerem?"
},
"helpPageCopyOfDatabase1": {
"message": "O banco de dados é público e está disponível em"
},
"helpPageCopyOfDatabase2": {
"message": "O código-fonte está disponível gratuitamente. Então, mesmo que algo aconteça comigo, seus envios não estarão perdidos."
},
"helpPageNews": {
"message": "Notícias e como tudo é feito"
},
"helpPageSourceCode": {
"message": "Onde posso obter o código-fonte?"
},
"Credits": {
"message": "Créditos"
},
"highlightNewFeature": {
"message": "Novo! Vá direto ao ponto do vídeo com um clique com a nova categoria de Destaque"
},
"LearnMore": {
"message": "Saiba mais"
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "A apărut o eroare de conexiune. Cod de eroare: "
},
"wantToSubmit": {
"message": "Doriți să trimiteți pentru id video"
},
"clearTimes": {
"message": "Curăță segmentele"
},
@@ -212,6 +209,9 @@
"showNotice": {
"message": "Arată Notificarea Din Nou"
},
"showSkipNotice": {
"message": "Arată o notificare după ce un segment este sărit"
},
"longDescription": {
"message": "SponsorBlock vă permite să săriți peste sponsori, intro, outros, memento-uri pentru abonament și alte părți enervante ale videoclipurilor YouTube SponsorBlock este o extensie crowdsourced de browser, care hai să trimită oricui timpul de început și de sfârșit pentru segmente sponsorizate și alte segmente de videoclipuri YouTube. Odată ce o persoană transmite aceste informații, toți ceilalți cu această extensie vor sări peste segmentul sponsorizat. De asemenea, poți sări peste secțiunile non-muzicale ale videoclipurilor.",
"description": "Full description of the extension on the store pages."
@@ -269,9 +269,6 @@
"skip_category": {
"message": "Omiteți {0}?"
},
"skipped": {
"message": "Sărit"
},
"disableAutoSkip": {
"message": "Dezactivează Autoskip"
},
@@ -320,9 +317,6 @@
"changeUserID": {
"message": "Importă/Exportă Id-ul Tău De Utilizator"
},
"whatChangeUserID": {
"message": "Acest lucru trebuie să fie păstrat. Este ca și o parolă și nu ar trebui împartășită cu nimeni. Daca cineva are acest lucru, se poate da drept tu."
},
"setUserID": {
"message": "Setează Id-ul Utilizatorului"
},
@@ -332,12 +326,6 @@
"createdBy": {
"message": "Creat De"
},
"autoSkip": {
"message": "Sari Peste Automat"
},
"showSkipNotice": {
"message": "Arată o notificare după ce un segment este sărit"
},
"keybindCurrentlySet": {
"message": ". În prezent este setat:"
},
@@ -501,8 +489,8 @@
"category_livestream_messages_short": {
"message": "Citire Mesaj"
},
"disable": {
"message": "Dezactivare"
"autoSkip": {
"message": "Sari Peste Automat"
},
"manualSkip": {
"message": "Sari Peste Manual"
@@ -510,6 +498,9 @@
"showOverlay": {
"message": "Arată În Bara de Derulare"
},
"disable": {
"message": "Dezactivare"
},
"colorFormatIncorrect": {
"message": "Culoarea ta este formatată incorect. Ar trebui să fie un cod hexadecimal de 3 sau 6 cifre cu un hash la început."
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Пропустить"
},
"unmute": {
"message": "Включить звук"
},
"paused": {
"message": "Пауза"
},
@@ -71,7 +74,7 @@
"message": "В базе есть сегменты для этого видео!"
},
"sponsor404": {
"message": "Сегментов не найдено"
"message": "Сегменты не найдены"
},
"sponsorStart": {
"message": "Сегмент начинается отсюда"
@@ -95,14 +98,11 @@
"message": "Голос засчитан!"
},
"serverDown": {
"message": "Кажется, сервера не работают. Незамедлительно свяжитесь с разработчиком."
"message": "Кажется, сервер не отвечает. Свяжитесь с разработчиком."
},
"connectionError": {
"message": "Ошибка соединения. Код ошибки: "
},
"wantToSubmit": {
"message": "Вы хотите отправить сегменты для видео с id"
},
"clearTimes": {
"message": "Очистить сегменты"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Установить имя пользователя"
},
"copyPublicID": {
"message": "Копировать публичный UserID"
},
"discordAdvert": {
"message": "Присоединяйтесь к официальному серверу Discord, чтобы оставить предложения и обратную связь!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Показать уведомление снова"
},
"showSkipNotice": {
"message": "Показывать уведомление после пропуска сегмента"
},
"noticeVisibilityMode0": {
"message": "Полноразмерные уведомления о пропусках"
},
"noticeVisibilityMode1": {
"message": "Уменьшенные уведомления для автоматических пропусков"
},
"noticeVisibilityMode2": {
"message": "Все уведомления уменьшенного размера"
},
"noticeVisibilityMode3": {
"message": "Полупрозрачные уведомления для автоматических пропусков"
},
"noticeVisibilityMode4": {
"message": "Полупрозрачные уведомления для всех пропусков"
},
"longDescription": {
"message": "SponsorBlock позволяет пропускать спонсорские вставки, начальные и конечные заставки, просьбы подписаться и другое в видео на YouTube. SponsorBlock — коллективное расширение, которое позволяет каждому отправить время начала и конца подобных сегментов в видео. После того, как кто-нибудь отправляет эту информацию, все остальные пользователи расширения будут автоматически пропускать эти сегменты. Так же можно пропускать части клипов без музыки.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Пропустить"
},
"mute": {
"message": "Заглушить"
},
"skip_category": {
"message": "Пропустить {0}?"
},
"mute_category": {
"message": "Заглушить {0}?"
},
"skip_to_category": {
"message": "Пропустить до {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Пропущено"
"message": "Пропущено: {0}",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} заглушен",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Пропущено до {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Отключить автоматический пропуск"
@@ -303,7 +343,7 @@
"message": "Показывать длительность без сегментов"
},
"showTimeWithSkipsDescription": {
"message": "Эта длительность отображается в скобках рядом с фактической под полосой прокрутки. Показывает длительность видео без сегментов. Включает сегменты, для которых выбрано \"Отображать в полосе прокрутки\"."
"message": "Длительность отображается в скобках после фактической под полосой прокрутки. Показывает длительность видео без сегментов. Включает сегменты, для которых выбрано \"Отображать в полосе прокрутки\"."
},
"youHaveSkipped": {
"message": "Вы пропустили "
@@ -336,23 +376,17 @@
"message": "Импорт/Экспорт Вашего идентификатора пользователя"
},
"whatChangeUserID": {
"message": "Его нужно держать в секрете. Это как пароль, не стоит им ни с кем делиться. Если он у кого-то есть, он сможет выдать себя за Вас."
"message": "Держите его в тайне. Относитесь к нему как к паролю и не передавайте никому. Если кто-то им завладеет, то сможет выдать себя за вас. Если вы ищете публичный ID пользователя, нажмите значок буфера обмена во всплывающем окне."
},
"setUserID": {
"message": "Установить идентификатор пользователя"
},
"userIDChangeWarning": {
"message": "Внимание: изменение идентификатора пользователя необратимо. Вы действительно хотите это сделать? Сделайте резервную копию вашего старого на всякий случай."
"message": "Внимание: изменение идентификатора пользователя необратимо. Вы действительно хотите это сделать? Сделайте резервную копию на всякий случай."
},
"createdBy": {
"message": "Создано"
},
"autoSkip": {
"message": "Автоматический пропуск"
},
"showSkipNotice": {
"message": "Показывать уведомление после пропуска сегмента"
},
"keybindCurrentlySet": {
"message": ". Он сейчас назначен на:"
},
@@ -400,7 +434,7 @@
"message": "Длительность отображения окошка о пропуске (в секундах):"
},
"skipNoticeDurationDescription": {
"message": "Окошко о пропуске будет оставаться на экране в течение как минимум этого времени. Может быть активно дольше при пропуске вручную."
"message": "Окошко о пропуске будет оставаться на экране как минимум в течение этого времени. Может быть активно дольше при пропуске вручную."
},
"shortCheck": {
"message": "Следующий диапазон времени короче, чем Ваша настройка минимальной длительности. Это может означать, что он уже был отправлен, и просто игнорируется из-за этой настройки. Вы действительно хотите отправить?"
@@ -478,7 +512,7 @@
"message": "Не удалось скопировать в буфер"
},
"copyDebugInformationOptions": {
"message": "Копирует информацию в буфер обмена, которая будет предоставлена разработчику при возникновении ошибки / по запросу разработчика. Такие сведения, как ID пользователя, список разрешенных каналов и адрес пользовательского сервера не передаются. Однако, отправляются ваш user agent, браузер, операционная система и номер версии расширения. "
"message": "Копирует в буфер обмена информацию, которая будет предоставлена разработчику при возникновении ошибки / по запросу разработчика. Такие сведения, как ID пользователя, список разрешенных каналов и адрес пользовательского сервера не передаются. Однако, отправляются ваш user agent, браузер, операционная система и номер версии расширения. "
},
"copyDebugInformationComplete": {
"message": "Отладочная информация скопирована в буфер обмена. Вы можете удалить любую информацию, которой не хотите делиться. Сохраните ее в текстовом файле или вставьте в отчет об ошибке."
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Без музыки"
},
"category_poi_highlight": {
"message": "Важное"
},
"category_poi_highlight_description": {
"message": "Часть видео, которую ищет большинство людей. По сути заменяет комментарии типа \"Видео начинается с x:xx\"."
},
"category_livestream_messages": {
"message": "Прямые трансляции: пожертвование/чтение сообщения"
},
"category_livestream_messages_short": {
"message": "Чтение сообщений"
},
"disable": {
"message": "Отключить"
"autoSkip": {
"message": "Автоматический пропуск"
},
"manualSkip": {
"message": "Пропускать вручную"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Показывать в полосе прокрутки"
},
"disable": {
"message": "Отключить"
},
"autoSkip_POI": {
"message": "Автоматически пропускать к началу видео"
},
"manualSkip_POI": {
"message": "Спрашивать после загрузки видео"
},
"showOverlay_POI": {
"message": "Показывать в полосе прокрутки"
},
"autoSkipOnMusicVideos": {
"message": "Пропускать все сегменты автоматически при наличии сегмента без музыки"
},
"muteSegments": {
"message": "Разрешить сегменты, которые отключают звук вместо пропуска"
},
"colorFormatIncorrect": {
"message": "Вы ввели цвет в неправильном формате. Это должно быть 3-х или 6-ти значное шестнадцатеричное число с символом # в начале."
},
@@ -601,6 +656,9 @@
"message": "Чтобы отправить сегменты категории \"{0}\", вы должны включить её в настройках. Сейчас вы будете туда перенаправлены.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Предупреждение: Только один сегмент данного типа может быть активным. Отправка нескольких приведёт к отображению только одного случайно выбранного."
},
"youMustSelectACategory": {
"message": "Вы должны выбрать категорию для всех сегментов, которые вы отправляете!"
},
@@ -645,7 +703,7 @@
"message": "Рекомендуем включить \"Принудительная проверка каналов перед пропуском\""
},
"downvoteDescription": {
"message": "Неверно указано время"
"message": "Не нужен/неверно указано время"
},
"incorrectCategory": {
"message": "Неверная категория"
@@ -672,6 +730,10 @@
"help": {
"message": "Помощь"
},
"GotIt": {
"message": "Ясно",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Отказаться от всех будущих экспериментов",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Скрыть навсегда"
},
"warningChatInfo": {
"message": "Вы получили предупреждение и временно не можете отправлять сегменты. Мы заметили, что вы совершали распространенные ошибки, которые не являются злонамеренными, и просто хотим уточнить для вас правила. Вы также можете присоединиться к нашему чату, используя discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
"message": "Вы получили предупреждение и временно не можете отправлять сегменты. Мы заметили, что вы совершали распространенные ошибки, которые не являются злонамеренными, и просто хотим уточнить для вас правила. Вы также можете присоединиться к нашему чату, используя discord.gg/SponsorBlock или matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Голосование отклонено из-за предупреждения. Нажмите, чтобы открыть чат, где вы можете решить проблему, или вернитесь, когда у вас будет время.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Пожертвовать"
},
"hideDonationLink": {
"message": "Скрыть ссылку на пожертвование"
},
"helpPageThanksForInstalling": {
"message": "Спасибо за установку SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Пожалуйста, ознакомьтесь с настройками ниже"
},
"helpPageFeatureDisclaimer": {
"message": "Многие функции по умолчанию отключены. Если вы хотите пропускать начальные и конечные заставки, использовать Invidious и т.д., включите их ниже. Вы также можете скрыть/показать элементы интерфейса."
},
"helpPageHowSkippingWorks": {
"message": "Как работает пропуск"
},
"helpPageHowSkippingWorks1": {
"message": "Сегменты видео будут автоматически пропущены, если они находятся в базе данных. Вы можете открыть всплывающее окно, нажав на значок расширения, чтобы посмотреть, какие сегменты добавлены."
},
"helpPageHowSkippingWorks2": {
"message": "Когда вы будете пропускать сегмент, вы получите уведомление. Если время покажется вам неправильным, проголосуйте против, нажав на палец вниз! Вы также можете проголосовать во всплывающем окне."
},
"Submitting": {
"message": "Отправка"
},
"helpPageSubmitting1": {
"message": "Отправка может быть выполнена во всплывающем окне нажатием на кнопку \"Сегмент начинается отсюда\" или кнопками в видеоплеере."
},
"helpPageSubmitting2": {
"message": "Нажатие на кнопку воспроизведения означает начало сегмента и нажатие на кнопку стоп обозначает его конец. Вы можете обозначить несколько сегментов перед тем, как нажать на кнопку отправки. Нажатие на корзину удалит всё."
},
"Editing": {
"message": "Редактирование"
},
"helpPageEditing1": {
"message": "Если вы сделали что-то не так, вы можете отредактировать или удалить сегменты, нажав на кнопку со стрелкой вверх."
},
"helpPageTooSlow": {
"message": "Это слишком медленно"
},
"helpPageTooSlow1": {
"message": "Всё это также можно делать при помощи горячих клавиш. Нажмите клавишу \"ж\" для указания начала/конца сегмента, \"э\" для отправки. Клавиши могут быть изменены в настройках. Если вы не используете QWERTY, то стоит сразу поменять горячее клавиши."
},
"helpPageCopyOfDatabase": {
"message": "Могу ли я получить копию базы данных? Что если вы пропадёте?"
},
"helpPageCopyOfDatabase1": {
"message": "База данных доступна для всех здесь:"
},
"helpPageCopyOfDatabase2": {
"message": "Исходный код в открытом доступе, так что даже если что-то случится со мной, ваш вклад не пропадёт."
},
"helpPageNews": {
"message": "Новости и как это сделано"
},
"helpPageSourceCode": {
"message": "Где можно получить исходный код?"
},
"Credits": {
"message": "Авторы"
},
"highlightNewFeature": {
"message": "Новинка! Переходите сразу к главному моменту видео с помощью новой категории \"Важное\""
},
"LearnMore": {
"message": "Узнать больше"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Znovu preskočiť"
},
"unmute": {
"message": "Zrušiť stíšenie"
},
"paused": {
"message": "Pozastavené"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Nastala chyba pripojenia. Kód chyby: "
},
"wantToSubmit": {
"message": "Chcete odoslať segmenty pre video id"
},
"clearTimes": {
"message": "Zmazať segmenty"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Nastaviť Používateľské meno"
},
"copyPublicID": {
"message": "Skopírovať verejné ID používateľa"
},
"discordAdvert": {
"message": "Pripojte sa k oficiálnemu Discord serveru a zanechajte nám pripomienky!"
},
@@ -224,6 +227,9 @@
"showNotice": {
"message": "Znovu zobraziť upozornenie"
},
"showSkipNotice": {
"message": "Zobraziť upozornenie pri preskočení segmentu"
},
"longDescription": {
"message": "SponsorBlock umožňuje preskočiť sponzorov, úvodné časti, záverečné časti, pripomienky na odber, nehudobné časti videoklipov alebo iné otravné časti YouTube videí. SponsorBlock je crowdsourceové rozšírenie prehliadača, pomocou ktorého môže ktokoľvek označiť začiatok a koniec takéhoto segmentu. Po odoslaní potom všetci ostatní s týmto rozšírením tieto segmenty automaticky preskočia.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +287,30 @@
"skip": {
"message": "Preskočiť"
},
"mute": {
"message": "Stíšiť"
},
"skip_category": {
"message": "Preskočiť {0}?"
},
"mute_category": {
"message": "Stíšiť {0}?"
},
"skip_to_category": {
"message": "Preskočiť na {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "preskočené"
"message": "{0} preskočené",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} stíšený",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Preskočené na {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Zakázať Automatické Preskočenie"
@@ -336,7 +361,7 @@
"message": "Import/export vášho ID používateľa"
},
"whatChangeUserID": {
"message": "Toto si držte v bezpečí. Je to ako heslo a nemali by ste ho s nikým zdieľať. Ten kto ho má by sa mohol zas vydávať."
"message": "Toto si starostlivo uchovajte. Podobne ako heslo by ste to nemali s nikým zdieľať. Ak by to získal niekto ďalší, mohol bym uškodiť. Ak hľadáte vaše verejné ID používateľa, stlačte ikonu schránky v podokne."
},
"setUserID": {
"message": "Nastaviť Používateľove ID"
@@ -347,12 +372,6 @@
"createdBy": {
"message": "Vytvoril"
},
"autoSkip": {
"message": "Automatické Preskočenie"
},
"showSkipNotice": {
"message": "Zobraziť upozornenie pri preskočení segmentu"
},
"keybindCurrentlySet": {
"message": ". Aktuálne je nastavené na:"
},
@@ -544,14 +563,20 @@
"category_music_offtopic_short": {
"message": "Bez hudby"
},
"category_poi_highlight": {
"message": "Hlavný obsah videa"
},
"category_poi_highlight_description": {
"message": "Tá časť videa, ktorú ľudia vyhľadávajú. Podobné komentárom \"Video začína v čase x\"."
},
"category_livestream_messages": {
"message": "Živé vysielanie: oznamy a dary"
},
"category_livestream_messages_short": {
"message": "Oznamy"
},
"disable": {
"message": "Zakázať"
"autoSkip": {
"message": "Automatické Preskočenie"
},
"manualSkip": {
"message": "Manuálne Preskočenie"
@@ -559,9 +584,24 @@
"showOverlay": {
"message": "Zobraziť v časovej lište"
},
"disable": {
"message": "Zakázať"
},
"autoSkip_POI": {
"message": "Automaticky preskočiť na začiatok"
},
"manualSkip_POI": {
"message": "Opýtať sa, keď sa video nahraje"
},
"showOverlay_POI": {
"message": "Zobraziť v časovej lište"
},
"autoSkipOnMusicVideos": {
"message": "Automaticky preskočiť všetky segmenty ak neexistuje segment bez hudby"
},
"muteSegments": {
"message": "Povoliť segmenty, ktoré namiesto preskočenia stíšía zvuk"
},
"colorFormatIncorrect": {
"message": "Vaša farba je nesprávne naformátovaná. Mal by to byť 3 alebo 6-miestny hexadecimálny kód so znakom čísla na začiatku."
},
@@ -601,6 +641,9 @@
"message": "Pre odoslanie segmentov z kategórie \"{0}\" ju musíte zapnúť v nastaveniach. Teraz tam budete presmerovaní.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Varovanie: Tento typ segmentu môže byť aktívny len jeden. Odoslanie viacerých spôsobí zobrazenie náhodného z nich."
},
"youMustSelectACategory": {
"message": "Musíte zvoliť kategóriu pre každý segment!"
},
@@ -672,6 +715,10 @@
"help": {
"message": "Pomocník"
},
"GotIt": {
"message": "Rozumiem",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Odmietnuť všetky budúce experimenty",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +727,79 @@
"message": "Navždy skryť"
},
"warningChatInfo": {
"message": "Dostali ste varovanie a nemôžete tak dočasne odosielať segmenty. To znamená, že sme si všimli, že ste spravili nejaké chyby, ktoré nie sú myslené zle, a chceme Vám len objasniť pravidlá. Môžete sa pripojiť do konverzácie pomocou discord.gg/SponsorBlock alebo matrix.to/#/+sponsor:ajay.app"
"message": "Dostali ste varovanie a nemôžete tak dočasne odosielať segmenty. To znamená, že sme si všimli, že ste spravili nejaké chyby, ktoré nie sú myslené zle, a chceme Vám len objasniť pravidlá. Môžete sa pripojiť do konverzácie pomocou discord.gg/SponsorBlock alebo matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Hlasovanie bolo zamietnuté kvôli varovaniu. Kliknite pre otvorenie chatu, aby ste ho vyriešili, alebo sa vrátťe až budete mať čas.",
"message": "Hlasovanie bolo zamietnuté kvôli varovaniu. Kliknite pre otvorenie chatu, aby ste ho vyriešili, alebo sa vráťte až budete mať čas.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Prispieť"
},
"hideDonationLink": {
"message": "Skryť možnosti prispenia"
},
"helpPageThanksForInstalling": {
"message": "Ďakujeme za inštaláciu SponsorBlock-u."
},
"helpPageReviewOptions": {
"message": "Skontrolujte prosím možnosti nižšie"
},
"helpPageFeatureDisclaimer": {
"message": "Veľa funkcií je vo východiskovom stave vypnutých. Ak chcete preskakovať úvody, závery, používať Invidious apod., zapnite ich nižšie. Taktiež môžete zobraziť alebo skryť niektoré ovládacie prvky."
},
"helpPageHowSkippingWorks": {
"message": "Ako funguje preskakovanie"
},
"helpPageHowSkippingWorks1": {
"message": "Video segmenty budú automaticky preskočené, ak sa nájdu v databáze. Zobraziť si ich môžete po kliknutí na ikonu rozšírenia vo vyskakovacom okne."
},
"helpPageHowSkippingWorks2": {
"message": "Vždy keď preskočíte segment, tak dostanete oznam. Ak sa vám nepozdáva načasovanie, môžete o tom zahlasovať palcom dole! Zahlasovať tiež môžete vo vyskakovacom okne."
},
"Submitting": {
"message": "Odosielam"
},
"helpPageSubmitting1": {
"message": "Odosielanie môžete vykonať z vyskakovacieho okna stlačením \"Začiatok segmentu\" alebo priamo tlačidlami v prehrávači."
},
"helpPageSubmitting2": {
"message": "Stlačenie tlačidla Prehrať označí začiatok segmentu a stlačenie tlačidla Stop označí koniec. Takto viete označiť aj viac segmentov pred odoslaním. Stlačením tlačidla \"Nahrať\" segmenty odošlete. Stlačením tlačidla \"Kôš\" segmenty zmažete."
},
"Editing": {
"message": "Úpravy"
},
"helpPageEditing1": {
"message": "Ak ste sa pomýlili, môžete segment upraviť alebo zmazať po stlačení šípky hore."
},
"helpPageTooSlow": {
"message": "Príliš pomalé"
},
"helpPageTooSlow1": {
"message": "Môžete využiť aj klávesové skratky. Bodkočiarka označí začiatok alebo koniec segmentu a apostrof ho odošle."
},
"helpPageCopyOfDatabase": {
"message": "Viem získať kópiu databázy? Čo bude ak zmizneš?"
},
"helpPageCopyOfDatabase1": {
"message": "Databáza je verejná a dostupná na"
},
"helpPageCopyOfDatabase2": {
"message": "Zdrojový kód je voľne dostupný. Takže aj keby sa mi niečo stalo, vaše príspevky sa nestratia."
},
"helpPageNews": {
"message": "Novinky a ako to funguje"
},
"helpPageSourceCode": {
"message": "Kde môžem získať zdrojový kód?"
},
"Credits": {
"message": "Autori"
},
"highlightNewFeature": {
"message": "Novinka! Pomocou novej kategórie \"Hlavný obsah videa\" môžete jedným klikom preskočiť \"k veci\""
},
"LearnMore": {
"message": "Zistiť viac"
}
}

View File

@@ -1 +1,30 @@
{}
{
"Options": {
"message": "Подешавања"
},
"sourceCode": {
"message": "Изворни код",
"description": "Used on Firefox Store Page"
},
"errorCode": {
"message": "Код грешке: "
},
"skip": {
"message": "Прескочи"
},
"add": {
"message": "Додај"
},
"save": {
"message": "Сачувај"
},
"cancel": {
"message": "Откажи"
},
"edit": {
"message": "Измени"
},
"help": {
"message": "Помоћ"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Hoppa över igen"
},
"unmute": {
"message": "Ljud"
},
"paused": {
"message": "Pausad"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Anslutningsfel. Felkod: "
},
"wantToSubmit": {
"message": "Vill du skicka in för video-ID"
},
"clearTimes": {
"message": "Rensa segmenten"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Ange användarnamn"
},
"copyPublicID": {
"message": "Kopiera publikt Användar-ID"
},
"discordAdvert": {
"message": "Gå med i den officiella discordservern för att ge förslag och feedback!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Visa Notisen Igen"
},
"showSkipNotice": {
"message": "Visa ett meddelande efter att ett segment har hoppats över"
},
"noticeVisibilityMode0": {
"message": "Hoppa över-meddelanden i fullstorlek"
},
"noticeVisibilityMode1": {
"message": "Små meddelanden för automatisk hoppa över"
},
"noticeVisibilityMode2": {
"message": "Alla hoppa över-meddelanden är små"
},
"noticeVisibilityMode3": {
"message": "Meddelanden som tonar bort för automatisk hoppa över"
},
"noticeVisibilityMode4": {
"message": "Alla hoppa över-meddelanden tonas bort"
},
"longDescription": {
"message": "SponsorBlock låter dig hoppa över sponsormeddelanden, introduktioner, eftertexter, prenumerationspåminnelser och andra irriterande delar av YouTube-videor. SponsorBlock är ett crowdsourced webbläsartillägg som låter vem som helst att skicka in start- och sluttid på sponsorsegment och andra segment av YouTube-videor. När en person skickar in denna information kommer alla andra som har detta tillägg installerat att hoppa över det sponsrade segmentet. Du kan även hoppa över icke-musikavsnitt i musikvideor.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +302,30 @@
"skip": {
"message": "Hoppa över"
},
"mute": {
"message": "Ljudlös"
},
"skip_category": {
"message": "Hoppa över {0}?"
},
"mute_category": {
"message": "Gör {0} ljudlös?"
},
"skip_to_category": {
"message": "Hoppa till {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Skippat"
"message": "{0} överhoppad",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} ljudlös",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Hoppat till {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Inaktivera hoppa över automatiskt"
@@ -336,7 +376,7 @@
"message": "Importera/Exportera Ditt AnvändarID"
},
"whatChangeUserID": {
"message": "Denna ska hållas privat. Den fungerar som ett lösenord och ska inte delas med någon. Om någon får tag i den kan de utge sig för att vara dig."
"message": "Detta ska hållas privat. Detta är som ett lösenord och ska inte delas med någon. Om andra får tag i det kan de utge sig för att vara dig. Om du letar efter ditt offentliga Användar-ID kan du klicka på urklippsikonen i popupen."
},
"setUserID": {
"message": "Ange AnvändarID"
@@ -347,12 +387,6 @@
"createdBy": {
"message": "Skapad av"
},
"autoSkip": {
"message": "Hoppa över automatiskt"
},
"showSkipNotice": {
"message": "Visa ett meddelande efter att ett segment har hoppats över"
},
"keybindCurrentlySet": {
"message": ". Nuvarande snabbtangent är:"
},
@@ -544,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Icke-musik"
},
"category_poi_highlight": {
"message": "Markera"
},
"category_poi_highlight_description": {
"message": "Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"."
},
"category_livestream_messages": {
"message": "Liveström: Donations-/meddelandeavläsningar"
},
"category_livestream_messages_short": {
"message": "Meddelandeläsning"
},
"disable": {
"message": "Inaktivera"
"autoSkip": {
"message": "Hoppa över automatiskt"
},
"manualSkip": {
"message": "Hoppa över manuellt"
@@ -559,9 +599,24 @@
"showOverlay": {
"message": "Visa i sökfältet"
},
"disable": {
"message": "Inaktivera"
},
"autoSkip_POI": {
"message": "Hoppa automatiskt till start"
},
"manualSkip_POI": {
"message": "Fråga när video laddas"
},
"showOverlay_POI": {
"message": "Visa i sökfältet"
},
"autoSkipOnMusicVideos": {
"message": "Hoppa över alla segment automatiskt när det finns ett icke-musiksegment"
},
"muteSegments": {
"message": "Tillåt segment som tystar ljudet i stället för att hoppa över"
},
"colorFormatIncorrect": {
"message": "Din färg är felaktigt formaterad. Det ska vara en 3- eller 6-siffrig hex-kod med en siffra i början."
},
@@ -601,6 +656,9 @@
"message": "För att skicka segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Varning: Denna typ av segment kan endast ha ett segment aktivt åt gången. Skickas flera segment kommer en av dem att visas slumpmässigt."
},
"youMustSelectACategory": {
"message": "Du måste välja en kategori för alla segment du skickar in!"
},
@@ -645,7 +703,7 @@
"message": "Överväg att aktivera \"Tvinga kontroll av kanalen innan hoppa över\""
},
"downvoteDescription": {
"message": "Fel timing"
"message": "Fel/Fel tidsintervall"
},
"incorrectCategory": {
"message": "Fel kategori"
@@ -672,6 +730,10 @@
"help": {
"message": "Hjälp"
},
"GotIt": {
"message": "Jag förstår",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Hoppa av alla framtida experiment",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +742,79 @@
"message": "Dölj för alltid"
},
"warningChatInfo": {
"message": "Du har fått en tillfällig varning och kan inte skicka in segment. Detta innebär att vi har upptäckt att några vanliga misstag är gjorda som inte är uppsåtliga och vi vill bara klargöra reglerna. Du kan också gå med i den här chatten genom att använda discord.gg/SponsorBlock eller matrix.to/#/+sponsor:ajay.app"
"message": "Du har fått en tillfällig varning och kan inte skicka in segment. Detta innebär att vi har upptäckt att några vanliga misstag är gjorda som inte är uppsåtliga och vi vill bara klargöra reglerna. Du kan också gå med i den här chatten genom att använda discord.gg/SponsorBlock eller matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Rösten avvisades på grund av en varning. Klicka för att öppna ett chattfönster för att lösa problemet eller kom tillbaka senare när du har tid.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Donera"
},
"hideDonationLink": {
"message": "Dölj donationslänk"
},
"helpPageThanksForInstalling": {
"message": "Tack för att du installerade SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Granska alternativen nedan"
},
"helpPageFeatureDisclaimer": {
"message": "Många funktioner är inaktiverade som standard. Om du vill hoppa över intros, outros, använda Invidious, etc, aktivera dem nedan. Du kan också dölja/visa UI-element."
},
"helpPageHowSkippingWorks": {
"message": "Hur hoppa över fungerar"
},
"helpPageHowSkippingWorks1": {
"message": "Videosegment hoppas över automatiskt om de finns i databasen. Du kan öppna popup-fönstret genom att klicka på tilläggsikonen för att få en förhandsvisning av vad de är."
},
"helpPageHowSkippingWorks2": {
"message": "När du hoppar över ett segment får du ett meddelande. Om tidpunkten verkar felaktig rösta då ner genom att klicka på nerröstning! Du kan också rösta i popup-fönstret."
},
"Submitting": {
"message": "Skickar in"
},
"helpPageSubmitting1": {
"message": "Skicka in kan antingen göras i popup-fönstret genom att trycka på knappen \"Segmentet startar nu\" eller i videospelaren med knapparna på spelaren."
},
"helpPageSubmitting2": {
"message": "Genom att klicka på uppspelningsknappen anges början på ett segment och genom att klicka på stopp-ikonen anges slutet. Du kan förbereda flera sponsorer innan du trycker på skicka. Klicka på uppladdningsknappen för att skicka in. Klicka på papperskorgen för att ta bort."
},
"Editing": {
"message": "Redigerar"
},
"helpPageEditing1": {
"message": "Om du gör fel kan du redigera eller ta bort dina segment efter att du klickat på uppåtpilen."
},
"helpPageTooSlow": {
"message": "Detta är för långsamt"
},
"helpPageTooSlow1": {
"message": "Det finns snabbtangenter om du vill använda dem. Tryck på semikolontangenten för att ange start/slut på ett sponsorsegment och klicka på apostrofen för att skicka in. Dessa kan ändras i inställningarna. Om du inte använder QWERTY, bör du förmodligen ändra tangentbindningen."
},
"helpPageCopyOfDatabase": {
"message": "Kan jag få en kopia av databasen? Vad händer om du försvinner?"
},
"helpPageCopyOfDatabase1": {
"message": "Databasen är offentlig och finns på"
},
"helpPageCopyOfDatabase2": {
"message": "Källkoden är fritt tillgänglig. Så, även om något händer mig, är dina bidrag inte förlorade."
},
"helpPageNews": {
"message": "Nyheter och hur är det gjort"
},
"helpPageSourceCode": {
"message": "Var kan jag få tag på källkoden?"
},
"Credits": {
"message": "Medverkande"
},
"highlightNewFeature": {
"message": "Nytt! Ta dig till stället i videon med ett klick med den nya markeringskategorin"
},
"LearnMore": {
"message": "Läs mer"
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "இணைப்பு பிழை ஏற்பட்டது. பிழை குறியீடு: "
},
"wantToSubmit": {
"message": "வீடியோ ஐடிக்கு நீங்கள் சமர்ப்பிக்க விரும்புகிறீர்களா"
},
"clearTimes": {
"message": "பிரிவுகளை அழிக்கவும்"
},
@@ -212,6 +209,9 @@
"showNotice": {
"message": "அறிவிப்பை மீண்டும் காட்டு"
},
"showSkipNotice": {
"message": "ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"
},
"longDescription": {
"message": "ஸ்பான்சர்கள், அறிமுகங்கள், அவுட்ரோஸ், சந்தா நினைவூட்டல்கள் மற்றும் YouTube வீடியோக்களின் பிற எரிச்சலூட்டும் பகுதிகளைத் தவிர்க்க ஸ்பான்சர் பிளாக் உங்களை அனுமதிக்கிறது. ஸ்பான்சர் பிளாக் என்பது ஒரு கூட்ட நெரிசலான உலாவி நீட்டிப்பாகும், இது ஸ்பான்சர் செய்யப்பட்ட பிரிவுகளின் தொடக்க மற்றும் இறுதி நேரங்களையும் YouTube வீடியோக்களின் பிற பிரிவுகளையும் எவரும் சமர்ப்பிக்கலாம். ஒரு நபர் இந்த தகவலைச் சமர்ப்பித்தவுடன், இந்த நீட்டிப்பு உள்ள மற்றவர்கள் ஸ்பான்சர் செய்யப்பட்ட பிரிவைத் தவிர்த்து விடுவார்கள். இசை வீடியோக்களின் இசை அல்லாத பிரிவுகளையும் நீங்கள் தவிர்க்கலாம்.",
"description": "Full description of the extension on the store pages."
@@ -269,9 +269,6 @@
"skip_category": {
"message": "{0} ஐ தவிர்?"
},
"skipped": {
"message": "தவிர்க்கப்பட்டது"
},
"disableAutoSkip": {
"message": "ஆட்டோ ஸ்கிப்பை முடக்கு"
},
@@ -320,9 +317,6 @@
"changeUserID": {
"message": "உங்கள் பயனர் ஐடியை இறக்குமதி / ஏற்றுமதி செய்யுங்கள்"
},
"whatChangeUserID": {
"message": "இதை தனிப்பட்ட முறையில் வைத்திருக்க வேண்டும். இது கடவுச்சொல் போன்றது மற்றும் யாருடனும் பகிரக்கூடாது. யாராவது இதை வைத்திருந்தால், அவர்கள் உங்களைப் போல ஆள்மாறாட்டம் செய்யலாம்."
},
"setUserID": {
"message": "UserID ஐ அமைக்கவும்"
},
@@ -332,12 +326,6 @@
"createdBy": {
"message": "உருவாக்கியது"
},
"autoSkip": {
"message": "ஆட்டோ ஸ்கிப்"
},
"showSkipNotice": {
"message": "ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"
},
"keybindCurrentlySet": {
"message": ". இது தற்போது அமைக்கப்பட்டுள்ளது:"
},
@@ -504,8 +492,8 @@
"category_livestream_messages_short": {
"message": "செய்தி வாசிப்பு"
},
"disable": {
"message": "முடக்கு"
"autoSkip": {
"message": "ஆட்டோ ஸ்கிப்"
},
"manualSkip": {
"message": "கையேடு தவிர்"
@@ -513,6 +501,9 @@
"showOverlay": {
"message": "சீக் பட்டியில் காட்டு"
},
"disable": {
"message": "முடக்கு"
},
"colorFormatIncorrect": {
"message": "உங்கள் நிறம் தவறாக வடிவமைக்கப்பட்டுள்ளது. இது ஆரம்பத்தில் எண் அடையாளத்துடன் 3 அல்லது 6 இலக்க ஹெக்ஸ் குறியீடாக இருக்க வேண்டும்."
},

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "కనెక్షన్ లోపం సంభవించింది. లోపం కోడ్: "
},
"wantToSubmit": {
"message": "మీరు వీడియో ఐడి కోసం సమర్పించాలనుకుంటున్నారా"
},
"clearTimes": {
"message": "విభాగాలను క్లియర్ చేయండి"
},
@@ -212,6 +209,9 @@
"showNotice": {
"message": "మళ్ళీ నోటీసు చూపించు"
},
"showSkipNotice": {
"message": "ఒక విభాగం దాటవేయబడిన తర్వాత నోటీసు చూపించు"
},
"longDescription": {
"message": "స్పాన్సర్లు, పరిచయాలు, ros ట్రోలు, చందా రిమైండర్‌లు మరియు YouTube వీడియోల యొక్క ఇతర బాధించే భాగాలను దాటవేయడానికి స్పాన్సర్‌బ్లాక్ మిమ్మల్ని అనుమతిస్తుంది. స్పాన్సర్బ్లాక్ అనేది క్రౌడ్ సోర్స్డ్ బ్రౌజర్ పొడిగింపు, ఇది ఎవరైనా స్పాన్సర్ చేసిన విభాగాలు మరియు యూట్యూబ్ వీడియోల యొక్క ప్రారంభ మరియు ముగింపు సమయాన్ని సమర్పించనివ్వండి. ఒక వ్యక్తి ఈ సమాచారాన్ని సమర్పించిన తర్వాత, ఈ పొడిగింపు ఉన్న ప్రతి ఒక్కరూ ప్రాయోజిత విభాగంలో దాటవేస్తారు. మీరు మ్యూజిక్ వీడియోల యొక్క నాన్-మ్యూజిక్ విభాగాలను కూడా దాటవేయవచ్చు.",
"description": "Full description of the extension on the store pages."
@@ -269,9 +269,6 @@
"skip_category": {
"message": "{0} ని దాటవేయాలా?"
},
"skipped": {
"message": "దాటవేయబడింది"
},
"disableAutoSkip": {
"message": "ఆటో దాటవేయిని ఆపివేయి"
},
@@ -320,9 +317,6 @@
"changeUserID": {
"message": "మీ యూజర్‌ఐడిని దిగుమతి / ఎగుమతి చేయండి"
},
"whatChangeUserID": {
"message": "దీన్ని ప్రైవేట్‌గా ఉంచాలి. ఇది పాస్‌వర్డ్ లాంటిది మరియు ఎవరితోనూ భాగస్వామ్యం చేయకూడదు. ఎవరైనా దీన్ని కలిగి ఉంటే, వారు మిమ్మల్ని వంచించగలరు."
},
"setUserID": {
"message": "UserID ని సెట్ చేయండి"
},
@@ -332,12 +326,6 @@
"createdBy": {
"message": "సృష్టికర్త"
},
"autoSkip": {
"message": "ఆటో దాటవేయి"
},
"showSkipNotice": {
"message": "ఒక విభాగం దాటవేయబడిన తర్వాత నోటీసు చూపించు"
},
"keybindCurrentlySet": {
"message": ". ఇది ప్రస్తుతం దీనికి సెట్ చేయబడింది:"
},
@@ -504,8 +492,8 @@
"category_livestream_messages_short": {
"message": "సందేశ పఠనం"
},
"disable": {
"message": "డిసేబుల్"
"autoSkip": {
"message": "ఆటో దాటవేయి"
},
"manualSkip": {
"message": "మాన్యువల్ దాటవేయి"
@@ -513,6 +501,9 @@
"showOverlay": {
"message": "సీక్ బార్‌లో చూపించు"
},
"disable": {
"message": "డిసేబుల్"
},
"colorFormatIncorrect": {
"message": "మీ రంగు తప్పుగా ఆకృతీకరించబడింది. ఇది ప్రారంభంలో సంఖ్య గుర్తుతో 3 లేదా 6 అంకెల హెక్స్ కోడ్ అయి ఉండాలి."
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Tekrar atla"
},
"unmute": {
"message": "Sesi Aç"
},
"paused": {
"message": "Duraklatıldı"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Bağlantı hatası oluştu. Hata kodu: "
},
"wantToSubmit": {
"message": "Bu video kimliği için göndermek istiyor musun"
},
"clearTimes": {
"message": "Kısımları temizle"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Kullanıcı Adı Belirle"
},
"copyPublicID": {
"message": "Herkese Açık Kullanıcı Kimliğini Kopyala"
},
"discordAdvert": {
"message": "Öneri ve geri bildirimleriniz için resmi Discord serverımıza katılın!"
},
@@ -224,6 +227,18 @@
"showNotice": {
"message": "Uyarıyı Tekrar Göster"
},
"showSkipNotice": {
"message": "Bir Kısmı Atladıktan Sonra Uyarı Göster"
},
"noticeVisibilityMode0": {
"message": "Tam Boyutlu Atlama Bildirimleri"
},
"noticeVisibilityMode1": {
"message": "Otomatik Atlama için Küçük Atlama Bildirimleri"
},
"noticeVisibilityMode2": {
"message": "Tüm Küçük Atlama Bildirimleri"
},
"longDescription": {
"message": "SponsorBlock, sponsorları, giriş ve bitiş kısımlarını, abonelik hatırlatıcılarını ve YouTube videolarının diğer can sıkıcı kısımlarını atlamanıza olanak tanır. SponsorBlock, herkesin sponsorlu kısımları ve YouTube videolarının diğer kısımlarının başlangıç ve bitiş zamanlarını göndermesine izin veren kitle kaynaklı bir tarayıcı uzantısıdır. Bir kişi bu bilgiyi gönderdikten sonra, bu uzantıya sahip diğer herkes sponsorlu kısımları hemen atlayacaktır. Müzik videolarının müzik dışı bölümlerini de atlayabilirsiniz.",
"description": "Full description of the extension on the store pages."
@@ -281,11 +296,23 @@
"skip": {
"message": "Atla"
},
"mute": {
"message": "Sustur"
},
"skip_category": {
"message": "{0} atla?"
},
"skip_to_category": {
"message": "{0} kısmına atlansın mı?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Atlandı"
"message": "{0} Atlandı",
"description": "Example: Sponsor Skipped"
},
"skipped_to_category": {
"message": "{0} kısmına atlandı",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Otomatik Atlamayı Devredışı Bırak"
@@ -336,7 +363,7 @@
"message": "Kullanıcı kimliğini Dışarı/İçeri Aktar"
},
"whatChangeUserID": {
"message": "Bu gizli tutulmalıdır. Bu bir şifreye benzer ve diğerleriyle paylaşılmaması gerekir. Birinin eline geçerse, sizi taklit edebilir."
"message": "Bu gizli tutulmalıdır. Bu bir şifre gibidir ve kimseyle paylaşılmamalıdır. Eğer birisi buna sahipse, seni taklit edebilir. Herkese açık kullanıcı kimliğinizi arıyorsanız, açılır pencerede pano simgesine tıklayın."
},
"setUserID": {
"message": "Kullanıcı kimliği Belirle"
@@ -347,12 +374,6 @@
"createdBy": {
"message": "Oluşturan"
},
"autoSkip": {
"message": "Otomatik Atla"
},
"showSkipNotice": {
"message": "Bir Kısmı Atladıktan Sonra Uyarı Göster"
},
"keybindCurrentlySet": {
"message": ". Şu an buna ayarlı:"
},
@@ -544,14 +565,20 @@
"category_music_offtopic_short": {
"message": "Müzik Olmayan Bölüm"
},
"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_livestream_messages": {
"message": "Canlı Yayın: Bağış/Mesaj Okuma"
},
"category_livestream_messages_short": {
"message": "Canlı Yayın Mesajlarını Okumak"
},
"disable": {
"message": "Devredışı"
"autoSkip": {
"message": "Otomatik Atla"
},
"manualSkip": {
"message": "Elle Atla"
@@ -559,9 +586,24 @@
"showOverlay": {
"message": "Arama Çubuğunda Göster"
},
"disable": {
"message": "Devredışı"
},
"autoSkip_POI": {
"message": "Başlangıca otomatik atla"
},
"manualSkip_POI": {
"message": "Videonun başında sor"
},
"showOverlay_POI": {
"message": "Arama Çubuğunda Göster"
},
"autoSkipOnMusicVideos": {
"message": "Müzik olmayan kısım varsa tüm kısımları otomatik atla"
},
"muteSegments": {
"message": "Atlamak yerine sesi kapatan bölümlere izin ver"
},
"colorFormatIncorrect": {
"message": "Renginiz yanlış biçimlendirilmiştir. Başında bir kare işareti bulunan 3 veya 6 basamaklı bir onaltılık kod olmalıdır."
},
@@ -672,6 +714,10 @@
"help": {
"message": "Yardım"
},
"GotIt": {
"message": "Anladım",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Gelecekteki deneylerin hiçbirine katılma",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
@@ -680,10 +726,28 @@
"message": "Asla gösterme"
},
"warningChatInfo": {
"message": "Bir uyarı aldınız ve geçici bir süreliğine kısım gönderemeyeceksiniz. Sizin kısım göndermede zararlı olmayan bazı hatalar yaptığınızı belirledik ve size kurallarııklamak istiyoruz. Bu sohbete discord.gg/SponsorBlock veya matrix.to/#/+sponsor:ajay.app üzerinden de katılabilirsiniz"
"message": "Bir uyarı aldınız ve geçici bir süreliğine kısım gönderemeyeceksiniz. Sizin kısım göndermede zararlı olmayan bazı hatalar yaptığınızı belirledik ve size kurallarııklamak istiyoruz. Bu sohbete discord.gg/SponsorBlock veya matrix.to/#/#sponsor:ajay.app üzerinden de katılabilirsiniz"
},
"voteRejectedWarning": {
"message": "Bir uyarı nedeniyle oy reddedildi. Çözüm bulmak için buraya tıklayarak bir sohbet açın veya daha sonra vaktiniz olduğunda uğrayın.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Bağış Yap"
},
"hideDonationLink": {
"message": "Bağış Bağlantısını Gizle"
},
"helpPageThanksForInstalling": {
"message": "SponsorBlock'u yüklediğiniz için teşekkürler."
},
"helpPageReviewOptions": {
"message": "Lütfen aşağıdaki seçenekleri inceleyin"
},
"helpPageFeatureDisclaimer": {
"message": "Birçok özellik varsayılan olarak devre dışıdır. İntroları, outroları atlamak vb. kullanmak istiyorsanız, bunları aşağıdan etkinleştirin. Ayrıca arayüz öğelerini gizleyebilir/gösterebilirsiniz."
},
"helpPageHowSkippingWorks": {
"message": "Atlama nasıl çalışıyor"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Пропустити"
},
"unmute": {
"message": "Увімкнути звук"
},
"paused": {
"message": "Пауза"
},
@@ -85,6 +88,9 @@
"noVideoID": {
"message": "Відео YouTube, не знайдено.\nЯкщо це не так, поновіть вкладку."
},
"refreshSegments": {
"message": "Оновити сегменти"
},
"success": {
"message": "Успіх!"
},
@@ -97,9 +103,6 @@
"connectionError": {
"message": "Помилка з'єднання. Код помилки: "
},
"wantToSubmit": {
"message": "Ви хочете надіслати сегменти для відео з id"
},
"clearTimes": {
"message": "Очистити сегменти"
},
@@ -158,6 +161,9 @@
"setUsername": {
"message": "Встановити ім'я користувача"
},
"copyPublicID": {
"message": "Копіювати публічний UserID"
},
"discordAdvert": {
"message": "Приєднуйтесь до офіційного сервера Discord, щоб залишити пропозиції і зворотний зв'язок!"
},
@@ -185,6 +191,9 @@
"whatInfoButton": {
"message": "Ця кнопка відкриває спливаюче вікно на сторінці YouTube."
},
"autoHideInfoButton": {
"message": "Кнопка \"Автоматично сховати інформацію\""
},
"hideDeleteButton": {
"message": "Приховати кнопку видалення в плеєрі YouTube"
},
@@ -218,6 +227,24 @@
"showNotice": {
"message": "Показувати сповіщення знову"
},
"showSkipNotice": {
"message": "Показувати сповіщення після пропуску сегмента"
},
"noticeVisibilityMode0": {
"message": "Повнорозмірні сповіщення про пропуски"
},
"noticeVisibilityMode1": {
"message": "Зменшені сповіщення для автоматичних пропусків"
},
"noticeVisibilityMode2": {
"message": "Всі сповіщення зменшеного розміру"
},
"noticeVisibilityMode3": {
"message": "Напівпрозорі сповіщення для автоматичних пропусків"
},
"noticeVisibilityMode4": {
"message": "Напівпрозорі сповіщення для всіх пропусків"
},
"longDescription": {
"message": "SponsorBlock дозволяє пропускати спонсорські вставки, початкові і кінцеві заставки, прохання підписатися і інше в відео на YouTube. SponsorBlock - колективне розширення, яке дозволяє кожному надіслати час початку і кінця подібних сегментів в відео. Після того, як хто-небудь надсилає цю інформацію, всі інші користувачі розширення будуть автоматично пропускати ці сегменти. Так само можна пропускати частини кліпів без музики.",
"description": "Full description of the extension on the store pages."
@@ -275,11 +302,30 @@
"skip": {
"message": "Пропустити"
},
"mute": {
"message": "Вимкнути звук"
},
"skip_category": {
"message": "Пропустити {0}?"
},
"mute_category": {
"message": "Вимкнути звук {0}?"
},
"skip_to_category": {
"message": "Пропустить до {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Пропущено"
"message": "{0} Пропущено",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Вимкнений звук",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Пропущено до {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Вимкнути автоматичний пропуск"
@@ -330,7 +376,7 @@
"message": "Імпортувати/Експортувати Ваш ідентифікатор користувача"
},
"whatChangeUserID": {
"message": "Це потрібно тримати в секреті. Це як пароль, не варто ним ні з ким ділитися. Якщо він у кого-то є, він зможе видати себе за Вас."
"message": "Тримайте його в таємниці. Ставтеся до нього як до паролю і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний ID користувача, натисніть значок буфера обміну у спливаючому вікні."
},
"setUserID": {
"message": "Встановити ідентифікатор користувача"
@@ -341,12 +387,6 @@
"createdBy": {
"message": "Створено"
},
"autoSkip": {
"message": "Автоматичний пропуск"
},
"showSkipNotice": {
"message": "Показувати сповіщення після пропуску сегмента"
},
"keybindCurrentlySet": {
"message": ". Він зараз призначений на:"
},
@@ -390,6 +430,12 @@
"minDurationDescription": {
"message": "Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі."
},
"skipNoticeDuration": {
"message": "Тривалість повідомлення пропуску (в секундах):"
},
"skipNoticeDurationDescription": {
"message": "Повідомлення про пропуск залишиться на екрані принаймні так довго. Для пропуску вручну він може бути видимим довше."
},
"shortCheck": {
"message": "Наступний діапазон часу коротше, ніж Ваше налаштування мінімальної тривалості. Це може означати, що він вже був надісланий, і просто ігнорується через це налаштування. Ви дійсно хочете надіслати?"
},
@@ -532,14 +578,20 @@
"category_music_offtopic_short": {
"message": "Без музики"
},
"category_poi_highlight": {
"message": "Основне"
},
"category_poi_highlight_description": {
"message": "Часть видео, которую ищут большинство людей. Аналогично комментарию «Видео начинается с X:XX»."
},
"category_livestream_messages": {
"message": "Прямі трансляції: пожертвування/читання повідомлення"
},
"category_livestream_messages_short": {
"message": "Читання повідомлень"
},
"disable": {
"message": "Вимкнути"
"autoSkip": {
"message": "Автоматичний пропуск"
},
"manualSkip": {
"message": "Пропуск вручну"
@@ -547,6 +599,24 @@
"showOverlay": {
"message": "Показувати в смузі прокрутки"
},
"disable": {
"message": "Вимкнути"
},
"autoSkip_POI": {
"message": "Автоматический переход к началу"
},
"manualSkip_POI": {
"message": "Спросите, когда видео загружается"
},
"showOverlay_POI": {
"message": "Показать на панели поиска"
},
"autoSkipOnMusicVideos": {
"message": "Автоматично пропустити усі сегменти, якщо присутній сегмент без музики"
},
"muteSegments": {
"message": "Дозволити сегменти, які відключають звук замість пропуску"
},
"colorFormatIncorrect": {
"message": "Ви ввели колір в неправильному форматі. Це повинно бути 3-х або 6-ти значне шістнадцяткове число з символом # на початку."
},
@@ -586,6 +656,9 @@
"message": "Щоб надіслати сегменти категорії \"{0}\", ви повинні включити її в налаштуваннях. Зараз ви будете туди перенаправлені.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Увага: Сегменти даного типу можуть бути активними лише по одному. Надсилання декількох призведе до відображення випадкового сегмента."
},
"youMustSelectACategory": {
"message": "Ви повинні обрати категорію для всіх сегментів, які ви відправляєте!"
},
@@ -654,11 +727,94 @@
"categoryUpdate2": {
"message": "Відкрийте налаштування, щоб пропускати початкові і кінцеві заставки, саморекламу та інше."
},
"help": {
"message": "Довідка"
},
"GotIt": {
"message": "Зрозуміло",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Відмова від усіх майбутніх експериментів",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Сховати назавжди"
},
"warningChatInfo": {
"message": "Ви отримали попередження, тому тимчасово не можете обирати сегменти. Це означає, що ми помітили, що ви робили кілька поширених помилок, які не є злісними. Тому ми хочемо нагадати вам правила. Ви можете приєднатися до чату з правилами використовуючи discord.gg/SponsorBlock або matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Голосування відхилено через попередження. Натисніть, щоб відкрити чат для вирішення цієї проблеми, або поверніться пізніше.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Пожертвувати"
},
"hideDonationLink": {
"message": "Приховати посилання на пожертвування"
},
"helpPageThanksForInstalling": {
"message": "Дякую за встановлення SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Будь ласка, ознайомтеся з налаштуваннями нижче"
},
"helpPageFeatureDisclaimer": {
"message": "Багато функцій за замовчуванням відключені. Якщо ви хочете пропускати початкові і кінцеві заставки, використовувати Invidious, тощо, увімкніть їх нижче. Ви також можете приховати / показати елементи інтерфейсу."
},
"helpPageHowSkippingWorks": {
"message": "Як працює пропуск"
},
"helpPageHowSkippingWorks1": {
"message": "Сегменти відео будуть автоматично пропущені, якщо вони знаходяться в базі даних. Ви можете відкрити спливаюче вікно, натиснувши на значок розширення, щоб подивитися, які сегменти додані."
},
"helpPageHowSkippingWorks2": {
"message": "Коли ви будете пропускати сегмент, ви отримаєте сповіщення. Якщо час здасться вам неправильним, проголосуйте проти, натиснувши на палець вниз! Ви також можете проголосувати у спливаючому вікні."
},
"Submitting": {
"message": "Відправлення"
},
"helpPageSubmitting1": {
"message": "Відправлення може бути виконана у спливаючому вікні натисканням на кнопку \"Сегмент починається звідси\" або кнопками в відеоплеєрі."
},
"helpPageSubmitting2": {
"message": "Натискання на кнопку відтворення означає початок сегмента і натискання на кнопку стоп позначає його кінець. Ви можете позначити кілька сегментів перед тим, як натиснути на кнопку відправлення. Натискання на кошик видалить все."
},
"Editing": {
"message": "Редагування"
},
"helpPageEditing1": {
"message": "Якщо ви зробили щось не так, ви можете відредагувати або видалити сегменти, натиснувши на кнопку зі стрілкою вгору."
},
"helpPageTooSlow": {
"message": "Це занадто повільно"
},
"helpPageTooSlow1": {
"message": "Все це також можна робити за допомогою гарячих клавіш. Натисніть \"ж\" для вказівки початку/кінця сегмента, \"є\" для відправки. Клавіші можуть бути змінені в налаштуваннях. Якщо ви не використовуєте QWERTY, то варто відразу поміняти гарячі клавіші."
},
"helpPageCopyOfDatabase": {
"message": "Чи можу я отримати копію бази даних? Що якщо ви пропадете?"
},
"helpPageCopyOfDatabase1": {
"message": "База даних доступна для всіх тут:"
},
"helpPageCopyOfDatabase2": {
"message": "Вихідний код у відкритому доступі, так що навіть якщо щось трапиться зі мною, ваш вклад не пропаде."
},
"helpPageNews": {
"message": "Новини та як це зроблено"
},
"helpPageSourceCode": {
"message": "Де можна отримати вихідний код?"
},
"Credits": {
"message": "Автори"
},
"highlightNewFeature": {
"message": "Новинка! Переходьте відразу до головного моменту відео за допомогою нової категорії \"Важливе\""
},
"LearnMore": {
"message": "Дізнатися більше"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Bỏ qua lại"
},
"unmute": {
"message": "Bật tiếng"
},
"paused": {
"message": "Tạm dừng"
},
@@ -77,7 +80,7 @@
"message": "Đoạn quảng cáo bắt đầu vào lúc này"
},
"sponsorEnd": {
"message": "Đoạn quảng cáo kết thúc vào lúc này"
"message": "Phân đoạn kết thúc vào lúc này"
},
"sponsorCancel": {
"message": "Huỷ tạo phân đoạn"
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Đã xảy ra lỗi kết nối. Mã của lỗi: "
},
"wantToSubmit": {
"message": "Bạn có muốn đăng đoạn quảng cáo cho video có mã id"
},
"clearTimes": {
"message": "Xóa đoạn quảng cáo"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "Đặt tên người dùng"
},
"copyPublicID": {
"message": "Sao chép Public UserID"
},
"discordAdvert": {
"message": "Hãy tham gia server Discord chính thức để đăng gợi ý và phản hồi!"
},
@@ -224,6 +227,24 @@
"showNotice": {
"message": "Hiện thông báo lại"
},
"showSkipNotice": {
"message": "Hiển thị thông báo sau khi bỏ qua quảng cáo"
},
"noticeVisibilityMode0": {
"message": "Thông báo bỏ qua với kích thước đầy đủ"
},
"noticeVisibilityMode1": {
"message": "Thông báo bỏ qua kích thước nhỏ nếu phân đoạn được tự động bỏ qua"
},
"noticeVisibilityMode2": {
"message": "Thông báo bỏ qua kích thước nhỏ cho toàn bộ phân đoạn"
},
"noticeVisibilityMode3": {
"message": "Thông báo bỏ qua mờ nếu phân đoạn được tự động bỏ qua"
},
"noticeVisibilityMode4": {
"message": "Thông báo bỏ qua mờ cho tất cả các phân đoạn"
},
"longDescription": {
"message": "SponsorBlock giúp bạn bỏ qua quảng cáo từ nhà tài trợ, đoạn giới thiệu, đoạn kết, lời nhắc đăng ký kênh, và những phần khó chịu khác trong các video Youtube. SponsorBlock là một tiện ích mở rộng cho trình duyệt, cho phép tất cả người dùng đăng thời điểm bắt đầu và kết thúc của những đoạn quảng cáo từ nhà tài trợ và các đoạn khác trong video Youtube. Sau khi một người đăng thông tin này lên, tất cả mọi người dùng tiện ích mở rộng này sẽ bỏ qua đoạn quảng cáo đó. Bạn cũng có thể bỏ qua phần không có nhạc trong những video âm nhạc.",
"description": "Full description of the extension on the store pages."
@@ -281,14 +302,14 @@
"skip": {
"message": "Bỏ qua"
},
"mute": {
"message": "Ngắt tiếng"
},
"skip_category": {
"message": "Bỏ qua {0}?"
},
"skipped": {
"message": "Đã bỏ qua"
},
"disableAutoSkip": {
"message": "Tắt tự động bỏ qua quảng cáo"
"message": "Tắt tự động bỏ qua"
},
"enableAutoSkip": {
"message": "Bật tự động bỏ qua quảng cáo"
@@ -336,7 +357,7 @@
"message": "Nhập/Xuất mã người dùng của bạn"
},
"whatChangeUserID": {
"message": "Bạn nên giữ bí mật mã này. Nó như mật khẩu vậy, do đó không nên chia sẻ với người khác. Nếu ai đó có mã này, họ có thể giả mạo bạn."
"message": "Đây là mã cần được giữ bí mật. Nó giống như mật khẩu và không nên được chia sẻ cho bất kì ai khác. Nếu ai đó lấy được mã này, họ có thể mạo danh bạn. Còn nếu như bạn đang tìm khoá ID công khai, hãy nhấn vào nút \"Sao chép Public ID\" trong popup của SponsorBlock."
},
"setUserID": {
"message": "Đặt mã người dùng"
@@ -347,12 +368,6 @@
"createdBy": {
"message": "Được tạo bởi"
},
"autoSkip": {
"message": "Tự động bỏ qua quảng cáo"
},
"showSkipNotice": {
"message": "Hiển thị thông báo sau khi bỏ qua quảng cáo"
},
"keybindCurrentlySet": {
"message": ". Phím đang được đặt:"
},
@@ -533,7 +548,7 @@
"message": "Xem trước/Tóm tắt"
},
"category_preview_description": {
"message": "Tóm tắt nhanh các tập trước, hoặc xem trước những gì sẽ xảy ra sau video hiện tại. Dùng cho các đoạn clip gắn kèm với nhau, không phải cho tóm tắt bằng lời."
"message": "Tóm tắt nhanh về tập trước/tập sau trong 1 chuỗi video (series) dài (hoặc cũng có thể là tóm tắt trước về video sắp chiếu)."
},
"category_music_offtopic": {
"message": "Nhạc: Phần không nhạc"
@@ -544,14 +559,20 @@
"category_music_offtopic_short": {
"message": "Không có nhạc"
},
"category_poi_highlight": {
"message": "Điểm/Khoảnh khắc quan trọng"
},
"category_poi_highlight_description": {
"message": "Phần của video mà hầu hết mọi người đang tìm kiếm. Tương tự với câu nói \"Video bắt đầu từ x\"."
},
"category_livestream_messages": {
"message": "Luồng phát trực tiếp: Đọc Quyên góp/Tin nhắn"
},
"category_livestream_messages_short": {
"message": "Đọc tin nhắn"
},
"disable": {
"message": "Tắt"
"autoSkip": {
"message": "Tự động bỏ qua quảng cáo"
},
"manualSkip": {
"message": "Bỏ qua thủ công"
@@ -559,6 +580,24 @@
"showOverlay": {
"message": "Hiện ở thanh xem trước"
},
"disable": {
"message": "Tắt"
},
"autoSkip_POI": {
"message": "Tự động bỏ qua"
},
"manualSkip_POI": {
"message": "Hỏi khi video bắt đầu"
},
"showOverlay_POI": {
"message": "Hiện ở thanh xem trước"
},
"autoSkipOnMusicVideos": {
"message": "Tự động bỏ qua tất cả các phân đoạn nếu trong video có phân đoạn không phải nhạc"
},
"muteSegments": {
"message": "Cho phép các phân đoạn bị tắt tiếng hay vì bỏ qua"
},
"colorFormatIncorrect": {
"message": "Mã màu sai định dạng. Mã màu phải có 3 hoặc 6 ký tự hệ hex và có dấu thăng ở đầu."
},
@@ -598,6 +637,9 @@
"message": "Để gửi một phân đoạn với chủ đề \"{0}\", bạn cần phải kích hoạt nó trong phần tuỳ chọn. Bạn sẽ được đưa đến phần tuỳ chỉnh bây giờ.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Cảnh báo: Loại phân đoạn này nếu hiển thị CHỈ CÓ 1 PHÂN ĐOẠN được xuất hiện trong video. Nếu bạn gửi lên, khi đó, phân đoạn xuất hiện duy nhất sẽ được lựa chọn ngẫu nhiên."
},
"youMustSelectACategory": {
"message": "Bạn phải lựa chọn một danh mục cho tất cả phân đoạn bạn đang muốn đăng tải!"
},
@@ -610,6 +652,13 @@
"hiddenDueToDuration": {
"message": "đã bị ẩn: quá ngắn"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "Không xác định được ID kênh. Nếu bạn đang xem video này trên 1 trang web thứ 3, hãy mở lại video này trên trang chủ Youtube rồi thử lại. Điều này cũng có thể do những thay đổi trong mã nguồn trang web YouTube, nếu bạn nghĩ vậy, hãy bình luận tại đây:"
},
"videoInfoFetchFailed": {
"message": "SponsorBlock không thể truy vấn dữ liệu lịch sử phân đoạn video. Có thể do trình chặn quảng cáo của bạn. Bạn có thể tìm hiểu nguyên nhân và cách fix ở đây: https://github.com/ajayyy/SponsorBlock/issues/741."
},
"youtubePermissionRequest": {
"message": "Có vẻ như SponsorBlock không thể truy cập API YouTube. Để khắc phục điều này, hãy chấp nhận lời nhắc cấp quyền sẽ xuất hiện tiếp theo, đợi vài giây rồi tải lại trang."
},
@@ -622,6 +671,9 @@
"permissionRequestFailed": {
"message": "Truy cập bị từ chối, bạn đã nhấp vào từ chối à?"
},
"adblockerIssueWhitelist": {
"message": "Nếu bạn không thể giải quyết được vấn đề này, hãy vô hiệu hoá cài đặt 'Bỏ qua video không công khai/riêng tư', vì SponsorBlock không thể lấy được thông tin của video này"
},
"forceChannelCheck": {
"message": "Bắt buộc kiểm tra kênh trước khi bỏ qua"
},
@@ -659,7 +711,49 @@
"help": {
"message": "Trợ giúp"
},
"GotIt": {
"message": "Đã hiểu",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Từ chối tham gia thử nghiệm trong tương lai",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Ẩn vĩnh viễn"
},
"warningChatInfo": {
"message": "Bạn đã nhận được một cảnh báo (Warring) và tạm thời không thể gửi các phân đoạn. Bạn đã mắc lỗi trong việc tạo quá nhiều lần (có thể là chọn sai kiểu phân đoạn hoặc sai thời gian phân đoạn). Chúng tôi muốn bạn nhận ra điều đó để có thể giúp bạn khắc phục điều này trong tương lai, không mắc lỗi nữa. Bạn có thể gặp các VIP User tại đây: discord.gg/SponsorBlock hoặc matrix.to/#/#sponsor:ajay.app. Bọn họ sẽ giúp bạn gỡ cảnh báo sau khi bạn đã hiểu ra lỗi sai của bạn."
},
"voteRejectedWarning": {
"message": "Bỏ phiếu bị từ chối do có cảnh báo. Nhấp để mở cuộc trò chuyện để giải quyết hoặc quay lại sau.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
},
"Donate": {
"message": "Donate"
},
"hideDonationLink": {
"message": "Ẩn link donate"
},
"helpPageThanksForInstalling": {
"message": "Cảm ơn bạn đã cài đặt SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Xin hãy xem xét các tuỳ chọn bên dưới"
},
"helpPageFeatureDisclaimer": {
"message": "Nhiều tính năng sẽ bị tắt theo mặc định. Nếu bạn muốn bỏ qua phần intro, sử dụng trên các trang web bên thứ 3 như Invidious, v. v...., bạn có thể bật nó ở bên dưới. Bạn cũng có thể cho hiện/ẩn UI người dùng."
},
"helpPageHowSkippingWorks": {
"message": "Việc bỏ qua 1 đoạn trong video được thực hiện thế nào?"
},
"helpPageHowSkippingWorks1": {
"message": "Các phân đoạn trong video sẽ tự động bị bỏ qua nếu chúng được tìm thấy trong cơ sở dữ liệu của chúng tôi. Bạn có thể mở cửa sổ xem trước các phân đoạn ấy bằng cách nhấp vào biểu tượng tiện ích mở rộng."
},
"helpPageHowSkippingWorks2": {
"message": "Bất cứ khi nào bỏ qua một phân đoạn, bạn sẽ nhận được 1 cửa sổ thông báo bât. Nếu phân đoạn có vẻ sai, hãy bỏ phiếu bằng cách nhấp vào nút downvote! Bạn cũng có thể bỏ phiếu trong cửa sổ bật lên khi nhấn vào biểu tượng tiện ích mở rộng. Và bạn có thể tắt việc hiển thị bảng thông báo này trong phần cài đặt tiện ích."
},
"helpPageTooSlow": {
"message": "Quá chậm"
}
}

View File

@@ -97,9 +97,6 @@
"connectionError": {
"message": "连接错误。错误代码: "
},
"wantToSubmit": {
"message": "您是否想为以下视频 ID 提交:"
},
"clearTimes": {
"message": "清除片段"
},
@@ -215,6 +212,9 @@
"showNotice": {
"message": "重新显示通知"
},
"showSkipNotice": {
"message": "在跳过片段后显示通知"
},
"longDescription": {
"message": "SponsorBlock 可帮您跳过 YouTube 视频中的赞助商广告、开场、结尾、订阅提醒和其他烦人片段。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 YouTube 视频的赞助商广告和其他片段的开始和结束时间。若有一人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。您也可以跳过音乐视频中的非音乐部分。",
"description": "Full description of the extension on the store pages."
@@ -272,9 +272,6 @@
"skip_category": {
"message": "跳过{0}"
},
"skipped": {
"message": "跳过"
},
"disableAutoSkip": {
"message": "禁用自动跳过"
},
@@ -323,9 +320,6 @@
"changeUserID": {
"message": "导入/导出您的用户 ID"
},
"whatChangeUserID": {
"message": "这应该被保密。这就像一个密码,且不应该告诉任何人。如果有人拥有它,他就可以冒充您。"
},
"setUserID": {
"message": "设定用户 ID"
},
@@ -335,12 +329,6 @@
"createdBy": {
"message": "创建者"
},
"autoSkip": {
"message": "自动跳过"
},
"showSkipNotice": {
"message": "在跳过片段后显示通知"
},
"keybindCurrentlySet": {
"message": "。目前被设定为:"
},
@@ -510,8 +498,8 @@
"category_livestream_messages_short": {
"message": "阅读消息"
},
"disable": {
"message": "禁用"
"autoSkip": {
"message": "自动跳过"
},
"manualSkip": {
"message": "手动跳过"
@@ -519,6 +507,9 @@
"showOverlay": {
"message": "在搜索栏中显示"
},
"disable": {
"message": "禁用"
},
"colorFormatIncorrect": {
"message": "颜色格式错误。应为以“#”开头的 3 位或 6 位十六进制数字。"
},
@@ -605,5 +596,8 @@
},
"categoryUpdate2": {
"message": "打开选项,跳过开头,结尾,商业等。"
},
"help": {
"message": "帮助"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "繼續跳過"
},
"unmute": {
"message": "解除靜音"
},
"paused": {
"message": "已暫停"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "已發生連線錯誤。錯誤碼: "
},
"wantToSubmit": {
"message": "您想為這個影片ID提交嗎"
},
"clearTimes": {
"message": "清除片段"
},
@@ -224,6 +224,9 @@
"showNotice": {
"message": "再次顯示通知"
},
"showSkipNotice": {
"message": "在跳過片段後顯示通知"
},
"longDescription": {
"message": "SponsorBlock 讓您可以跳過贊助工商,開場動畫,結束動畫,訂閱提醒等煩人的 YouTube 影片片段。SponsorBlock 是個大眾外包的網頁瀏覽器擴充功能,能讓任何人提交贊助片段的始與末。當一個人提交這個片段後,所有使用這個擴充功能的人都可以跳過該片段。您也可以跳過在音樂中的非音樂片段",
"description": "Full description of the extension on the store pages."
@@ -284,9 +287,6 @@
"skip_category": {
"message": "跳過 {0}"
},
"skipped": {
"message": "已跳過"
},
"disableAutoSkip": {
"message": "停用自動跳過"
},
@@ -335,9 +335,6 @@
"changeUserID": {
"message": "匯入/匯出您的使用者 ID"
},
"whatChangeUserID": {
"message": "這應該被保密。這就像一個密碼,不應該與他人分享。如果有人擁有它,他們就可以冒充您。"
},
"setUserID": {
"message": "設定使用者 ID"
},
@@ -347,12 +344,6 @@
"createdBy": {
"message": "創建者"
},
"autoSkip": {
"message": "自動跳過"
},
"showSkipNotice": {
"message": "在跳過片段後顯示通知"
},
"keybindCurrentlySet": {
"message": "。它目前被設定為:"
},
@@ -393,6 +384,9 @@
"minDurationDescription": {
"message": "小於設定值的片段不會被跳過或在播放器中顯示"
},
"skipNoticeDuration": {
"message": "跳過通知持續顯示時間(秒):"
},
"skipNoticeDurationDescription": {
"message": "跳過片段提示的顯示時間將會以上列時間長度為準(單位:秒);手動跳過的時候會顯示較長於上面的時間"
},
@@ -538,14 +532,17 @@
"category_music_offtopic_short": {
"message": "非音樂"
},
"category_poi_highlight": {
"message": "重點"
},
"category_livestream_messages": {
"message": "直播:捐贈/訊息閱讀"
},
"category_livestream_messages_short": {
"message": "閱讀訊息"
},
"disable": {
"message": "停用"
"autoSkip": {
"message": "自動跳過"
},
"manualSkip": {
"message": "手動跳過"
@@ -553,6 +550,12 @@
"showOverlay": {
"message": "在時間條顯示"
},
"disable": {
"message": "停用"
},
"autoSkipOnMusicVideos": {
"message": "自動跳過非音樂片段(如果有的話)"
},
"colorFormatIncorrect": {
"message": "您設定的顏色無效。它應該是三或六位數的 hex 碼,且以井字號開頭。"
},
@@ -604,6 +607,10 @@
"hiddenDueToDuration": {
"message": "隱藏:太短"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "未偵測到頻道ID如果您正在使用嵌入式YouTube播放器請移至YouTube網站上觀看本影片。此問題亦有可能是由於YouTube改變了系統架構如果你認為這是造成此問題的原因請留言告訴我們"
},
"videoInfoFetchFailed": {
"message": "似乎有東西在阻止 SponsorBlock 取得影片資料。請至 https://github.com/ajayyy/SponsorBlock/issues/741 以了解更多資訊。"
},
@@ -659,11 +666,18 @@
"help": {
"message": "說明"
},
"GotIt": {
"message": "知道了",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "關閉所有未來的實驗性功能",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "永久隱藏"
},
"Credits": {
"message": "致謝"
}
}

View File

@@ -106,12 +106,10 @@
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes fadeOut {
from { opacity: 1; }
to { opacity: 0; }
to { opacity: 0; }
}
.sponsorBlockSpacer {
@@ -131,16 +129,16 @@
right: 10px;
}
.sponsorSkipNotice {
min-width: 350px;
max-width: 50%;
background-color: rgba(28, 28, 28, 0.9);
.sponsorSkipNoticeParent {
position: absolute;
right: 5px;
bottom: 100px;
right: 10px;
}
border-radius: 5px;
.sponsorSkipNoticeParent, .sponsorSkipNotice {
min-width: 350px;
max-width: 50%;
border-spacing: 5px 10px;
padding-left: 5px;
@@ -149,17 +147,41 @@
border-collapse: unset;
}
.sponsorSkipNoticeTableContainer {
background-color: rgba(28, 28, 28, 0.9);
border-radius: 5px;
min-width: 100%;
}
.sponsorSkipNotice {
transition: all 0.1s ease-out;
}
.sponsorSkipNoticeLimitWidth {
min-width: calc(100% - 50px);
}
.sponsorSkipNotice .hidden {
display: none;
}
/* For Cloudtube */
.sponsorSkipNotice td, .sponsorSkipNotice table, .sponsorSkipNotice th {
border: none;
}
.sponsorSkipNoticeFadeIn {
animation: fadeIn 0.5s;
animation: fadeIn 0.5s ease-out;
}
.sponsorSkipNoticeFaded {
opacity: 0.5;
}
.sponsorSkipNoticeFadeOut {
animation: fadeOut 3s cubic-bezier(0.55, 0.055, 0.675, 0.19);
transition: opacity 3s cubic-bezier(0.55, 0.055, 0.675, 0.19);
opacity: 0 !important;
animation: none !important;
}
.sponsorSkipNotice .sponsorSkipNoticeTimeLeft {
@@ -169,14 +191,28 @@
padding: 2px 5px;
font-size: 12px;
display: flex;
align-items: center;
border: 1px solid #eeeeee;
}
.sponsorSkipNoticeTimeLeft img {
vertical-align: middle;
height: 13px;
padding-top: 7.8%;
padding-bottom: 7.8%;
}
/* if two are very close to eachother */
.secondSkipNotice {
bottom: 250px;
}
transition: bottom 0.2s;
.noticeLeftIcon {
display: flex;
align-items: center;
}
.sponsorSkipNotice .sponsorSkipNoticeUnskipSection {
@@ -220,7 +256,9 @@
float: right;
margin-right: 5px;
margin-right: 10px;
display: flex;
align-items: center;
}
.sponsorSkipNoticeRightButton {
@@ -243,7 +281,9 @@
font-weight: bold;
color: rgb(235, 235, 235);
margin-top: auto;
display: inline-block;
margin-right: 10px;
}
.sponsorSkipInfo {
@@ -277,7 +317,6 @@
.sponsorTimesInfoMessage {
font-size: 13.3333px;
color: rgb(235, 235, 235);
text-align: center;
}
.voteButton {
@@ -433,7 +472,7 @@ input::-webkit-inner-spin-button {
text-decoration: underline;
}
.sponsorTimeCategories {
.sponsorTimeEditSelector {
margin-top: 5px;
margin-bottom: 5px;
@@ -467,4 +506,42 @@ input::-webkit-inner-spin-button {
.sbChatClose {
height: 14px;
cursor: pointer;
}
.skipButtonControlBarContainer {
cursor: pointer;
display: flex;
}
.skipButtonControlBarContainer.hidden {
display: none !important;
}
#sbSkipIconControlBarImage {
height: 60%;
top: 0px;
bottom: 0px;
display: block;
margin: auto;
}
.sponsorBlockTooltip {
position: absolute;
background-color: rgba(28, 28, 28, 0.7);
border-radius: 5px;
padding: 10px;
max-width: 300px;
white-space: normal;
line-height: 1.5em;
}
.sponsorBlockTooltip::after {
content: " ";
position: absolute;
top: 100%;
left: 15%;
margin-left: -15px;
border-width: 15px;
border-style: solid;
border-color: rgba(28, 28, 28, 0.7) transparent transparent transparent;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

View File

@@ -5,6 +5,9 @@
<meta charset="utf-8">
<link href="styles.css" rel="stylesheet"/>
<script src="../js/vendor.js"></script>
<script src="../js/help.js"></script>
</head>
<body>
@@ -14,90 +17,92 @@
SponsorBlock
</div>
<div class="container">
<div class="container sponsorBlockPageBody">
<p class="createdBy">Created By <a href="https://ajay.app">Ajay Ramachandran</a> <img src="https://ajay.app/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
<p>
Thanks for installing SponsorBlock. By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>.
<p class="createdBy">
<img src="https://ajay.app/newprofilepic.jpg" height="30" class="profilepiccircle"/>
Created By <a href="https://ajay.app">Ajay Ramachandran</a>
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">(Donate)</a>
</p>
<p class="projectPreview">
Come contribute, make some suggestions and help out on <a href="https://discord.gg/QnmVMpU">Discord</a> or on <a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org">Matrix</a>.
<p>
__MSG_helpPageThanksForInstalling__ By using this extension, you agree to the <a href="https://gist.github.com/ajayyy/aa9f8ded2b573d4f73a3ffa0ef74f796">Privacy Policy</a> and <a href="https://gist.github.com/ajayyy/9e8100f069348e0bc062641f34d6af12">Terms of Use</a>.
</p>
<p style="margin-bottom: 0" class="bigText center">Please review the options below</p>
<p>
Many features are disabled by default. If you want to skip intros, outros, use Invidious, etc., enable them below.
You can also hide/show UI elements.
Come contribute, make some suggestions and help out on <a href="https://discord.gg/SponsorBlock">Discord</a> or on <a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org">Matrix</a>.
</p>
<p style="margin-bottom: 0; margin-top: 0" class="bigText center">__MSG_helpPageReviewOptions__</p>
<p class="smallText">
__MSG_helpPageFeatureDisclaimer__
</p>
<iframe src="../options/options.html#embed" width="100%" height="500px" style="border: none"></iframe>
<h1>How skipping works</h1>
<h1>__MSG_helpPageHowSkippingWorks__</h1>
<p class="projectPreview">
<span class="projectPreviewImageLarge">
<img src="https://i.imgur.com/caf5Bju.png">
<img src="images/popup.png">
</span>
Video segments will automatically be skipped if they are found in the database. You can open the popup by clicking the extension icon to get a preview of what they are.
__MSG_helpPageHowSkippingWorks1__
<br/>
<br/>
Whenever you skip a segment, you will get notice. If the timing seems wrong vote down by clicking downvote! You can also vote in the popup.
__MSG_helpPageHowSkippingWorks2__
</p>
<div class="center"><img height="120px" src="https://user-images.githubusercontent.com/12688112/63067735-5a638700-bede-11e9-8147-f321b57527ec.gif"></div>
<div class="center"><img height="120px" src="images/voting on notice.gif"></div>
<h1>Submitting</h1>
<h1>__MSG_Submitting__</h1>
<p class="projectPreview">
<span class="projectPreviewImageLargeRight">
<img src="https://i.imgur.com/A1ilk6x.gif">
</span>
Submitting can either be done in the popup by hitting the "Segment Starts Now" button or in the video player with the buttons on the player.
__MSG_helpPageSubmitting1__
<br/>
<br/>
Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete.
__MSG_helpPageSubmitting2__
</p>
<h1>Editing</h1>
<h1>__MSG_Editing__</h1>
<p class="projectPreview">
<span class="projectPreviewImageLarge">
<img src="https://i.imgur.com/DZHqbsx.gif">
<img src="https://wiki.sponsor.ajay.app/images/6/6a/Popup_only.png">
</span>
If you messed up, you can edit or delete your segments in the popup or in the info menu (by hitting the info icon).
__MSG_helpPageEditing1__
</p>
<h1>This is too slow</h1>
<h1>__MSG_helpPageTooSlow__</h1>
<p>
There are hotkeys if you want to use them. Press the semicolon key to indicate the start/end of a sponsor segment and click the apostrophe to submit.
These can be changed in the options. If you don't use QWERTY, you should probably change the keybinding.
__MSG_helpPageTooSlow1__
</p>
<h1>Can I get a copy of the Database? What happens if you disappear?</h1>
<h1>__MSG_helpPageCopyOfDatabase__</h1>
<p>
The database is public and available at <a href="https://sponsor.ajay.app/database">https://sponsor.ajay.app/database</a> and the source code is freely available. So, even if something happens to me, your submissions are not lost.
__MSG_helpPageCopyOfDatabase1__ <a href="https://sponsor.ajay.app/database">https://sponsor.ajay.app/database</a>. __MSG_helpPageCopyOfDatabase2__
</p>
<h1>News and how it is made</h1>
<h1>__MSG_helpPageNews__</h1>
<p>
See <a href="https://sponsor.ajay.app/news">https://sponsor.ajay.app/news</a>.
</p>
<h1>Where can I get the source code?</h1>
<h1>__MSG_helpPageSourceCode__</h1>
<h4 style="display: inline">Client:</h4>
<!-- Github logo -->
@@ -107,14 +112,14 @@
<!-- Github logo -->
<a href="https://github.com/ajayyy/SponsorBlockServer"><svg aria-hidden="true" version="1.1" viewBox="0 0 16 16" height="58px" style="padding-left: 15px"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"></path></svg></a>
<h1>Credits</h1>
<h1>__MSG_Credits__</h1>
<p>
Thanks to all <a href="https://github.com/ajayyy/SponsorBlock/graphs/contributors">SponsorBlock contributors</a>,
<a href="https://github.com/ajayyy/SponsorBlockServer/graphs/contributors">SponsorBlockServer contributors</a> and
<a href="https://github.com/ajayyy/SponsorBlockSite/graphs/contributors">SponsorBlockSite contributors</a> such
as <a href="https://github.com/NDevTK">NDev</a>, <a href="https://github.com/Joe-Dowd">Joe Dowd</a>,
<a href="https://github.com/bershanskiy">Anton Bershanskiy</a> and more.
<a href="https://mchang.name/">Michael Chang</a> and more.
</p>
<p>The awesome <a href="https://github.com/omarroth/invidious/wiki/API">Invidious API</a> is used to grab the time the video was published.</p>

View File

@@ -129,8 +129,11 @@ a {
text-decoration: none;
}
p,li {
font-size: 16px;
}
p,li,a {
font-size: 20px;
color: #c4c4c4;
}
@@ -180,4 +183,8 @@ h1,h2,h3,h4,h5,h6 {
svg {
text-decoration: none;
}
#sbDonate {
font-size: 10px;
}

View File

@@ -41,12 +41,13 @@
id="namedview18"
showgrid="false"
inkscape:zoom="0.83098592"
inkscape:cx="-238.41697"
inkscape:cy="258.22009"
inkscape:cx="220.07455"
inkscape:cy="308.76246"
inkscape:window-x="477"
inkscape:window-y="961"
inkscape:window-maximized="1"
inkscape:current-layer="svg16" />
inkscape:current-layer="svg16"
inkscape:pagecheckerboard="true" />
<defs
id="defs4">
<style

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

59
public/icons/pause.svg Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="24px"
viewBox="0 0 24 24"
width="24px"
fill="#000000"
version="1.1"
id="svg6"
sodipodi:docname="pause.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="730"
inkscape:window-height="480"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg6" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path2" />
<path
d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"
id="path4"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

71
public/icons/skipIcon.svg Normal file
View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
viewBox="0 0 565.15 568"
version="1.1"
id="svg16"
sodipodi:docname="skipIcon.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
inkscape:export-filename="D:\Dell Data\_Projects\_____SponsorSkip\ignored\svg\SponsorBlocker4.png"
inkscape:export-xdpi="43.436523"
inkscape:export-ydpi="43.436523">
<metadata
id="metadata20">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title>LogoSponsorBlocker2</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1001"
id="namedview18"
showgrid="false"
inkscape:zoom="1.6619718"
inkscape:cx="316.31071"
inkscape:cy="330.01409"
inkscape:window-x="477"
inkscape:window-y="961"
inkscape:window-maximized="1"
inkscape:current-layer="svg16"
inkscape:pagecheckerboard="true" />
<defs
id="defs4">
<style
id="style2">.cls-1{fill:red;}.cls-2{fill:#fff;}</style>
</defs>
<title
id="title6">LogoSponsorBlocker2</title>
<path
class="cls-1"
d="m 282.58,568 a 65,65 0 0 1 -34.14,-9.66 C 95.41,463.94 2.54,300.46 0,121 a 64.91,64.91 0 0 1 34,-58.09 522.56,522.56 0 0 1 497.16,0 64.91,64.91 0 0 1 34,58.12 c -2.53,179.43 -95.4,342.91 -248.42,437.3 A 65,65 0 0 1 282.58,568 Z m 0,-548.31 A 502.24,502.24 0 0 0 43.4,80.22 45.27,45.27 0 0 0 19.7,120.75 c 2.44,172.67 91.81,330 239.07,420.83 a 46.19,46.19 0 0 0 47.61,0 C 453.64,450.73 543,293.42 545.45,120.75 A 45.26,45.26 0 0 0 521.75,80.21 502.26,502.26 0 0 0 282.58,19.69 Z"
id="path8"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
<path
style="fill:#ffffff"
d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 188.7168 140.07227 L 312.64844 264.00586 L 188.7168 387.9375 L 159.5918 358.8125 L 254.19336 264.00586 L 159.5918 169.19727 L 188.7168 140.07227 z M 305.625 140.07227 L 429.55859 264.00586 L 305.625 387.9375 L 276.50195 358.8125 L 371.10352 264.00586 L 276.50195 169.19727 L 305.625 140.07227 z "
id="path10" />
<g
id="g825"
transform="translate(-3.86549,36.564644)" />
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

59
public/icons/stop.svg Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
height="24px"
viewBox="0 0 24 24"
width="24px"
fill="#000000"
version="1.1"
id="svg6"
sodipodi:docname="stop.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata12">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs10" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="730"
inkscape:window-height="480"
id="namedview8"
showgrid="false"
inkscape:zoom="9.8333333"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg6" />
<path
d="M0 0h24v24H0z"
fill="none"
id="path2" />
<path
d="M6 6h12v12H6z"
id="path4"
style="fill:#ffffff" />
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -343,10 +343,13 @@ svg {
.categoryTableElement > * {
padding-right: 15px;
}
.categoryTableDescription > * {
padding-bottom: 15px;
}
.categoryOptionsSelector {
.optionsSelector {
background-color: #c00000;
color: white;
@@ -361,4 +364,8 @@ svg {
background: none;
border: none;
}
#sbDonate {
font-size: 10px;
}

View File

@@ -19,7 +19,12 @@
</div>
<div class="center">
<p class="createdBy titleBar">__MSG_createdBy__ <a href="https://ajay.app">Ajay Ramachandran</a> <img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/></p>
<p class="createdBy titleBar">
<img src="../icons/newprofilepic.jpg" height="30" class="profilepiccircle"/>
__MSG_createdBy__
<a href="https://ajay.app">Ajay Ramachandran</a>
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">(__MSG_Donate__)</a>
</p>
<h1>__MSG_Options__</h1>
@@ -45,6 +50,22 @@
<br/>
</div>
<div option-type="toggle" sync-option="muteSegments">
<label class="switch-container">
<label class="switch">
<input type="checkbox" checked>
<span class="slider round"></span>
</label>
<div class="switch-label">
__MSG_muteSegments__
</div>
</label>
<br/>
<br/>
<br/>
</div>
<br/>
<br/>
@@ -210,9 +231,21 @@
</div>
</label>
</div>
<br/>
<br/>
<br/>
<div option-type="selector" sync-option="noticeVisibilityMode">
<select class="selector-element optionsSelector" >
<option value="0">__MSG_noticeVisibilityMode0__</option>
<option value="1">__MSG_noticeVisibilityMode1__</option>
<option value="2">__MSG_noticeVisibilityMode2__</option>
<option value="3">__MSG_noticeVisibilityMode3__</option>
<option value="4">__MSG_noticeVisibilityMode4__</option>
</select>
</div>
<br/>
<br/>
<br/>
<br/>
@@ -439,6 +472,24 @@
<br/>
<br/>
<div option-type="toggle" toggle-type="reverse" sync-option="showDonationLink" no-safari="true">
<label class="switch-container">
<label class="switch">
<input type="checkbox" checked>
<span class="slider round"></span>
</label>
<div class="switch-label">
__MSG_hideDonationLink__
</div>
</label>
</div>
<br/>
<br/>
<br/>
<br/>
<div option-type="private-text-change" sync-option="userID" confirm-message="userIDChangeWarning">
<div class="option-button trigger-button">

View File

@@ -265,7 +265,7 @@ background-color:#ec1c1c;
align-items: center;
}
.sbSlimButton, #additionalButtons>button, button#setUsernameButton, #submitUsername {
.sbSlimButton, #additionalButtons>button, button#setUsernameButton, #submitUsername, #copyUserID {
background: none;
border: none;
color: white;
@@ -275,6 +275,10 @@ background-color:#ec1c1c;
cursor: pointer;
}
button#setUsernameButton {
flex: 0 1;
}
#submitUsername {
padding-left: 5pt;
}
@@ -285,6 +289,7 @@ background-color:#ec1c1c;
#usernameValue, #usernameInput, #sponsorTimesContributionsDisplay{
font-size: 16px;
flex: 1 0;
}
.SBWhitelistIcon {
@@ -341,6 +346,15 @@ label>p, #disableExtension>p, #usernameValue, #usernameElement > div > p,#sponso
cursor: pointer;
}
#copyUserID {
width: 100%;
flex: 0 1;
}
#setUsernameContainer {
display: flex;
}
#usernameElement > div, #sponsorTimesContributionsContainer > div {
display: flex;
flex-flow: column nowrap;

View File

@@ -19,7 +19,7 @@
<p id="loadingIndicator">__MSG_noVideoID__</p>
<!-- If the video was found in the database -->
<p id="videoFound"></p>
<button class="sbSlimButton hidden" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<button class="sbSlimButton" id="refreshSegmentsButton" title="__MSG_refreshSegments__">
<img id="refreshSegments" src="/icons/refresh.svg"/>
</button>
</div>
@@ -90,6 +90,9 @@
<button id="setUsernameButton" title="__MSG_setUsername__">
<img src="/icons/pencil.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconEdit">
</button>
<button id="copyUserID" title="__MSG_copyPublicID__">
<img src="/icons/clipboard.svg" alt="__MSG_copyPublicID__" width="16" height="16" id="sbPopupIconCopyUserID">
</button>
</div>
<div id="setUsername" style="display: none">
<div id="setUsernameStatusContainer" style="display: none">
@@ -139,7 +142,7 @@
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> |
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
<br/>
<a href="https://discord.gg/QnmVMpU" target="_blank" rel="noopener">Discord</a> |
<a href="https://discord.gg/SponsorBlock" target="_blank" rel="noopener">Discord</a> |
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
<a id="helpButton" style="cursor: pointer;">__MSG_help__</a> |
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>

View File

@@ -32,10 +32,10 @@ chrome.tabs.onUpdated.addListener(function(tabId) {
chrome.runtime.onMessage.addListener(function (request, sender, callback) {
switch(request.message) {
case "openConfig":
chrome.runtime.openOptionsPage();
chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))});
return;
case "openHelp":
chrome.tabs.create({url: chrome.runtime.getURL('help/index_en.html')});
chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')});
return;
case "openPage":
chrome.tabs.create({url: chrome.runtime.getURL(request.url)});
@@ -74,12 +74,14 @@ chrome.runtime.onInstalled.addListener(function () {
// If there is no userID, then it is the first install.
if (!userID){
//open up the install page
chrome.tabs.create({url: chrome.extension.getURL("/help/index_en.html")});
chrome.tabs.create({url: chrome.extension.getURL("/help/index.html")});
//generate a userID
const newUserID = utils.generateUserID();
//save this UUID
Config.config.userID = newUserID;
Config.config.highlightCategoryUpdate = true;
}
}, 1500);
});

View File

@@ -1,6 +1,7 @@
import * as React from "react";
import * as CompileConfig from "../../config.json";
import { Category } from "../types";
import CategorySkipOptionsComponent from "./CategorySkipOptionsComponent";
export interface CategoryChooserProps {
@@ -61,7 +62,7 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
for (const category of CompileConfig.categoryList) {
elements.push(
<CategorySkipOptionsComponent category={category}
<CategorySkipOptionsComponent category={category as Category}
key={category}>
</CategorySkipOptionsComponent>
);

View File

@@ -1,10 +1,12 @@
import * as React from "react";
import Config from "../config"
import { CategorySkipOption } from "../types";
import { Category, CategorySkipOption } from "../types";
import { getCategoryActionType } from "../utils/categoryUtils";
export interface CategorySkipOptionsProps {
category: string;
category: Category;
defaultColor?: string;
defaultPreviewColor?: string;
}
@@ -59,7 +61,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
<td id={this.props.category + "SkipOption"}
className="skipOption">
<select
className="categoryOptionsSelector"
className="optionsSelector"
defaultValue={defaultOption}
onChange={this.skipOptionSelected.bind(this)}>
{this.getCategorySkipOptions()}
@@ -87,7 +89,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
</tr>
<tr id={this.props.category + "DescriptionRow"}
className="small-description">
className="small-description categoryTableDescription">
<td
colSpan={2}>
{chrome.i18n.getMessage("category_" + this.props.category + "_description")}
@@ -152,7 +154,8 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
for (const optionName of optionNames) {
elements.push(
<option key={optionName} value={optionName}>
{chrome.i18n.getMessage(optionName)}
{chrome.i18n.getMessage(optionName !== "disable" ? optionName + getCategoryActionType(this.props.category)
: optionName)}
</option>
);
}

View File

@@ -1,20 +1,35 @@
import * as React from "react";
import Config from "../config";
enum CountdownMode {
Timer,
Paused,
Stopped
}
export interface NoticeProps {
noticeTitle: string,
maxCountdownTime?: () => number,
amountOfPreviousNotices?: number,
showInSecondSlot?: boolean,
timed?: boolean,
idSuffix?: string,
videoSpeed?: () => number,
fadeIn?: boolean,
startFaded?: boolean,
firstColumn?: React.ReactElement,
firstRow?: React.ReactElement,
bottomRow?: React.ReactElement[],
smaller?: boolean,
limitWidth?: boolean,
// Callback for when this is closed
closeListener: () => void,
onMouseEnter?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void,
zIndex?: number,
style?: React.CSSProperties
@@ -26,8 +41,11 @@ export interface NoticeState {
maxCountdownTime: () => number,
countdownTime: number,
countdownText: string,
countdownManuallyPaused: boolean,
countdownMode: CountdownMode,
mouseHovering: boolean;
startFaded: boolean;
}
class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
@@ -61,8 +79,10 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
//the countdown until this notice closes
countdownTime: maxCountdownTime(),
countdownText: null,
countdownManuallyPaused: false
countdownMode: CountdownMode.Timer,
mouseHovering: false,
startFaded: this.props.startFaded ?? false
}
}
@@ -77,80 +97,153 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
}
return (
<table id={"sponsorSkipNotice" + this.idSuffix}
className={"sponsorSkipObject sponsorSkipNotice"
<div id={"sponsorSkipNotice" + this.idSuffix}
className={"sponsorSkipObject sponsorSkipNoticeParent"
+ (this.props.showInSecondSlot ? " secondSkipNotice" : "")}
onMouseEnter={(e) => this.onMouseEnter(e) }
onMouseLeave={() => this.timerMouseLeave()}
style={noticeStyle} >
<div className={"sponsorSkipNoticeTableContainer"
+ (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")
+ (this.amountOfPreviousNotices > 0 ? " secondSkipNotice" : "")}
style={noticeStyle}
onMouseEnter={() => this.timerMouseEnter()}
onMouseLeave={() => this.timerMouseLeave()}>
<tbody>
+ (this.state.startFaded ? " sponsorSkipNoticeFaded" : "") }>
<table className={"sponsorSkipObject sponsorSkipNotice"
+ (this.props.limitWidth ? " sponsorSkipNoticeLimitWidth" : "")}>
<tbody>
{/* First row */}
<tr id={"sponsorSkipNoticeFirstRow" + this.idSuffix}>
{/* Left column */}
<td>
{/* Logo */}
<img id={"sponsorSkipLogo" + this.idSuffix}
className="sponsorSkipLogo sponsorSkipObject"
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
</img>
{/* First row */}
<tr id={"sponsorSkipNoticeFirstRow" + this.idSuffix}
className="sponsorSkipNoticeFirstRow">
{/* Left column */}
<td className="noticeLeftIcon">
{/* Logo */}
<img id={"sponsorSkipLogo" + this.idSuffix}
className="sponsorSkipLogo sponsorSkipObject"
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
</img>
<span id={"sponsorSkipMessage" + this.idSuffix}
style={{float: "left"}}
className="sponsorSkipMessage sponsorSkipObject">
<span id={"sponsorSkipMessage" + this.idSuffix}
style={{float: "left"}}
className="sponsorSkipMessage sponsorSkipObject">
{this.state.noticeTitle}
</span>
{this.props.firstColumn}
</td>
{this.props.firstRow}
{/* Right column */}
<td className="sponsorSkipNoticeRightSection"
style={{top: "9.32px"}}>
{/* Time left */}
{this.props.timed ? (
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
onClick={() => this.toggleManualPause()}
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
{this.getCountdownElements()}
</span>
) : ""}
{this.state.noticeTitle}
</span>
</td>
{/* Right column */}
<td className="sponsorSkipNoticeRightSection"
style={{top: "11px"}}>
{/* Time left */}
{this.props.timed ? (
<span id={"sponsorSkipNoticeTimeLeft" + this.idSuffix}
onClick={() => this.toggleManualPause()}
className="sponsorSkipObject sponsorSkipNoticeTimeLeft">
{/* Close button */}
<img src={chrome.extension.getURL("icons/close.png")}
className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"
onClick={() => this.close()}>
</img>
</td>
</tr>
{this.state.countdownText || (this.state.countdownTime + "s")}
</span>
) : ""}
{this.props.children}
{/* Close button */}
<img src={chrome.extension.getURL("icons/close.png")}
className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"
onClick={() => this.close()}>
</img>
</td>
</tr>
{!this.props.smaller && this.props.bottomRow ?
this.props.bottomRow
: null}
{this.props.children}
</tbody>
</table>
</div>
</tbody>
</table>
{/* Add as a hidden table to keep the height constant */}
{this.props.smaller && this.props.bottomRow ?
<table style={{visibility: "hidden", paddingTop: "14px"}}>
<tbody>
{this.props.bottomRow}
</tbody>
</table>
: null}
</div>
);
}
getCountdownElements(): React.ReactElement[] {
return [(
<span
id={"skipNoticeTimerText" + this.idSuffix}
key="skipNoticeTimerText"
className={this.state.countdownMode !== CountdownMode.Timer ? "hidden" : ""} >
{this.state.countdownTime + "s"}
</span>
),(
<img
id={"skipNoticeTimerPaused" + this.idSuffix}
key="skipNoticeTimerPaused"
className={this.state.countdownMode !== CountdownMode.Paused ? "hidden" : ""}
src={chrome.runtime.getURL("icons/pause.svg")}
alt={chrome.i18n.getMessage("paused")} />
),(
<img
id={"skipNoticeTimerStopped" + this.idSuffix}
key="skipNoticeTimerStopped"
className={this.state.countdownMode !== CountdownMode.Stopped ? "hidden" : ""}
src={chrome.runtime.getURL("icons/stop.svg")}
alt={chrome.i18n.getMessage("manualPaused")} />
)];
}
onMouseEnter(event: React.MouseEvent<HTMLElement, MouseEvent>): void {
if (this.props.onMouseEnter) this.props.onMouseEnter(event);
this.fadedMouseEnter();
this.timerMouseEnter();
}
fadedMouseEnter(): void {
if (this.state.startFaded) {
this.setState({
startFaded: false
});
}
}
timerMouseEnter(): void {
if (this.state.countdownManuallyPaused) return;
if (this.state.countdownMode === CountdownMode.Stopped) return;
this.pauseCountdown();
this.setState({
mouseHovering: true
});
}
timerMouseLeave(): void {
if (this.state.countdownManuallyPaused) return;
if (this.state.countdownMode === CountdownMode.Stopped) return;
this.startCountdown();
this.setState({
mouseHovering: false
});
}
toggleManualPause(): void {
this.setState({
countdownManuallyPaused: !this.state.countdownManuallyPaused
countdownMode: this.state.countdownMode === CountdownMode.Stopped ? CountdownMode.Timer : CountdownMode.Stopped
}, () => {
if (this.state.countdownManuallyPaused) {
if (this.state.countdownMode === CountdownMode.Stopped || this.state.mouseHovering) {
this.pauseCountdown();
} else {
this.startCountdown();
@@ -207,7 +300,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
//reset countdown and inform the user
this.setState({
countdownTime: this.state.maxCountdownTime(),
countdownText: this.state.countdownManuallyPaused ? chrome.i18n.getMessage("manualPaused") : chrome.i18n.getMessage("paused")
countdownMode: this.state.countdownMode === CountdownMode.Timer ? CountdownMode.Paused : this.state.countdownMode
});
this.removeFadeAnimation();
@@ -221,7 +314,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
this.setState({
countdownTime: this.state.maxCountdownTime(),
countdownText: null
countdownMode: CountdownMode.Timer
});
this.setupInterval();
@@ -243,7 +336,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
this.setState({
countdownTime: this.state.maxCountdownTime(),
countdownText: null
countdownMode: CountdownMode.Timer
});
this.removeFadeAnimation();

View File

@@ -1,10 +1,12 @@
import * as React from "react";
import * as CompileConfig from "../../config.json";
import Config from "../config"
import { ContentContainer, SponsorHideType, SponsorTime } from "../types";
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType } from "../types";
import NoticeComponent from "./NoticeComponent";
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
import { getCategoryActionType, getSkippingText } from "../utils/categoryUtils";
export enum SkipNoticeAction {
None,
Upvote,
@@ -20,7 +22,11 @@ export interface SkipNoticeProps {
// Contains functions and variables from the content script needed by the skip notice
contentContainer: ContentContainer;
closeListener: () => void
closeListener: () => void;
showKeybindHint?: boolean;
smaller: boolean;
unskipTime?: number;
}
export interface SkipNoticeState {
@@ -33,14 +39,19 @@ export interface SkipNoticeState {
maxCountdownTime?: () => number;
countdownText?: string;
unskipText?: string;
unskipCallback?: (index: number) => void;
skipButtonText?: string;
skipButtonCallback?: (index: number) => void;
showSkipButton?: boolean;
downvoting?: boolean;
choosingCategory?: boolean;
thanksForVotingText?: string; //null until the voting buttons should be hidden
actionState?: SkipNoticeAction;
showKeybindHint?: boolean;
smaller?: boolean;
}
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
@@ -50,6 +61,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
contentContainer: ContentContainer;
amountOfPreviousNotices: number;
showInSecondSlot: boolean;
audio: HTMLAudioElement;
idSuffix: string;
@@ -70,15 +82,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.contentContainer = props.contentContainer;
this.audio = null;
const categoryName = chrome.i18n.getMessage(this.segments.length > 1 ? "multipleSegments"
: "category_" + this.segments[0].category + "_short") || chrome.i18n.getMessage("category_" + this.segments[0].category);
let noticeTitle = categoryName + " " + chrome.i18n.getMessage("skipped");
if (!this.autoSkip) {
noticeTitle = chrome.i18n.getMessage("skip_category").replace("{0}", categoryName);
}
//add notice
this.amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length;
const noticeTitle = getSkippingText(this.segments, this.props.autoSkip);
const previousSkipNotices = document.getElementsByClassName("sponsorSkipNoticeParent");
this.amountOfPreviousNotices = previousSkipNotices.length;
// If there is at least one already in the first slot
this.showInSecondSlot = previousSkipNotices.length > 0 && [...previousSkipNotices].some(notice => !notice.classList.contains("secondSkipNotice"));
// Sort segments
if (this.segments.length > 1) {
@@ -102,19 +111,24 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
countdownTime: Config.config.skipNoticeDuration,
countdownText: null,
unskipText: chrome.i18n.getMessage("unskip"),
unskipCallback: (index) => this.unskip(index),
skipButtonText: this.getUnskipText(),
skipButtonCallback: (index) => this.unskip(index),
showSkipButton: true,
downvoting: false,
choosingCategory: false,
thanksForVotingText: null,
actionState: SkipNoticeAction.None
actionState: SkipNoticeAction.None,
showKeybindHint: this.props.showKeybindHint ?? true,
smaller: this.props.smaller ?? false
}
if (!this.autoSkip) {
// Assume manual skip is only skipping 1 submission
Object.assign(this.state, this.getUnskippedModeInfo(0, chrome.i18n.getMessage("skip")));
Object.assign(this.state, this.getUnskippedModeInfo(0, this.getSkipText()));
}
}
@@ -132,145 +146,174 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
noticeStyle.transform = "scale(0.8) translate(10%, 10%)";
}
// If it started out as smaller, always keep the
// skip button there
const firstColumn = this.props.smaller ? (
this.getSkipButton()
) : null;
return (
<NoticeComponent noticeTitle={this.state.noticeTitle}
amountOfPreviousNotices={this.amountOfPreviousNotices}
showInSecondSlot={this.showInSecondSlot}
idSuffix={this.idSuffix}
fadeIn={true}
startFaded={Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAll
|| (Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAutoSkip && this.autoSkip)}
timed={true}
maxCountdownTime={this.state.maxCountdownTime}
videoSpeed={() => this.contentContainer().v?.playbackRate}
style={noticeStyle}
ref={this.noticeRef}
closeListener={() => this.closeListener()}>
closeListener={() => this.closeListener()}
smaller={this.state.smaller}
limitWidth={true}
firstColumn={firstColumn}
bottomRow={[...this.getMessageBoxes(), ...this.getBottomRow() ]}
onMouseEnter={() => this.onMouseEnter() } >
{(Config.config.audioNotificationOnSkip) && <audio ref={(source) => { this.audio = source; }}>
<source src={chrome.extension.getURL("icons/beep.ogg")} type="audio/ogg"></source>
</audio>}
</NoticeComponent>
);
}
{/* Text Boxes */}
{this.getMessageBoxes()}
{/* Bottom Row */}
<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}>
getBottomRow(): JSX.Element[] {
return [
/* Bottom Row */
(<tr id={"sponsorSkipNoticeSecondRow" + this.idSuffix}
key={0}>
{/* Vote Button Container */}
{!this.state.thanksForVotingText ?
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
className="sponsorTimesVoteButtonsContainer">
{/* Vote Button Container */}
{!this.state.thanksForVotingText ?
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
className="sponsorTimesVoteButtonsContainer">
{/* Upvote Button */}
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
className="sponsorSkipObject voteButton"
style={{marginRight: "10px"}}
src={chrome.extension.getURL("icons/thumbs_up.svg")}
title={chrome.i18n.getMessage("upvoteButtonInfo")}
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
</img>
{/* Upvote Button */}
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
className="sponsorSkipObject voteButton"
style={{marginRight: "10px"}}
src={chrome.extension.getURL("icons/thumbs_up.svg")}
title={chrome.i18n.getMessage("upvoteButtonInfo")}
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
</img>
{/* Report Button */}
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
className="sponsorSkipObject voteButton"
src={chrome.extension.getURL("icons/thumbs_down.svg")}
title={chrome.i18n.getMessage("reportButtonInfo")}
onClick={() => this.adjustDownvotingState(true)}>
</img>
{/* Report Button */}
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
className="sponsorSkipObject voteButton"
src={chrome.extension.getURL("icons/thumbs_down.svg")}
title={chrome.i18n.getMessage("reportButtonInfo")}
onClick={() => this.adjustDownvotingState(true)}>
</img>
</td>
</td>
:
:
<td id={"sponsorTimesVoteButtonInfoMessage" + this.idSuffix}
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
style={{marginRight: "10px"}}>
{this.state.thanksForVotingText}
</td>
}
<td id={"sponsorTimesVoteButtonInfoMessage" + this.idSuffix}
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
style={{marginRight: "10px"}}>
{this.state.thanksForVotingText}
</td>
}
{/* Unskip Button */}
<td className="sponsorSkipNoticeUnskipSection">
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
className="sponsorSkipObject sponsorSkipNoticeButton"
style={{marginLeft: "4px"}}
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
{/* Unskip/Skip Button */}
{!this.props.smaller ? this.getSkipButton() : null}
{this.state.unskipText + " (" + Config.config.skipKeybind + ")"}
{/* Never show button if autoSkip is enabled */}
{!this.autoSkip ? "" :
<td className="sponsorSkipNoticeRightSection"
key={1}>
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
onClick={this.contentContainer().dontShowNoticeAgain}>
{chrome.i18n.getMessage("Hide")}
</button>
</td>
}
</tr>),
/* Downvote Options Row */
(this.state.downvoting &&
<tr id={"sponsorSkipNoticeDownvoteOptionsRow" + this.idSuffix}
key={2}>
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
{/* Normal downvote */}
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
{chrome.i18n.getMessage("downvoteDescription")}
</button>
{/* Category vote */}
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.openCategoryChooser()}>
{chrome.i18n.getMessage("incorrectCategory")}
</button>
</td>
{/* Never show button if autoSkip is enabled */}
{!this.autoSkip ? "" :
<td className="sponsorSkipNoticeRightSection">
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
onClick={this.contentContainer().dontShowNoticeAgain}>
{chrome.i18n.getMessage("Hide")}
</button>
</td>
}
</tr>
),
{/* Downvote Options Row */}
{this.state.downvoting &&
<tr id={"sponsorSkipNoticeDownvoteOptionsRow" + this.idSuffix}>
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
/* Category Chooser Row */
(this.state.choosingCategory &&
<tr id={"sponsorSkipNoticeCategoryChooserRow" + this.idSuffix}
key={3}>
<td>
{/* Category Selector */}
<select id={"sponsorTimeCategories" + this.idSuffix}
className="sponsorTimeCategories"
defaultValue={this.segments[0].category} //Just default to the first segment, as we don't know which they'll choose
ref={this.categoryOptionRef}>
{/* Normal downvote */}
{this.getCategoryOptions()}
</select>
{/* Submit Button */}
{this.segments.length === 1 &&
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
{chrome.i18n.getMessage("downvoteDescription")}
onClick={() => this.prepAction(SkipNoticeAction.CategoryVote)}>
{chrome.i18n.getMessage("submit")}
</button>
}
</td>
</tr>
),
{/* Category vote */}
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.openCategoryChooser()}>
/* Segment Chooser Row */
(this.state.actionState !== SkipNoticeAction.None &&
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}
key={4}>
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
{this.getSubmissionChooser()}
</td>
</tr>
)
];
}
{chrome.i18n.getMessage("incorrectCategory")}
</button>
</td>
getSkipButton(): JSX.Element {
if (this.state.showSkipButton && (this.segments.length > 1
|| getCategoryActionType(this.segments[0].category) !== CategoryActionType.POI
|| this.props.unskipTime)) {
return (
<span className="sponsorSkipNoticeUnskipSection">
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
className="sponsorSkipObject sponsorSkipNoticeButton"
style={{marginLeft: "4px"}}
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
</tr>
}
{/* Category Chooser Row */}
{this.state.choosingCategory &&
<tr id={"sponsorSkipNoticeCategoryChooserRow" + this.idSuffix}>
<td>
{/* Category Selector */}
<select id={"sponsorTimeCategories" + this.idSuffix}
className="sponsorTimeCategories"
defaultValue={this.segments[0].category} //Just default to the first segment, as we don't know which they'll choose
ref={this.categoryOptionRef}>
{this.getCategoryOptions()}
</select>
{/* Submit Button */}
{this.segments.length === 1 &&
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.prepAction(SkipNoticeAction.CategoryVote)}>
{chrome.i18n.getMessage("submit")}
</button>
}
</td>
</tr>
}
{/* Segment Chooser Row */}
{this.state.actionState !== SkipNoticeAction.None &&
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}>
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
{this.getSubmissionChooser()}
</td>
</tr>
}
</NoticeComponent>
);
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "")}
</button>
</span>
);
}
}
getSubmissionChooser(): JSX.Element[] {
@@ -289,6 +332,14 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
return elements;
}
onMouseEnter(): void {
if (this.state.smaller) {
this.setState({
smaller: false
});
}
}
prepAction(action: SkipNoticeAction): void {
if (this.segments.length === 1) {
this.performAction(0, action);
@@ -299,14 +350,15 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
}
getMessageBoxes(): JSX.Element[] | JSX.Element {
getMessageBoxes(): JSX.Element[] {
if (this.state.messages.length === 0) {
// Add a spacer if there is no text
return (
return [
<tr id={"sponsorSkipNoticeSpacer" + this.idSuffix}
className="sponsorBlockSpacer">
className="sponsorBlockSpacer"
key={"messageBoxSpacer"}>
</tr>
);
];
}
const elements: JSX.Element[] = [];
@@ -344,10 +396,10 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
break;
case SkipNoticeAction.CategoryVote:
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value, this)
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value as Category, this)
break;
case SkipNoticeAction.Unskip:
this.state.unskipCallback(index);
this.state.skipButtonCallback(index);
break;
}
@@ -391,7 +443,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
getCategoryOptions(): React.ReactElement[] {
const elements = [];
for (const category of CompileConfig.categoryList) {
const categories = CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable));
for (const category of categories) {
elements.push(
<option value={category}
key={category}>
@@ -404,42 +457,17 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
unskip(index: number): void {
this.contentContainer().unskipSponsorTime(this.segments[index]);
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime);
this.unskippedMode(index, chrome.i18n.getMessage("reskip"));
}
/** Sets up notice to be not skipped yet */
unskippedMode(index: number, buttonText: string): void {
//setup new callback and reset countdown
this.setState(this.getUnskippedModeInfo(index, buttonText), () => {
this.noticeRef.current.resetCountdown();
});
}
getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
const maxCountdownTime = () => {
const sponsorTime = this.segments[index];
const duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
return Math.max(duration, Config.config.skipNoticeDuration);
};
return {
unskipText: buttonText,
unskipCallback: (index) => this.reskip(index),
// change max duration to however much of the sponsor is left
maxCountdownTime: maxCountdownTime,
countdownTime: maxCountdownTime()
} as SkipNoticeState;
this.unskippedMode(index, this.getReskipText());
}
reskip(index: number): void {
this.contentContainer().reskipSponsorTime(this.segments[index]);
const newState: SkipNoticeState = {
unskipText: chrome.i18n.getMessage("unskip"),
unskipCallback: this.unskip.bind(this),
skipButtonText: this.getUnskipText(),
skipButtonCallback: this.unskip.bind(this),
maxCountdownTime: () => Config.config.skipNoticeDuration,
countdownTime: Config.config.skipNoticeDuration
@@ -456,7 +484,34 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
});
}
afterVote(segment: SponsorTime, type: number, category: string): void {
/** Sets up notice to be not skipped yet */
unskippedMode(index: number, buttonText: string): void {
//setup new callback and reset countdown
this.setState(this.getUnskippedModeInfo(index, buttonText), () => {
this.noticeRef.current.resetCountdown();
});
}
getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
const changeCountdown = getCategoryActionType(this.segments[index].category) === CategoryActionType.Skippable;
const maxCountdownTime = changeCountdown ? () => {
const sponsorTime = this.segments[index];
const duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
return Math.max(duration, Config.config.skipNoticeDuration);
} : this.state.maxCountdownTime;
return {
skipButtonText: buttonText,
skipButtonCallback: (index) => this.reskip(index),
// change max duration to however much of the sponsor is left
maxCountdownTime: maxCountdownTime,
countdownTime: maxCountdownTime()
} as SkipNoticeState;
}
afterVote(segment: SponsorTime, type: number, category: Category): void {
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
if (type === 0) {
@@ -506,6 +561,52 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.props.closeListener();
}
unmutedListener(): void {
if (this.props.segments.length === 1
&& this.props.segments[0].actionType === ActionType.Mute
&& this.contentContainer().v.currentTime >= this.props.segments[0].segment[1]) {
this.setState({
showSkipButton: false
});
}
}
private getUnskipText(): string {
switch (this.props.segments[0].actionType) {
case ActionType.Mute: {
return chrome.i18n.getMessage("unmute");
}
case ActionType.Skip:
default: {
return chrome.i18n.getMessage("unskip");
}
}
}
private getReskipText(): string {
switch (this.props.segments[0].actionType) {
case ActionType.Mute: {
return chrome.i18n.getMessage("mute");
}
case ActionType.Skip:
default: {
return chrome.i18n.getMessage("reskip");
}
}
}
private getSkipText(): string {
switch (this.props.segments[0].actionType) {
case ActionType.Mute: {
return chrome.i18n.getMessage("mute");
}
case ActionType.Skip:
default: {
return chrome.i18n.getMessage("skip");
}
}
}
}
export default SkipNoticeComponent;

View File

@@ -1,11 +1,12 @@
import * as React from "react";
import Config from "../config";
import * as CompileConfig from "../../config.json";
import Config from "../config";
import { ActionType, Category, CategoryActionType, ContentContainer, SponsorTime } from "../types";
import Utils from "../utils";
import { ContentContainer, SponsorTime } from "../types";
import { getCategoryActionType } from "../utils/categoryUtils";
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
const utils = new Utils();
export interface SponsorTimeEditProps {
@@ -16,6 +17,7 @@ export interface SponsorTimeEditProps {
contentContainer: ContentContainer,
submissionNotice: SubmissionNoticeComponent;
categoryList?: Category[];
}
export interface SponsorTimeEditState {
@@ -30,6 +32,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
idSuffix: string;
categoryOptionRef: React.RefObject<HTMLSelectElement>;
actionTypeOptionRef: React.RefObject<HTMLSelectElement>;
configUpdateListener: () => void;
@@ -37,6 +40,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
super(props);
this.categoryOptionRef = React.createRef();
this.actionTypeOptionRef = React.createRef();
this.idSuffix = this.props.idSuffix;
@@ -106,43 +110,47 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
onChange={(e) => {
const sponsorTimeEdits = this.state.sponsorTimeEdits;
sponsorTimeEdits[0] = e.target.value;
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = e.target.value;
this.setState({sponsorTimeEdits});
this.saveEditTimes();
}}>
</input>
<span>
{" " + chrome.i18n.getMessage("to") + " "}
</span>
{getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable ? (
<span>
<span>
{" " + chrome.i18n.getMessage("to") + " "}
</span>
<input id={"submittingTime1" + this.idSuffix}
className="sponsorTimeEdit sponsorTimeEditInput"
ref={oldYouTubeDarkStyles}
type="text"
value={this.state.sponsorTimeEdits[1]}
onChange={(e) => {
const sponsorTimeEdits = this.state.sponsorTimeEdits;
sponsorTimeEdits[1] = e.target.value;
<input id={"submittingTime1" + this.idSuffix}
className="sponsorTimeEdit sponsorTimeEditInput"
ref={oldYouTubeDarkStyles}
type="text"
value={this.state.sponsorTimeEdits[1]}
onChange={(e) => {
const sponsorTimeEdits = this.state.sponsorTimeEdits;
sponsorTimeEdits[1] = e.target.value;
this.setState({sponsorTimeEdits});
this.setState({sponsorTimeEdits});
this.saveEditTimes();
}}>
</input>
this.saveEditTimes();
}}>
</input>
<span id={"nowButton1" + this.idSuffix}
className="sponsorNowButton"
onClick={() => this.setTimeToNow(1)}>
{chrome.i18n.getMessage("bracketNow")}
</span>
<span id={"nowButton1" + this.idSuffix}
className="sponsorNowButton"
onClick={() => this.setTimeToNow(1)}>
{chrome.i18n.getMessage("bracketNow")}
</span>
<span id={"endButton" + this.idSuffix}
className="sponsorNowButton"
onClick={() => this.setTimeToEnd()}>
{chrome.i18n.getMessage("bracketEnd")}
</span>
<span id={"endButton" + this.idSuffix}
className="sponsorNowButton"
onClick={() => this.setTimeToEnd()}>
{chrome.i18n.getMessage("bracketEnd")}
</span>
</span>
): ""}
</div>
);
} else {
@@ -151,7 +159,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
className="sponsorTimeDisplay"
onClick={this.toggleEditTime.bind(this)}>
{utils.getFormattedTime(segment[0], true) +
((!isNaN(segment[1])) ? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
((!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable)
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
</div>
);
}
@@ -164,22 +173,36 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
{/* Category */}
<div style={{position: "relative"}}>
<select id={"sponsorTimeCategories" + this.idSuffix}
className="sponsorTimeCategories"
className="sponsorTimeEditSelector sponsorTimeCategories"
defaultValue={sponsorTime.category}
ref={this.categoryOptionRef}
onChange={this.categorySelectionChange.bind(this)}>
{this.getCategoryOptions()}
</select>
<img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
className="helpButton"
src={chrome.extension.getURL("icons/help.svg")}
title={chrome.i18n.getMessage("categoryGuidelines")}
onClick={() => chrome.runtime.sendMessage({"message": "openConfig"})}>
</img>
{/* open in new tab */}
<a href="https://wiki.sponsor.ajay.app/index.php/Segment_Categories"
target="_blank" rel="noreferrer">
<img id={"sponsorTimeCategoriesHelpButton" + this.idSuffix}
className="helpButton"
src={chrome.extension.getURL("icons/help.svg")}
title={chrome.i18n.getMessage("categoryGuidelines")} />
</a>
</div>
{/* Action Type */}
{CompileConfig.categorySupport[sponsorTime.category]?.length > 1 ? (
<div style={{position: "relative"}}>
<select id={"sponsorTimeActionTypes" + this.idSuffix}
className="sponsorTimeEditSelector sponsorTimeActionTypes"
defaultValue={sponsorTime.actionType}
ref={this.actionTypeOptionRef}
onChange={() => this.saveEditTimes()}>
{this.getActionTypeOptions(sponsorTime)}
</select>
</div>
): ""}
<br/>
{/* Editing Tools */}
@@ -190,7 +213,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
{chrome.i18n.getMessage("delete")}
</span>
{(!isNaN(segment[1])) ? (
{(!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable) ? (
<span id={"sponsorTimePreviewButton" + this.idSuffix}
className="sponsorTimeEditButton"
onClick={this.previewTime.bind(this)}>
@@ -225,7 +248,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
</option>
)];
for (const category of CompileConfig.categoryList) {
for (const category of (this.props.categoryList ?? CompileConfig.categoryList)) {
elements.push(
<option value={category}
key={category}>
@@ -239,7 +262,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
// See if show more categories was pressed
if (!Config.config.categorySelections.some((category) => category.name === event.target.value)) {
if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
const chosenCategory = event.target.value;
event.target.value = DEFAULT_CATEGORY;
@@ -247,15 +270,40 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
if (confirm(chrome.i18n.getMessage("enableThisCategoryFirst")
.replace("{0}", chrome.i18n.getMessage("category_" + chosenCategory)))) {
// Open options page
chrome.runtime.sendMessage({"message": "openConfig"});
chrome.runtime.sendMessage({message: "openConfig", hash: chosenCategory + "OptionsName"});
}
return;
}
if (getCategoryActionType(event.target.value as Category) === CategoryActionType.POI) {
this.setTimeTo(1, null);
this.props.contentContainer().updateEditButtonsOnPlayer();
if (this.props.contentContainer().sponsorTimesSubmitting
.some((segment, i) => segment.category === event.target.value && i !== this.props.index)) {
alert(chrome.i18n.getMessage("poiOnlyOneSegment"));
}
}
this.saveEditTimes();
}
getActionTypeOptions(sponsorTime: SponsorTime): React.ReactElement[] {
const elements = [];
for (const actionType of CompileConfig.categorySupport[sponsorTime.category]) {
elements.push(
<option value={actionType}
key={actionType}>
{chrome.i18n.getMessage(actionType)}
</option>
);
}
return elements;
}
setTimeToNow(index: number): void {
this.setTimeTo(index, this.props.contentContainer().getRealCurrentTime());
}
@@ -264,11 +312,16 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
this.setTimeTo(1, this.props.contentContainer().v.duration);
}
/**
* @param index
* @param time If null, will set time to the first index's time
*/
setTimeTo(index: number, time: number): void {
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
if (time === null) time = sponsorTime.segment[0];
sponsorTime.segment[index] =
time;
sponsorTime.segment[index] = time;
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTime.segment[1] = time;
this.setState({
sponsorTimeEdits: this.getFormattedSponsorTimesEdits(sponsorTime)
@@ -312,7 +365,9 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
}
}
sponsorTimesSubmitting[this.props.index].category = this.categoryOptionRef.current.value;
sponsorTimesSubmitting[this.props.index].category = this.categoryOptionRef.current.value as Category;
sponsorTimesSubmitting[this.props.index].actionType =
this.actionTypeOptionRef?.current ? this.actionTypeOptionRef.current.value as ActionType : ActionType.Skip;
Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimesSubmitting);
@@ -325,7 +380,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
const skipTime = sponsorTimes[index].segment[0];
this.props.contentContainer().previewTime(skipTime - 2);
this.props.contentContainer().previewTime(skipTime - (2 * this.props.contentContainer().v.playbackRate));
}
inspectTime(): void {
@@ -369,4 +424,4 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
}
}
export default SponsorTimeEditComponent;
export default SponsorTimeEditComponent;

View File

@@ -12,16 +12,16 @@ export interface SubmissionNoticeProps {
callback: () => unknown;
closeListener: () => void
closeListener: () => void;
}
export interface SubmissionNoticeeState {
export interface SubmissionNoticeState {
noticeTitle: string,
messages: string[],
idSuffix: string;
}
class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, SubmissionNoticeeState> {
class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, SubmissionNoticeState> {
// Contains functions and variables from the content script needed by the skip notice
contentContainer: ContentContainer;
@@ -95,7 +95,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
{/* Guidelines button */}
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
onClick={() => window.open("https://github.com/ajayyy/SponsorBlock/wiki/Guidelines")}>
onClick={() => window.open("https://wiki.sponsor.ajay.app/index.php/Guidelines")}>
{chrome.i18n.getMessage(Config.config.submissionCountSinceCategories > 3 ? "guidelines" : "readTheGuidelines")}
</button>
@@ -192,4 +192,4 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
}
}
export default SubmissionNoticeComponent;
export default SubmissionNoticeComponent;

View File

@@ -0,0 +1,116 @@
import * as React from "react";
import Config from "../config";
import { ContentContainer, VisualSegmentInfo } from "../types";
import Utils from "../utils";
const utils = new Utils();
export interface VisualSegmentEditProps {
index: number,
visual: VisualSegmentInfo,
idSuffix: string,
// Contains functions and variables from the content script needed by the skip notice
contentContainer: ContentContainer,
}
export interface VisualSegmentEditState {
}
class VisualSegmentEditComponent extends React.Component<VisualSegmentEditProps, VisualSegmentEditState> {
idSuffix: string;
configUpdateListener: () => void;
constructor(props: VisualSegmentEditProps) {
super(props);
this.idSuffix = this.props.idSuffix;
this.state = {
};
}
componentDidMount(): void {
// Add as a config listener
if (!this.configUpdateListener) {
this.configUpdateListener = () => this.configUpdate();
Config.configListeners.push(this.configUpdate.bind(this));
}
}
componentWillUnmount(): void {
if (this.configUpdateListener) {
Config.configListeners.splice(Config.configListeners.indexOf(this.configUpdate.bind(this)), 1);
}
}
render(): React.ReactElement {
return <>
<span id={`time${this.props.idSuffix}`}>
{utils.getFormattedTime(this.props.visual.time, true)}
</span>
<span>
-
</span>
{this.getBoundsElement()}
<span>
-
</span>
<input
type="checkBox"
onChange={(event) => this.colorUpdated(event)}
value={this.props.visual.color}
/>
<span>
Smooth
</span>
<span>
-
</span>
<input
className="categoryColorTextBox"
type="color"
onChange={(event) => this.colorUpdated(event)}
value={this.props.visual.color}
/>
</>
}
getBoundsElement(): React.ReactElement[] {
const elements: React.ReactElement[] = [];
for (const bound of this.props.visual.bounds) {
elements.push(
<span>
{`${bound[0] * 100}% x ${bound[0] * 100}%, `}
</span>
);
}
return elements;
}
colorUpdated(event: React.ChangeEvent<HTMLInputElement>): void {
this.props.visual.color = event.target.value;
}
configUpdate(): void {
this.forceUpdate();
}
}
export default VisualSegmentEditComponent;

View File

@@ -1,14 +1,11 @@
import * as CompileConfig from "../config.json";
import { CategorySelection, CategorySkipOption, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes } from "./types";
import Utils from "./utils";
const utils = new Utils();
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes } from "./types";
interface SBConfig {
userID: string,
/** Contains unsubmitted segments that the user has created. */
segmentTimes: SBMap<string, SponsorTime[]>,
defaultCategory: string,
defaultCategory: Category,
whitelistedChannels: string[],
forceChannelCheck: boolean,
skipKeybind: string,
@@ -20,9 +17,11 @@ interface SBConfig {
submissionCountSinceCategories: number, // New count used to show the "Read The Guidelines!!" message
showTimeWithSkips: boolean,
disableSkipping: boolean,
muteSegments: boolean,
trackViewCount: boolean,
trackViewCountInPrivate: boolean,
dontShowNotice: boolean,
noticeVisibilityMode: NoticeVisbilityMode,
hideVideoPlayerControls: boolean,
hideInfoButtonPlayerControls: boolean,
hideDeleteButtonPlayerControls: boolean,
@@ -40,8 +39,10 @@ interface SBConfig {
refetchWhenNotFound: boolean,
ytInfoPermissionGranted: boolean,
allowExpirements: boolean,
showDonationLink: boolean,
autoHideInfoButton: boolean,
autoSkipOnMusicVideos: boolean,
highlightCategoryUpdate: boolean
// What categories should be skipped
categorySelections: CategorySelection[],
@@ -63,6 +64,8 @@ interface SBConfig {
"preview-preview": PreviewBarOption,
"music_offtopic": PreviewBarOption,
"preview-music_offtopic": PreviewBarOption,
"poi_highlight": PreviewBarOption,
"preview-poi_highlight": PreviewBarOption,
}
}
@@ -148,7 +151,7 @@ const Config: SBObject = {
defaults: {
userID: null,
segmentTimes: new SBMap("segmentTimes"),
defaultCategory: "chooseACategory",
defaultCategory: "chooseACategory" as Category,
whitelistedChannels: [],
forceChannelCheck: false,
skipKeybind: "Enter",
@@ -160,9 +163,11 @@ const Config: SBObject = {
submissionCountSinceCategories: 0,
showTimeWithSkips: true,
disableSkipping: false,
muteSegments: true,
trackViewCount: true,
trackViewCountInPrivate: true,
dontShowNotice: false,
noticeVisibilityMode: NoticeVisbilityMode.FadedForAutoSkip,
hideVideoPlayerControls: false,
hideInfoButtonPlayerControls: false,
hideDeleteButtonPlayerControls: false,
@@ -180,11 +185,13 @@ const Config: SBObject = {
refetchWhenNotFound: true,
ytInfoPermissionGranted: false,
allowExpirements: true,
showDonationLink: true,
autoHideInfoButton: true,
autoSkipOnMusicVideos: false,
highlightCategoryUpdate: false, // TODO: Remove this once update is done
categorySelections: [{
name: "sponsor",
name: "sponsor" as Category,
option: CategorySkipOption.AutoSkip
}],
@@ -249,6 +256,14 @@ const Config: SBObject = {
"preview-music_offtopic": {
color: "#a6634a",
opacity: "0.7"
},
"poi_highlight": {
color: "#ff1684",
opacity: "0.7"
},
"preview-poi_highlight": {
color: "#9b044c",
opacity: "0.7"
}
}
},
@@ -345,6 +360,18 @@ function fetchConfig(): Promise<void> {
}
function migrateOldFormats(config: SBConfig) {
// Should eventually move into defaults
if (!config["highlightCategoryAdded"] && !config.categorySelections.some((s) => s.name === "poi_highlight")) {
config["highlightCategoryAdded"] = true;
config.categorySelections.push({
name: "poi_highlight" as Category,
option: CategorySkipOption.ManualSkip
});
config.categorySelections = config.categorySelections;
}
if (config["askAboutUnlistedVideos"]) {
chrome.storage.sync.remove("askAboutUnlistedVideos");
}
@@ -361,25 +388,6 @@ function migrateOldFormats(config: SBConfig) {
}
}
// Adding preview category
if (!config["previewCategoryUpdate"]) {
config["previewCategoryUpdate"] = true;
for (const selection of config.categorySelections) {
if (selection.name === "intro"
&& selection.option === CategorySkipOption.AutoSkip || selection.option === CategorySkipOption.ManualSkip) {
// Add a default skip option for preview category
config.categorySelections.push({
name: "preview",
option: CategorySkipOption.ManualSkip
});
// Ensure it gets updated
config.categorySelections = config.categorySelections;
break;
}
}
}
if (config["disableAutoSkip"]) {
for (const selection of config.categorySelections) {
if (selection.name === "sponsor") {
@@ -390,100 +398,6 @@ function migrateOldFormats(config: SBConfig) {
}
}
// Auto vote removal
if (config["autoUpvote"]) {
chrome.storage.sync.remove("autoUpvote");
}
// mobileUpdateShowCount removal
if (config["mobileUpdateShowCount"] !== undefined) {
chrome.storage.sync.remove("mobileUpdateShowCount");
}
// categoryUpdateShowCount removal
if (config["categoryUpdateShowCount"] !== undefined) {
chrome.storage.sync.remove("categoryUpdateShowCount");
}
// Channel URLS
if (config.whitelistedChannels.length > 0 &&
(config.whitelistedChannels[0] == null || config.whitelistedChannels[0].includes("/"))) {
const channelURLFixer = async() => {
const newChannelList: string[] = [];
for (const item of config.whitelistedChannels) {
if (item != null) {
if (item.includes("/channel/")) {
newChannelList.push(item.split("/")[2]);
} else if (item.includes("/user/") && utils.isContentScript()) {
// Replace channel URL with channelID
const response = await utils.asyncRequestToCustomServer("GET", "https://sponsor.ajay.app/invidious/api/v1/channels/" + item.split("/")[2] + "?fields=authorId");
if (response.ok) {
newChannelList.push((JSON.parse(response.responseText)).authorId);
} else {
// Add it at the beginning so it gets converted later
newChannelList.unshift(item);
}
} else if (item.includes("/user/")) {
// Add it at the beginning so it gets converted later (The API can only be called in the content script due to CORS issues)
newChannelList.unshift(item);
} else {
newChannelList.push(item);
}
}
}
config.whitelistedChannels = newChannelList;
}
channelURLFixer();
}
// Check if off-topic category needs to be removed
for (let i = 0; i < config.categorySelections.length; i++) {
if (config.categorySelections[i].name === "offtopic") {
config.categorySelections.splice(i, 1);
// Call set listener
config.categorySelections = config.categorySelections;
break;
}
}
// Migrate old "sponsorTimes"
if (config["sponsorTimes"]) {
let jsonData: unknown = config["sponsorTimes"];
// Check if data is stored in the old format for SBMap (a JSON string)
if (typeof jsonData === "string") {
try {
jsonData = JSON.parse(jsonData);
} catch(e) {
// Continue normally (out of this if statement)
}
}
// Otherwise junk data
if (Array.isArray(jsonData)) {
const oldMap = new Map(jsonData);
oldMap.forEach((sponsorTimes: [number, number][], key) => {
const segmentTimes: SponsorTime[] = [];
for (const segment of sponsorTimes) {
segmentTimes.push({
segment: segment,
category: "sponsor",
UUID: null
});
}
config.segmentTimes.rawSet(key, segmentTimes);
});
config.segmentTimes.update();
}
chrome.storage.sync.remove("sponsorTimes");
}
// Remove some old unused options
if (config["sponsorVideoID"] !== undefined) {
chrome.storage.sync.remove("sponsorVideoID");

View File

@@ -1,6 +1,5 @@
import Config from "./config";
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, ChannelIDInfo, ChannelIDStatus, SponsorSourceType } from "./types";
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, CategoryActionType, ChannelIDInfo, ChannelIDStatus, SponsorSourceType, SegmentUUID, Category, SkipToTimeParams, ToggleSkippable, ActionType, ScheduledTime } from "./types";
import { ContentContainer } from "./types";
import Utils from "./utils";
@@ -14,6 +13,9 @@ import SkipNoticeComponent from "./components/SkipNoticeComponent";
import SubmissionNotice from "./render/SubmissionNotice";
import { Message, MessageResponse } from "./messageTypes";
import * as Chat from "./js-components/chat";
import { getCategoryActionType } from "./utils/categoryUtils";
import { SkipButtonControlBar } from "./js-components/skipButtonControlBar";
import { Tooltip } from "./render/Tooltip";
// Hack to get the CSS loaded on permission-based sites (Invidious)
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
@@ -26,6 +28,7 @@ let sponsorTimes: SponsorTime[] = null;
let sponsorVideoID: VideoID = null;
// List of open skip notices
const skipNotices: SkipNotice[] = [];
let activeSkipKeybindElement: ToggleSkippable = null;
// JSON video info
let videoInfo: VideoInfo = null;
@@ -42,6 +45,7 @@ let sponsorSkipped: boolean[] = [];
//the video
let video: HTMLVideoElement;
let videoMuted = false; // Has it been attempted to be muted
let videoMutationObserver: MutationObserver = null;
// List of videos that have had event listeners added to them
const videosWithEventListeners: HTMLVideoElement[] = [];
@@ -69,6 +73,7 @@ let channelWhitelisted = false;
// create preview bar
let previewBar: PreviewBar = null;
let skipButtonControlBar: SkipButtonControlBar = null;
/** Element containing the player controls on the YouTube player. */
let controls: HTMLElement | null = null;
@@ -248,6 +253,8 @@ function resetValues() {
for (let i = 0; i < skipNotices.length; i++) {
skipNotices.pop().close();
}
skipButtonControlBar?.disable();
}
async function videoIDChange(id) {
@@ -280,7 +287,7 @@ async function videoIDChange(id) {
}
// Get new video info
getVideoInfo();
// getVideoInfo(); // Seems to have been replaced
// Update whitelist data when the video data is loaded
whitelistCheck();
@@ -390,7 +397,6 @@ function cancelSponsorSchedule(): void {
}
/**
*
* @param currentTime Optional if you don't want to use the actual current time
*/
function startSponsorSchedule(includeIntersectingSegments = false, currentTime?: number, includeNonIntersectingSegments = true): void {
@@ -406,6 +412,17 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
}
if (!video || video.paused) return;
if (currentTime === undefined || currentTime === null) currentTime = video.currentTime;
if (videoMuted && !inMuteSegment(currentTime)) {
video.muted = false;
videoMuted = false;
for (const notice of skipNotices) {
// So that the notice can hide buttons
notice.unmutedListener();
}
}
if (Config.config.disableSkipping || channelWhitelisted || (channelIDInfo.status === ChannelIDStatus.Fetching && Config.config.forceChannelCheck)){
return;
@@ -413,14 +430,12 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
if (incorrectVideoCheck()) return;
if (currentTime === undefined || currentTime === null) currentTime = video.currentTime;
const skipInfo = getNextSkipIndex(currentTime, includeIntersectingSegments, includeNonIntersectingSegments);
if (skipInfo.index === -1) return;
const currentSkip = skipInfo.array[skipInfo.index];
const skipTime: number[] = [currentSkip.segment[0], skipInfo.array[skipInfo.endIndex].segment[1]];
const skipTime: number[] = [currentSkip.scheduledTime, skipInfo.array[skipInfo.endIndex].segment[1]];
const timeUntilSponsor = skipTime[0] - currentTime;
const videoID = sponsorVideoID;
@@ -438,8 +453,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
}
// Don't skip if this category should not be skipped
if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ShowOverlay
&& skipInfo.array !== sponsorTimesSubmitting) return;
if (!shouldSkip(currentSkip) && skipInfo.array !== sponsorTimesSubmitting) return;
const skippingFunction = () => {
let forcedSkipTime: number = null;
@@ -449,9 +463,15 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
if (incorrectVideoCheck(videoID, currentSkip)) return;
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
skipToTime(video, skipTime, skippingSegments, skipInfo.openNotice);
skipToTime({
v: video,
skipTime,
skippingSegments,
openNotice: skipInfo.openNotice
});
if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ManualSkip) {
if (utils.getCategorySelection(currentSkip.category)?.option === CategorySkipOption.ManualSkip
|| currentSkip.actionType === ActionType.Mute) {
forcedSkipTime = skipTime[0] + 0.001;
} else {
forcedSkipTime = skipTime[1];
@@ -470,12 +490,19 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
}
}
function inMuteSegment(currentTime: number): boolean {
const checkFunction = (segment) => segment.actionType === ActionType.Mute && segment.segment[0] <= currentTime && segment.segment[1] > currentTime;
return sponsorTimes?.some(checkFunction) || sponsorTimesSubmitting.some(checkFunction);
}
/**
* This makes sure the videoID is still correct and if the sponsorTime is included
*/
function incorrectVideoCheck(videoID?: string, sponsorTime?: SponsorTime): boolean {
const currentVideoID = getYouTubeVideoID(document.URL);
if (currentVideoID !== (videoID || sponsorVideoID) || (sponsorTime && (!sponsorTimes || !sponsorTimes.includes(sponsorTime)) && !sponsorTimesSubmitting.includes(sponsorTime))) {
if (currentVideoID !== (videoID || sponsorVideoID) || (sponsorTime
&& (!sponsorTimes || !sponsorTimes?.some((time) => time.segment === sponsorTime.segment))
&& !sponsorTimesSubmitting.some((time) => time.segment === sponsorTime.segment))) {
// Something has really gone wrong
console.error("[SponsorBlock] The videoID recorded when trying to skip is different than what it should be.");
console.error("[SponsorBlock] VideoID recorded: " + sponsorVideoID + ". Actual VideoID: " + currentVideoID);
@@ -511,6 +538,7 @@ function refreshVideoAttachments() {
videosWithEventListeners.push(video);
setupVideoListeners();
setupSkipButtonControlBar();
}
}
}
@@ -562,6 +590,22 @@ function setupVideoListeners() {
startSponsorSchedule();
}
if (!Config.config.dontShowNotice) {
const currentPoiSegment = sponsorTimes?.find((segment) =>
getCategoryActionType(segment.category) === CategoryActionType.POI &&
video.currentTime - segment.segment[0] > 0 &&
video.currentTime - segment.segment[0] < previewBar.getMinimumSize(true));
if (currentPoiSegment && !skipNotices.some((notice) => notice.segments.some((s) => s.UUID === currentPoiSegment.UUID))) {
skipToTime({
v: video,
skipTime: currentPoiSegment.segment,
skippingSegments: [currentPoiSegment],
openNotice: true,
forceAutoSkip: true
});
}
}
});
video.addEventListener('ratechange', () => startSponsorSchedule());
// Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740)
@@ -578,6 +622,22 @@ function setupVideoListeners() {
}
}
function setupSkipButtonControlBar() {
if (!skipButtonControlBar) {
skipButtonControlBar = new SkipButtonControlBar({
skip: (segment) => skipToTime({
v: video,
skipTime: segment.segment,
skippingSegments: [segment],
openNotice: true,
forceAutoSkip: true
})
});
}
skipButtonControlBar.attachToPage();
}
async function sponsorsLookup(id: string, keepOldSubmissions = true) {
if (!video) refreshVideoAttachments();
//there is still no video here
@@ -601,6 +661,7 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
categories,
actionTypes: Config.config.muteSegments ? [ActionType.Skip, ActionType.Mute] : [ActionType.Skip],
userAgent: `${chrome.runtime.id}`
});
@@ -632,7 +693,8 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
// Hide all submissions smaller than the minimum duration
if (Config.config.minDuration !== 0) {
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration) {
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration
&& getCategoryActionType(sponsorTimes[i].category) !== CategoryActionType.POI) {
sponsorTimes[i].hidden = SponsorHideType.MinimumDuration;
}
}
@@ -682,19 +744,11 @@ function retryFetch(): void {
sponsorDataFound = false;
//check if this video was uploaded recently
utils.wait(() => !!videoInfo).then(() => {
const dateUploaded = videoInfo?.microformat?.playerMicroformatRenderer?.uploadDate;
//if less than 3 days old
if (Date.now() - new Date(dateUploaded).getTime() < 259200000) {
setTimeout(() => {
if (sponsorVideoID && sponsorTimes?.length === 0) {
sponsorsLookup(sponsorVideoID);
}
}, 10000 + Math.random() * 30000);
setTimeout(() => {
if (sponsorVideoID && sponsorTimes?.length === 0) {
sponsorsLookup(sponsorVideoID);
}
});
}, 10000 + Math.random() * 30000);
sponsorLookupRetries = 0;
}
@@ -707,24 +761,47 @@ function retryFetch(): void {
function startSkipScheduleCheckingForStartSponsors() {
if (!switchingVideos) {
// See if there are any starting sponsors
let startingSponsor = -1;
let startingSegmentTime = -1;
let startingSegment: SponsorTime = null;
for (const time of sponsorTimes) {
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSponsor && time.segment[1] > video.currentTime) {
startingSponsor = time.segment[0];
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
startingSegmentTime = time.segment[0];
startingSegment = time;
break;
}
}
if (startingSponsor === -1) {
if (startingSegmentTime === -1) {
for (const time of sponsorTimesSubmitting) {
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSponsor && time.segment[1] > video.currentTime) {
startingSponsor = time.segment[0];
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
startingSegmentTime = time.segment[0];
startingSegment = time;
break;
}
}
}
if (startingSponsor !== -1) {
startSponsorSchedule(undefined, startingSponsor);
// For highlight category
const poiSegments = sponsorTimes
.filter((time) => time.segment[1] > video.currentTime && getCategoryActionType(time.category) === CategoryActionType.POI)
.sort((a, b) => b.segment[0] - a.segment[0]);
for (const time of poiSegments) {
const skipOption = utils.getCategorySelection(time.category)?.option;
if (skipOption !== CategorySkipOption.ShowOverlay) {
skipToTime({
v: video,
skipTime: time.segment,
skippingSegments: [time],
openNotice: true,
unskipTime: video.currentTime
});
if (skipOption === CategorySkipOption.AutoSkip) break;
}
}
if (startingSegmentTime !== -1) {
startSponsorSchedule(undefined, startingSegmentTime);
} else {
startSponsorSchedule();
}
@@ -733,6 +810,8 @@ function startSkipScheduleCheckingForStartSponsors() {
/**
* Get the video info for the current tab from YouTube
*
* TODO: Replace
*/
async function getVideoInfo(): Promise<void> {
const result = await utils.asyncRequestToCustomServer("GET", "https://www.youtube.com/get_video_info?video_id=" + sponsorVideoID + "&html5=1&c=TVHTML5&cver=7.20190319");
@@ -811,7 +890,6 @@ function updatePreviewBar(): void {
if (video === null) return;
const previewBarSegments: PreviewBarSegment[] = [];
if (sponsorTimes) {
sponsorTimes.forEach((segment) => {
if (segment.hidden !== SponsorHideType.Visible) return;
@@ -820,6 +898,7 @@ function updatePreviewBar(): void {
segment: segment.segment as [number, number],
category: segment.category,
unsubmitted: false,
showLarger: getCategoryActionType(segment.category) === CategoryActionType.POI
});
});
}
@@ -829,6 +908,7 @@ function updatePreviewBar(): void {
segment: segment.segment as [number, number],
category: segment.category,
unsubmitted: true,
showLarger: getCategoryActionType(segment.category) === CategoryActionType.POI
});
});
@@ -883,31 +963,33 @@ async function whitelistCheck() {
* Returns info about the next upcoming sponsor skip
*/
function getNextSkipIndex(currentTime: number, includeIntersectingSegments: boolean, includeNonIntersectingSegments: boolean):
{array: SponsorTime[], index: number, endIndex: number, openNotice: boolean} {
{array: ScheduledTime[], index: number, endIndex: number, openNotice: boolean} {
const sponsorStartTimes = getStartTimes(sponsorTimes, includeIntersectingSegments, includeNonIntersectingSegments);
const sponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimes, includeIntersectingSegments, includeNonIntersectingSegments, currentTime, true, true);
const { includedTimes: submittedArray, scheduledTimes: sponsorStartTimes } =
getStartTimes(sponsorTimes, includeIntersectingSegments, includeNonIntersectingSegments);
const { scheduledTimes: sponsorStartTimesAfterCurrentTime } = getStartTimes(sponsorTimes, includeIntersectingSegments, includeNonIntersectingSegments, currentTime, true, true);
const minSponsorTimeIndex = sponsorStartTimes.indexOf(Math.min(...sponsorStartTimesAfterCurrentTime));
const endTimeIndex = getLatestEndTimeIndex(sponsorTimes, minSponsorTimeIndex);
const endTimeIndex = getLatestEndTimeIndex(submittedArray, minSponsorTimeIndex);
const unsubmittedSponsorStartTimes = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, includeNonIntersectingSegments);
const unsubmittedSponsorStartTimesAfterCurrentTime = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, includeNonIntersectingSegments, currentTime, false, false);
const { includedTimes: unsubmittedArray, scheduledTimes: unsubmittedSponsorStartTimes } =
getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, includeNonIntersectingSegments);
const { scheduledTimes: unsubmittedSponsorStartTimesAfterCurrentTime } = getStartTimes(sponsorTimesSubmitting, includeIntersectingSegments, includeNonIntersectingSegments, currentTime, false, false);
const minUnsubmittedSponsorTimeIndex = unsubmittedSponsorStartTimes.indexOf(Math.min(...unsubmittedSponsorStartTimesAfterCurrentTime));
const previewEndTimeIndex = getLatestEndTimeIndex(sponsorTimesSubmitting, minUnsubmittedSponsorTimeIndex);
const previewEndTimeIndex = getLatestEndTimeIndex(unsubmittedArray, minUnsubmittedSponsorTimeIndex);
if ((minUnsubmittedSponsorTimeIndex === -1 && minSponsorTimeIndex !== -1) ||
sponsorStartTimes[minSponsorTimeIndex] < unsubmittedSponsorStartTimes[minUnsubmittedSponsorTimeIndex]) {
return {
array: sponsorTimes,
array: submittedArray,
index: minSponsorTimeIndex,
endIndex: endTimeIndex,
openNotice: true
};
} else {
return {
array: sponsorTimesSubmitting,
array: unsubmittedArray,
index: minUnsubmittedSponsorTimeIndex,
endIndex: previewEndTimeIndex,
openNotice: false
@@ -931,7 +1013,10 @@ function getNextSkipIndex(currentTime: number, includeIntersectingSegments: bool
function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideHiddenSponsors = true): number {
// Only combine segments for AutoSkip
if (index == -1 ||
shouldAutoSkip(sponsorTimes[index])) return index;
!shouldAutoSkip(sponsorTimes[index])
|| sponsorTimes[index].actionType !== ActionType.Skip) {
return index;
}
// Default to the normal endTime
let latestEndTimeIndex = index;
@@ -942,7 +1027,8 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH
if (currentSegment[0] <= latestEndTime && currentSegment[1] > latestEndTime
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)
&& shouldAutoSkip(sponsorTimes[i])) {
&& shouldAutoSkip(sponsorTimes[i])
&& sponsorTimes[i].actionType === ActionType.Skip) {
// Overlapping segment
latestEndTimeIndex = i;
}
@@ -967,23 +1053,42 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH
* the current time, but end after
*/
function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments: boolean, includeNonIntersectingSegments: boolean,
minimum?: number, onlySkippableSponsors = false, hideHiddenSponsors = false): number[] {
if (sponsorTimes === null) return [];
minimum?: number, onlySkippableSponsors = false, hideHiddenSponsors = false): {includedTimes: ScheduledTime[], scheduledTimes: number[]} {
if (!sponsorTimes) return {includedTimes: [], scheduledTimes: []};
const startTimes: number[] = [];
const includedTimes: ScheduledTime[] = [];
const scheduledTimes: number[] = [];
for (let i = 0; i < sponsorTimes?.length; i++) {
const possibleTimes = sponsorTimes.map((sponsorTime) => ({
...sponsorTime,
scheduledTime: sponsorTime.segment[0]
}));
// Schedule at the end time to know when to unmute
sponsorTimes.filter(sponsorTime => sponsorTime.actionType === ActionType.Mute)
.forEach(sponsorTime => {
if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime)) {
possibleTimes.push({
...sponsorTime,
scheduledTime: sponsorTime.segment[1]
});
}
});
for (let i = 0; i < possibleTimes.length; i++) {
if ((minimum === undefined
|| ((includeNonIntersectingSegments && sponsorTimes[i].segment[0] >= minimum)
|| (includeIntersectingSegments && sponsorTimes[i].segment[0] < minimum && sponsorTimes[i].segment[1] > minimum)))
&& (!onlySkippableSponsors || utils.getCategorySelection(sponsorTimes[i].category).option !== CategorySkipOption.ShowOverlay)
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)) {
|| ((includeNonIntersectingSegments && possibleTimes[i].scheduledTime >= minimum)
|| (includeIntersectingSegments && possibleTimes[i].scheduledTime < minimum && possibleTimes[i].segment[1] > minimum)))
&& (!onlySkippableSponsors || shouldSkip(possibleTimes[i]))
&& (!hideHiddenSponsors || possibleTimes[i].hidden === SponsorHideType.Visible)
&& getCategoryActionType(possibleTimes[i].category) === CategoryActionType.Skippable) {
startTimes.push(sponsorTimes[i].segment[0]);
scheduledTimes.push(possibleTimes[i].scheduledTime);
includedTimes.push(possibleTimes[i]);
}
}
return startTimes;
return { includedTimes, scheduledTimes };
}
/**
@@ -1006,7 +1111,7 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
let counted = false;
for (const segment of skippingSegments) {
const index = sponsorTimes.indexOf(segment);
const index = sponsorTimes?.findIndex((s) => s.segment === segment.segment);
if (index !== -1 && !sponsorSkipped[index]) {
sponsorSkipped[index] = true;
if (!counted) {
@@ -1021,24 +1126,66 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
}
//skip from the start time to the end time for a certain index sponsor time
function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: SponsorTime[], openNotice: boolean) {
// There will only be one submission if it is manual skip
const autoSkip: boolean = shouldAutoSkip(skippingSegments[0]);
function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, unskipTime}: SkipToTimeParams): void {
if (Config.config.disableSkipping) return;
if ((autoSkip || sponsorTimesSubmitting.includes(skippingSegments[0])) && v.currentTime !== skipTime[1]) {
// Fix for looped videos not working when skipping to the end #426
// for some reason you also can't skip to 1 second before the end
if (v.loop && v.duration > 1 && skipTime[1] >= v.duration - 1) {
v.currentTime = 0;
} else {
v.currentTime = skipTime[1];
// There will only be one submission if it is manual skip
const autoSkip: boolean = forceAutoSkip || shouldAutoSkip(skippingSegments[0]);
if ((autoSkip || sponsorTimesSubmitting.some((time) => time.segment === skippingSegments[0].segment))
&& v.currentTime !== skipTime[1]) {
switch(skippingSegments[0].actionType) {
case ActionType.Skip: {
// Fix for looped videos not working when skipping to the end #426
// for some reason you also can't skip to 1 second before the end
if (v.loop && v.duration > 1 && skipTime[1] >= v.duration - 1) {
v.currentTime = 0;
} else {
v.currentTime = skipTime[1];
}
break;
}
case ActionType.Mute: {
if (!v.muted) {
v.muted = true;
videoMuted = true;
}
break;
}
}
}
if (openNotice) {
//send out the message saying that a sponsor message was skipped
if (!Config.config.dontShowNotice || !autoSkip) {
skipNotices.push(new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer));
if (!autoSkip
&& skippingSegments.length === 1
&& getCategoryActionType(skippingSegments[0].category) === CategoryActionType.POI) {
skipButtonControlBar.enable(skippingSegments[0], !Config.config.highlightCategoryUpdate ? 15 : 0);
if (!Config.config.highlightCategoryUpdate) {
new Tooltip({
text: chrome.i18n.getMessage("highlightNewFeature"),
link: "https://blog.ajay.app/highlight-sponsorblock",
referenceNode: skipButtonControlBar.getElement().parentElement,
prependElement: skipButtonControlBar.getElement(),
timeout: 15
});
Config.config.highlightCategoryUpdate = true;
}
activeSkipKeybindElement?.setShowKeybindHint(false);
activeSkipKeybindElement = skipButtonControlBar;
} else {
if (openNotice) {
//send out the message saying that a sponsor message was skipped
if (!Config.config.dontShowNotice || !autoSkip) {
const newSkipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer, unskipTime);
skipNotices.push(newSkipNotice);
activeSkipKeybindElement?.setShowKeybindHint(false);
activeSkipKeybindElement = newSkipNotice;
}
}
}
@@ -1046,21 +1193,30 @@ function skipToTime(v: HTMLVideoElement, skipTime: number[], skippingSegments: S
if (autoSkip) sendTelemetryAndCount(skippingSegments, skipTime[1] - skipTime[0], true);
}
function unskipSponsorTime(segment: SponsorTime) {
if (sponsorTimes != null) {
function unskipSponsorTime(segment: SponsorTime, unskipTime: number = null) {
if (segment.actionType === ActionType.Mute) {
video.muted = false;
videoMuted = false;
} else {
//add a tiny bit of time to make sure it is not skipped again
video.currentTime = segment.segment[0] + 0.001;
video.currentTime = unskipTime ?? segment.segment[0] + 0.001;
}
}
function reskipSponsorTime(segment: SponsorTime) {
const skippedTime = Math.max(segment.segment[1] - video.currentTime, 0);
const segmentDuration = segment.segment[1] - segment.segment[0];
const fullSkip = skippedTime / segmentDuration > manualSkipPercentCount;
video.currentTime = segment.segment[1];
sendTelemetryAndCount([segment], skippedTime, fullSkip);
startSponsorSchedule(true, segment.segment[1], false);
if (segment.actionType === ActionType.Mute) {
video.muted = true;
videoMuted = true;
} else {
const skippedTime = Math.max(segment.segment[1] - video.currentTime, 0);
const segmentDuration = segment.segment[1] - segment.segment[0];
const fullSkip = skippedTime / segmentDuration > manualSkipPercentCount;
video.currentTime = segment.segment[1];
sendTelemetryAndCount([segment], skippedTime, fullSkip);
startSponsorSchedule(true, segment.segment[1], false);
}
}
function createButton(baseID: string, title: string, callback: () => void, imageName: string, isDraggable = false): HTMLElement {
@@ -1103,7 +1259,13 @@ function createButton(baseID: string, title: string, callback: () => void, image
function shouldAutoSkip(segment: SponsorTime): boolean {
return utils.getCategorySelection(segment.category)?.option === CategorySkipOption.AutoSkip ||
(Config.config.autoSkipOnMusicVideos && sponsorTimes.some((s) => s.category === "music_offtopic"));
(Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic")
&& getCategoryActionType(segment.category) === CategoryActionType.Skippable);
}
function shouldSkip(segment: SponsorTime): boolean {
return utils.getCategorySelection(segment.category)?.option !== CategorySkipOption.ShowOverlay ||
(Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic"));
}
function getControls(): HTMLElement | false {
@@ -1189,7 +1351,7 @@ function updateEditButtonsOnPlayer(): void {
creatingSegment = isSegmentCreationInProgress();
// Show only if there are any segments to submit
submitButtonVisible = sponsorTimesSubmitting.length > 1 || (sponsorTimesSubmitting.length > 0 && !creatingSegment);
submitButtonVisible = sponsorTimesSubmitting.length > 0;
// Show only if there are any segments to delete
deleteButtonVisible = sponsorTimesSubmitting.length > 1 || (sponsorTimesSubmitting.length > 0 && !creatingSegment);
@@ -1237,6 +1399,7 @@ function startOrEndTimingNewSegment() {
segment: [getRealCurrentTime()],
UUID: null,
category: Config.config.defaultCategory,
actionType: ActionType.Skip,
source: SponsorSourceType.Local
});
} else {
@@ -1293,6 +1456,7 @@ function updateSponsorTimesSubmitting(getFromConfig = true) {
segment: segmentTime.segment,
UUID: segmentTime.UUID,
category: segmentTime.category,
actionType: segmentTime.actionType,
source: segmentTime.source
});
}
@@ -1364,11 +1528,13 @@ function openInfoMenu() {
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");
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");
refreshSegments.src = chrome.extension.getURL("icons/refresh.svg");
@@ -1427,7 +1593,7 @@ function clearSponsorTimes() {
}
//if skipNotice is null, it will not affect the UI
function vote(type: number, UUID: string, category?: string, skipNotice?: SkipNoticeComponent) {
function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent) {
if (skipNotice !== null && skipNotice !== undefined) {
//add loading info
skipNotice.addVoteButtonInfo.bind(skipNotice)(chrome.i18n.getMessage("Loading"))
@@ -1533,7 +1699,8 @@ async function sendSubmitMessage() {
// Check to see if any of the submissions are below the minimum duration set
if (Config.config.minDuration > 0) {
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
if (sponsorTimesSubmitting[i].segment[1] - sponsorTimesSubmitting[i].segment[0] < Config.config.minDuration) {
if (sponsorTimesSubmitting[i].segment[1] - sponsorTimesSubmitting[i].segment[0] < Config.config.minDuration
&& getCategoryActionType(sponsorTimesSubmitting[i].category) !== CategoryActionType.POI) {
const confirmShort = chrome.i18n.getMessage("shortCheck") + "\n\n" +
getSegmentsMessage(sponsorTimesSubmitting);
@@ -1631,9 +1798,8 @@ function hotkeyListener(e: KeyboardEvent): void {
switch (key) {
case skipKey:
if (skipNotices.length > 0) {
const latestSkipNotice = skipNotices[skipNotices.length - 1];
latestSkipNotice.toggleSkip.call(latestSkipNotice);
if (activeSkipKeybindElement) {
activeSkipKeybindElement.toggleSkip.call(activeSkipKeybindElement);
}
break;
case startSponsorKey:

17
src/help.ts Normal file
View File

@@ -0,0 +1,17 @@
import Config from "./config";
import { showDonationLink } from "./utils/configUtils";
import Utils from "./utils";
const utils = new Utils();
window.addEventListener('DOMContentLoaded', init);
async function init() {
utils.localizeHtmlPage();
await utils.wait(() => Config.config !== null);
if (!showDonationLink()) {
document.getElementById("sbDonate").style.display = "none";
}
}

View File

@@ -15,6 +15,7 @@ export interface PreviewBarSegment {
segment: [number, number];
category: string;
unsubmitted: boolean;
showLarger: boolean;
}
class PreviewBar {
@@ -101,10 +102,13 @@ class PreviewBar {
let segment: PreviewBarSegment | null = null;
let currentSegmentLength = Infinity;
for (const seg of this.segments) {
if (seg.segment[0] <= timeInSeconds && seg.segment[1] > timeInSeconds) {
const segmentLength = seg.segment[1] - seg.segment[0];
for (const seg of this.segments) {//
const segmentLength = seg.segment[1] - seg.segment[0];
const minSize = this.getMinimumSize(seg.showLarger);
const startTime = segmentLength !== 0 ? seg.segment[0] : Math.floor(seg.segment[0]);
const endTime = segmentLength > minSize ? seg.segment[1] : Math.ceil(seg.segment[0] + minSize);
if (startTime <= timeInSeconds && endTime >= timeInSeconds) {
if (segmentLength < currentSegmentLength) {
currentSegmentLength = segmentLength;
segment = seg;
@@ -181,10 +185,10 @@ class PreviewBar {
});
}
createBar({category, unsubmitted, segment}: PreviewBarSegment): HTMLLIElement {
createBar({category, unsubmitted, segment, showLarger}: PreviewBarSegment): HTMLLIElement {
const bar = document.createElement('li');
bar.classList.add('previewbar');
bar.innerHTML = '&nbsp;';
bar.innerHTML = showLarger ? '&nbsp;&nbsp;' : '&nbsp;';
const fullCategoryName = (unsubmitted ? 'preview-' : '') + category;
bar.setAttribute('sponsorblock-category', fullCategoryName);
@@ -193,7 +197,7 @@ class PreviewBar {
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[fullCategoryName]?.opacity;
bar.style.position = "absolute";
bar.style.width = this.timeToPercentage(segment[1] - segment[0]);
if (segment[1] - segment[0] > 0) bar.style.width = this.timeToPercentage(segment[1] - segment[0]);
bar.style.left = this.timeToPercentage(segment[0]);
return bar;
@@ -216,6 +220,13 @@ class PreviewBar {
timeToPercentage(time: number): string {
return Math.min(100, time / this.videoDuration * 100) + '%';
}
/*
* Approximate size on preview bar for smallest element (due to &nbsp)
*/
getMinimumSize(showLarger = false): number {
return this.videoDuration * (showLarger ? 0.006 : 0.003);
}
}
export default PreviewBar;

View File

@@ -0,0 +1,102 @@
import Config from "../config";
import { SponsorTime } from "../types";
import { getSkippingText } from "../utils/categoryUtils";
export interface SkipButtonControlBarProps {
skip: (segment: SponsorTime) => void;
}
export class SkipButtonControlBar {
container: HTMLElement;
skipIcon: HTMLImageElement;
textContainer: HTMLElement;
chapterText: HTMLElement;
segment: SponsorTime;
showKeybindHint = true;
timeout: NodeJS.Timeout;
duration = 0;
skip: (segment: SponsorTime) => void;
constructor(props: SkipButtonControlBarProps) {
this.skip = props.skip;
this.container = document.createElement("div");
this.container.classList.add("skipButtonControlBarContainer");
this.container.classList.add("hidden");
this.skipIcon = document.createElement("img");
this.skipIcon.src = chrome.runtime.getURL("icons/skipIcon.svg");
this.skipIcon.classList.add("ytp-button");
this.skipIcon.id = "sbSkipIconControlBarImage";
this.textContainer = document.createElement("div");
this.container.appendChild(this.skipIcon);
this.container.appendChild(this.textContainer);
this.container.addEventListener("click", () => this.toggleSkip());
this.container.addEventListener("mouseenter", () => this.stopTimer());
this.container.addEventListener("mouseenter", () => console.log("mouseenter"));
this.container.addEventListener("mouseleave", () => this.startTimer());
this.container.addEventListener("mouseleave", () => console.log("mouseleave"));
}
getElement(): HTMLElement {
return this.container;
}
attachToPage(): void {
const leftControlsContainer = document.querySelector(".ytp-left-controls");
this.chapterText = document.querySelector(".ytp-chapter-container");
if (leftControlsContainer && !leftControlsContainer.contains(this.container)) {
leftControlsContainer.insertBefore(this.container, this.chapterText);
}
}
enable(segment: SponsorTime, duration?: number): void {
if (duration) this.duration = duration;
this.segment = segment;
this.refreshText();
this.startTimer();
}
refreshText(): void {
if (this.segment) {
this.chapterText?.classList?.add("hidden");
this.container.classList.remove("hidden");
this.textContainer.innerText = getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "");
}
}
setShowKeybindHint(show: boolean): void {
this.showKeybindHint = show;
this.refreshText();
}
stopTimer(): void {
if (this.timeout) clearTimeout(this.timeout);
}
startTimer(): void {
this.stopTimer();
this.timeout = setTimeout(() => this.disable(), Math.max(Config.config.skipNoticeDuration, this.duration) * 1000);
}
disable(): void {
this.container.classList.add("hidden");
this.chapterText?.classList?.remove("hidden");
}
toggleSkip(): void {
this.skip(this.segment);
this.disable();
}
}

View File

@@ -6,6 +6,7 @@ window.SB = Config;
import Utils from "./utils";
import CategoryChooser from "./render/CategoryChooser";
import { showDonationLink } from "./utils/configUtils";
const utils = new Utils();
window.addEventListener('DOMContentLoaded', init);
@@ -28,6 +29,10 @@ async function init() {
await utils.wait(() => Config.config !== null);
if (!showDonationLink()) {
document.getElementById("sbDonate").style.visibility = "hidden";
}
// Set all of the toggle options to the correct option
const optionsContainer = document.getElementById("options");
const optionsElements = optionsContainer.querySelectorAll("*");
@@ -40,9 +45,10 @@ async function init() {
continue;
}
const option = optionsElements[i].getAttribute("sync-option");
switch (optionsElements[i].getAttribute("option-type")) {
case "toggle": {
const option = optionsElements[i].getAttribute("sync-option");
const optionResult = Config.config[option];
const checkbox = optionsElements[i].querySelector("input");
@@ -95,16 +101,15 @@ async function init() {
break;
}
case "text-change": {
const textChangeOption = optionsElements[i].getAttribute("sync-option");
const textChangeInput = <HTMLInputElement> optionsElements[i].querySelector(".option-text-box");
const textChangeSetButton = <HTMLElement> optionsElements[i].querySelector(".text-change-set");
textChangeInput.value = Config.config[textChangeOption];
textChangeInput.value = Config.config[option];
textChangeSetButton.addEventListener("click", async () => {
// See if anything extra must be done
switch (textChangeOption) {
switch (option) {
case "serverAddress": {
const result = validateServerAddress(textChangeInput.value);
@@ -130,7 +135,7 @@ async function init() {
}
}
Config.config[textChangeOption] = textChangeInput.value;
Config.config[option] = textChangeInput.value;
});
// Reset to the default if needed
@@ -138,9 +143,9 @@ async function init() {
textChangeResetButton.addEventListener("click", () => {
if (!confirm(chrome.i18n.getMessage("areYouSureReset"))) return;
Config.config[textChangeOption] = Config.defaults[textChangeOption];
Config.config[option] = Config.defaults[option];
textChangeInput.value = Config.config[textChangeOption];
textChangeInput.value = Config.config[option];
});
break;
@@ -175,30 +180,42 @@ async function init() {
break;
}
case "display":{
case "display": {
updateDisplayElement(<HTMLElement> optionsElements[i])
break;
}
case "number-change": {
const numberChangeOption = optionsElements[i].getAttribute("sync-option");
const configValue = Config.config[numberChangeOption];
const configValue = Config.config[option];
const numberInput = optionsElements[i].querySelector("input");
if (isNaN(configValue) || configValue < 0) {
numberInput.value = Config.defaults[numberChangeOption];
numberInput.value = Config.defaults[option];
} else {
numberInput.value = configValue;
}
numberInput.addEventListener("input", () => {
Config.config[numberChangeOption] = numberInput.value;
Config.config[option] = numberInput.value;
});
break;
}
case "selector": {
const configValue = Config.config[option];
const selectorElement = optionsElements[i].querySelector(".selector-element") as HTMLSelectElement;
selectorElement.value = configValue;
selectorElement.addEventListener("change", () => {
let value: string | number = selectorElement.value;
if (!isNaN(Number(value))) value = Number(value);
Config.config[option] = value;
});
break;
}
case "react-CategoryChooserComponent":
new CategoryChooser(optionsElements[i]);
break;
break;
}
}

View File

@@ -1,8 +1,10 @@
import Config from "./config";
import Utils from "./utils";
import { SponsorTime, SponsorHideType } from "./types";
import { SponsorTime, SponsorHideType, CategoryActionType } from "./types";
import { Message, MessageResponse } from "./messageTypes";
import { showDonationLink } from "./utils/configUtils";
import { getCategoryActionType } from "./utils/categoryUtils";
const utils = new Utils();
interface MessageListener {
@@ -12,7 +14,7 @@ interface MessageListener {
class MessageHandler {
messageListener: MessageListener;
constructor (messageListener?: MessageListener) {
constructor(messageListener?: MessageListener) {
this.messageListener = messageListener;
}
@@ -95,6 +97,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
"usernameInput",
"usernameValue",
"submitUsername",
"sbPopupIconCopyUserID",
// More
"submissionSection",
"mainControls",
@@ -107,14 +110,14 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
"sbDonate"
].forEach(id => PageElements[id] = document.getElementById(id));
// Hide donate button on safari
if (navigator.vendor === "Apple Computer, Inc.") {
// Hide donate button if wanted (Safari, or user choice)
if (!showDonationLink()) {
PageElements.sbDonate.style.display = "none";
}
//setup click listeners
PageElements.sponsorStart.addEventListener("click", sendSponsorStartMessage);
PageElements.whitelistToggle.addEventListener("change", function() {
PageElements.whitelistToggle.addEventListener("change", function () {
if (this.checked) {
whitelistChannel();
} else {
@@ -122,7 +125,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
});
PageElements.whitelistForceCheck.addEventListener("click", openOptions);
PageElements.toggleSwitch.addEventListener("change", function() {
PageElements.toggleSwitch.addEventListener("change", function () {
toggleSkipping(!this.checked);
});
PageElements.submitTimes.addEventListener("click", submitTimes);
@@ -133,6 +136,7 @@ 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)));
/** If true, the content script is in the process of creating a new segment. */
let creatingSegment = false;
@@ -174,7 +178,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
if (userID != undefined) {
//there are probably some views on these submissions then
//get the amount of views from the sponsors submitted
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(response) {
utils.sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function (response) {
if (response.status == 200) {
const viewCount = JSON.parse(response.responseText).viewCount;
if (viewCount != 0) {
@@ -191,7 +195,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
});
//get this time in minutes
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(response) {
utils.sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function (response) {
if (response.status == 200) {
const minutesSaved = JSON.parse(response.responseText).timeSaved;
if (minutesSaved != 0) {
@@ -237,7 +241,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
getSegmentsFromContentScript(false);
function onTabs(tabs, updating: boolean): void {
messageHandler.sendMessage(tabs[0].id, {message: 'getVideoID'}, function(result) {
messageHandler.sendMessage(tabs[0].id, { message: 'getVideoID' }, function (result) {
if (result !== undefined && result.videoID) {
currentVideoID = result.videoID;
creatingSegment = result.creatingSegment;
@@ -262,7 +266,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
messageHandler.sendMessage(
tabs[0].id,
{message: 'isInfoFound', updating},
{ message: 'isInfoFound', updating },
infoFound
);
}
@@ -274,8 +278,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, (tabs) => onTabs(tabs, updating));
}
function infoFound(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
if(chrome.runtime.lastError) {
function infoFound(request: { found: boolean, sponsorTimes: SponsorTime[] }) {
if (chrome.runtime.lastError) {
//This page doesn't have the injected content script, or at least not yet
displayNoVideo();
return;
@@ -290,12 +294,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
if (request.found) {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsorFound");
PageElements.refreshSegmentsButton.classList.remove("hidden");
displayDownloadedSponsorTimes(request);
} else {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
PageElements.refreshSegmentsButton.classList.add("hidden");
}
}
@@ -306,8 +308,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
{message: 'isChannelWhitelisted'},
function(response) {
{ message: 'isChannelWhitelisted' },
function (response) {
if (response.value) {
PageElements.whitelistChannel.style.display = "none";
PageElements.unwhitelistChannel.style.display = "unset";
@@ -315,7 +317,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
}
});
}
}
);
}
@@ -327,7 +329,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, (tabs) => {
messageHandler.sendMessage(
tabs[0].id,
{from: 'popup', message: 'sponsorStart'},
{ from: 'popup', message: 'sponsorStart' },
async (response) => {
startSponsorCallback(response);
@@ -351,7 +353,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
});
}
function startSponsorCallback(response: {creatingSegment: boolean}) {
function startSponsorCallback(response: { creatingSegment: boolean }) {
creatingSegment = response.creatingSegment;
// Only update the segments after a segment was created
@@ -364,12 +366,12 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
//display the video times from the array at the top, in a different section
function displayDownloadedSponsorTimes(request: {found: boolean, sponsorTimes: SponsorTime[]}) {
function displayDownloadedSponsorTimes(request: { found: boolean, sponsorTimes: SponsorTime[] }) {
if (request.sponsorTimes != undefined) {
// Sort list by start time
const segmentTimes = request.sponsorTimes
.sort((a, b) => a.segment[1] - b.segment[1])
.sort((a, b) => a.segment[0] - b.segment[0]);
.sort((a, b) => a.segment[1] - b.segment[1])
.sort((a, b) => a.segment[0] - b.segment[0]);
//add them as buttons to the issue reporting container
const container = document.getElementById("issueReporterTimeButtons");
@@ -388,7 +390,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
categoryColorCircle.style.backgroundColor = Config.config.barTypes[segmentTimes[i].category]?.color;
categoryColorCircle.classList.add("dot");
categoryColorCircle.classList.add("sponsorTimesCategoryColorCircle");
let extraInfo = "";
if (segmentTimes[i].hidden === SponsorHideType.Downvoted) {
//this one is downvoted
@@ -397,10 +399,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//this one is too short
extraInfo = " (" + chrome.i18n.getMessage("hiddenDueToDuration") + ")";
}
const textNode = document.createTextNode(utils.shortCategoryName(segmentTimes[i].category) + extraInfo);
const segmentTimeFromToNode = document.createElement("div");
segmentTimeFromToNode.innerText = utils.getFormattedTime(segmentTimes[i].segment[0], true) + " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true);
segmentTimeFromToNode.innerText = utils.getFormattedTime(segmentTimes[i].segment[0], true) +
(getCategoryActionType(segmentTimes[i].category) !== CategoryActionType.POI
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true)
: "");
segmentTimeFromToNode.style.margin = "5px";
sponsorTimeButton.appendChild(categoryColorCircle);
@@ -446,7 +451,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
voteButtonsContainer.appendChild(uuidButton);
//add click listener to open up vote panel
sponsorTimeButton.addEventListener("click", function() {
sponsorTimeButton.addEventListener("click", function () {
voteButtonsContainer.classList.toggle("voteButtonsContainer--hide");
});
@@ -478,15 +483,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
{message: 'submitTimes'},
{ message: 'submitTimes' },
);
});
}
}
function showNoticeAgain() {
Config.config.dontShowNotice = false;
PageElements.showNoticeAgain.style.display = "none";
}
@@ -499,11 +504,11 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//make the options div visible
function openOptions() {
chrome.runtime.sendMessage({"message": "openConfig"});
chrome.runtime.sendMessage({ "message": "openConfig" });
}
function openHelp() {
chrome.runtime.sendMessage({"message": "openHelp"});
chrome.runtime.sendMessage({ "message": "openHelp" });
}
//make the options username setting option visible
@@ -516,7 +521,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.setUsernameContainer.style.display = "none";
PageElements.setUsername.style.display = "flex";
PageElements.setUsername.classList.add("SBExpanded");
PageElements.setUsernameStatusContainer.style.display = "none";
PageElements.sponsorTimesContributionsContainer.classList.add("hidden");
@@ -555,18 +560,18 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
function displayNoVideo() {
document.getElementById("loadingIndicator").innerText = chrome.i18n.getMessage("noVideoID");
}
function addVoteMessage(message, UUID) {
const voteButtonsContainer = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
voteButtonsContainer.style.display = "none";
const voteStatusContainer = document.getElementById("sponsorTimesVoteStatusContainer" + UUID);
voteStatusContainer.style.removeProperty("display");
const thanksForVotingText = document.getElementById("sponsorTimesThanksForVotingText" + UUID);
thanksForVotingText.innerText = message;
}
function vote(type, UUID) {
//add loading info
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
@@ -597,8 +602,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
{message: 'getChannelID'},
function(response) {
{ message: 'getChannelID' },
function (response) {
if (!response.channelID) {
alert(chrome.i18n.getMessage("channelDataNotFound") + " https://github.com/ajayyy/SponsorBlock/issues/753");
return;
@@ -630,10 +635,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, tabs => {
messageHandler.sendMessage(
tabs[0].id, {
message: 'whitelistChange',
value: true
});
}
message: 'whitelistChange',
value: true
});
}
);
}
);
@@ -648,38 +653,38 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
{message: 'getChannelID'},
function(response) {
{ message: 'getChannelID' },
function (response) {
//get whitelisted channels
let whitelistedChannels = Config.config.whitelistedChannels;
if (whitelistedChannels == undefined) {
whitelistedChannels = [];
}
let whitelistedChannels = Config.config.whitelistedChannels;
if (whitelistedChannels == undefined) {
whitelistedChannels = [];
}
//remove this channel
const index = whitelistedChannels.indexOf(response.channelID);
whitelistedChannels.splice(index, 1);
//remove this channel
const index = whitelistedChannels.indexOf(response.channelID);
whitelistedChannels.splice(index, 1);
//change button
PageElements.whitelistChannel.style.display = "unset";
PageElements.unwhitelistChannel.style.display = "none";
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
//change button
PageElements.whitelistChannel.style.display = "unset";
PageElements.unwhitelistChannel.style.display = "none";
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
//save this
Config.config.whitelistedChannels = whitelistedChannels;
//save this
Config.config.whitelistedChannels = whitelistedChannels;
//send a message to the client
messageHandler.query({
active: true,
currentWindow: true
}, tabs => {
messageHandler.sendMessage(
tabs[0].id, {
message: 'whitelistChange',
value: false
});
}
);
//send a message to the client
messageHandler.query({
active: true,
currentWindow: true
}, tabs => {
messageHandler.sendMessage(
tabs[0].id, {
message: 'whitelistChange',
value: false
});
}
);
}
);
});
@@ -694,12 +699,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}, tabs => {
messageHandler.sendMessage(
tabs[0].id,
{message: 'refreshSegments'},
{ message: 'refreshSegments' },
(response) => {
infoFound(response);
stopAnimation();
}
)}
)
}
);
}
@@ -707,7 +713,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
* Should skipping be disabled (visuals stay)
*/
function toggleSkipping(disabled) {
Config.config.disableSkipping = disabled;
Config.config.disableSkipping = disabled;
let hiddenButton = PageElements.disableSkipping;
let shownButton = PageElements.enableSkipping;
@@ -728,13 +734,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
* @param {float} seconds
* @returns {string}
*/
function getFormattedHours(minutes) {
minutes = Math.round(minutes * 10) / 10
const hours = Math.floor(minutes / 60);
return (hours > 0 ? hours + "h " : "") + (minutes % 60).toFixed(1);
}
//end of function
function getFormattedHours(minutes) {
minutes = Math.round(minutes * 10) / 10
const hours = Math.floor(minutes / 60);
return (hours > 0 ? hours + "h " : "") + (minutes % 60).toFixed(1);
}
//end of function
}
if (chrome.tabs != undefined) {

View File

@@ -5,7 +5,8 @@ import Utils from "../utils";
const utils = new Utils();
import SkipNoticeComponent, { SkipNoticeAction } from "../components/SkipNoticeComponent";
import { SponsorTime, ContentContainer } from "../types";
import { SponsorTime, ContentContainer, NoticeVisbilityMode } from "../types";
import Config from "../config";
class SkipNotice {
segments: SponsorTime[];
@@ -17,7 +18,7 @@ class SkipNotice {
skipNoticeRef: React.MutableRefObject<SkipNoticeComponent>;
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer) {
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer, unskipTime: number = null) {
this.skipNoticeRef = React.createRef();
this.segments = segments;
@@ -44,11 +45,20 @@ class SkipNotice {
autoSkip={autoSkip}
contentContainer={contentContainer}
ref={this.skipNoticeRef}
closeListener={() => this.close()} />,
closeListener={() => this.close()}
smaller={Config.config.noticeVisibilityMode >= NoticeVisbilityMode.MiniForAll
|| (Config.config.noticeVisibilityMode >= NoticeVisbilityMode.MiniForAutoSkip && autoSkip)}
unskipTime={unskipTime} />,
this.noticeElement
);
}
setShowKeybindHint(value: boolean): void {
this.skipNoticeRef?.current?.setState({
showKeybindHint: value
});
}
close(): void {
ReactDOM.unmountComponentAtNode(this.noticeElement);
@@ -59,7 +69,11 @@ class SkipNotice {
}
toggleSkip(): void {
this.skipNoticeRef.current.prepAction(SkipNoticeAction.Unskip);
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip);
}
unmutedListener(): void {
this.skipNoticeRef?.current?.unmutedListener();
}
}

73
src/render/Tooltip.tsx Normal file
View File

@@ -0,0 +1,73 @@
import * as React from "react";
import * as ReactDOM from "react-dom";
export interface TooltipProps {
text: string,
link?: string,
referenceNode: HTMLElement,
prependElement?: HTMLElement, // Element to append before
bottomOffset?: string
timeout?: number;
}
export class Tooltip {
text: string;
container: HTMLDivElement;
timer: NodeJS.Timeout;
constructor(props: TooltipProps) {
props.bottomOffset ??= "70px";
this.text = props.text;
this.container = document.createElement('div');
this.container.id = "sponsorTooltip" + props.text;
this.container.style.display = "relative";
if (props.prependElement) {
props.referenceNode.insertBefore(this.container, props.prependElement);
} else {
props.referenceNode.appendChild(this.container);
}
if (props.timeout) {
this.timer = setTimeout(() => this.close(), props.timeout * 1000);
}
ReactDOM.render(
<div style={{bottom: props.bottomOffset}}
className="sponsorBlockTooltip" >
<div>
<img className="sponsorSkipLogo sponsorSkipObject"
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
</img>
<span className="sponsorSkipObject">
{this.text + (props.link ? ". " : "")}
{props.link ?
<a style={{textDecoration: "underline"}}
target="_blank"
rel="noopener noreferrer"
href={props.link}>
{chrome.i18n.getMessage("LearnMore")}
</a>
: null}
</span>
</div>
<button className="sponsorSkipObject sponsorSkipNoticeButton"
style ={{float: "right" }}
onClick={() => this.close()}>
{chrome.i18n.getMessage("GotIt")}
</button>
</div>,
this.container
)
}
close(): void {
ReactDOM.unmountComponentAtNode(this.container);
this.container.remove();
if (this.timer) clearTimeout(this.timer);
}
}

View File

@@ -4,9 +4,9 @@ import SkipNotice from "./render/SkipNotice";
export interface ContentContainer {
(): {
vote: (type: number, UUID: string, category?: string, skipNotice?: SkipNoticeComponent) => void,
vote: (type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent) => void,
dontShowNoticeAgain: () => void,
unskipSponsorTime: (segment: SponsorTime) => void,
unskipSponsorTime: (segment: SponsorTime, unskipTime: number) => void,
sponsorTimes: SponsorTime[],
sponsorTimesSubmitting: SponsorTime[],
skipNotices: SkipNotice[],
@@ -41,7 +41,7 @@ export enum CategorySkipOption {
}
export interface CategorySelection {
name: string;
name: Category;
option: CategorySkipOption
}
@@ -51,6 +51,20 @@ export enum SponsorHideType {
MinimumDuration
}
export enum CategoryActionType {
Skippable = "", // Strings are used to find proper language configs
POI = "_POI"
}
export enum ActionType {
Skip = "skip",
Mute = "mute",
Visual = "visual",
}
export type SegmentUUID = string & { __segmentUUIDBrand: unknown };
export type Category = string & { __categoryBrand: unknown };
export enum SponsorSourceType {
Server = undefined,
Local = 1
@@ -58,12 +72,27 @@ export enum SponsorSourceType {
export interface SponsorTime {
segment: [number] | [number, number];
UUID: string;
UUID: SegmentUUID;
category: string;
category: Category;
actionType: ActionType;
hidden?: SponsorHideType;
source?: SponsorSourceType;
visual: string;
}
export interface VisualSegmentInfo {
time: number;
bounds: [number, number][];
smooth: boolean;
curve: string;
color: string;
}
export interface ScheduledTime extends SponsorTime {
scheduledTime: number;
}
export interface PreviewBarOption {
@@ -151,7 +180,7 @@ export interface VideoInfo {
isUnlisted: boolean,
hasYpcMetadata: boolean,
viewCount: string,
category: string,
category: Category,
publishDate: string,
ownerChannelName: string,
uploadDate: string,
@@ -177,4 +206,26 @@ export enum ChannelIDStatus {
export interface ChannelIDInfo {
id: string,
status: ChannelIDStatus
}
export interface SkipToTimeParams {
v: HTMLVideoElement,
skipTime: number[],
skippingSegments: SponsorTime[],
openNotice: boolean,
forceAutoSkip?: boolean,
unskipTime?: number
}
export interface ToggleSkippable {
toggleSkip: () => void;
setShowKeybindHint: (show: boolean) => void;
}
export enum NoticeVisbilityMode {
FullSize = 0,
MiniForAutoSkip = 1,
MiniForAll = 2,
FadedForAutoSkip = 3,
FadedForAll = 4
}

View File

@@ -261,7 +261,6 @@ export default class Utils {
const objects = document.getElementsByClassName("sponsorBlockPageBody")[0].children;
for (let j = 0; j < objects.length; j++) {
const obj = objects[j];
const localizedMessage = this.getLocalizedMessage(obj.innerHTML.toString());
if (localizedMessage) obj.innerHTML = localizedMessage;
}
@@ -356,7 +355,7 @@ export default class Utils {
}, (response) => {
resolve(response);
});
})
});
}
/**
@@ -429,6 +428,8 @@ export default class Utils {
}
getFormattedTime(seconds: number, precise?: boolean): string {
seconds = Math.max(seconds, 0);
const hours = Math.floor(seconds / 60 / 60);
const minutes = Math.floor(seconds / 60) % 60;
let minutesDisplay = String(minutes);

View File

@@ -0,0 +1,47 @@
import { ActionType, Category, CategoryActionType, SponsorTime } from "../types";
export function getSkippingText(segments: SponsorTime[], autoSkip: boolean): string {
const categoryName = chrome.i18n.getMessage(segments.length > 1 ? "multipleSegments"
: "category_" + segments[0].category + "_short") || chrome.i18n.getMessage("category_" + segments[0].category);
if (autoSkip) {
let messageId = "";
if (getCategoryActionType(segments[0].category) === CategoryActionType.Skippable) {
switch (segments[0].actionType) {
case ActionType.Skip:
messageId = "skipped";
break;
case ActionType.Mute:
messageId = "muted";
break;
}
} else {
messageId = "skipped_to_category";
}
return chrome.i18n.getMessage(messageId).replace("{0}", categoryName);
} else {
let messageId = "";
if (getCategoryActionType(segments[0].category) === CategoryActionType.Skippable) {
switch (segments[0].actionType) {
case ActionType.Skip:
messageId = "skip_category";
break;
case ActionType.Mute:
messageId = "mute_category";
break;
}
} else {
messageId = "skip_to_category";
}
return chrome.i18n.getMessage(messageId).replace("{0}", categoryName);
}
}
export function getCategoryActionType(category: Category): CategoryActionType {
if (category.startsWith("poi_")) {
return CategoryActionType.POI;
} else {
return CategoryActionType.Skippable;
}
}

5
src/utils/configUtils.ts Normal file
View File

@@ -0,0 +1,5 @@
import Config from "../config";
export function showDonationLink(): boolean {
return navigator.vendor !== "Apple Computer, Inc." && Config.config.showDonationLink;
}

29
src/utils/visualUtils.ts Normal file
View File

@@ -0,0 +1,29 @@
import { VisualSegmentInfo } from "../types";
import { Svg, SVG } from "@svgdotjs/svg.js";
export function toSVG(visuals: VisualSegmentInfo[]): Svg {
const svg = SVG().size(100, 100);
for (const visual of visuals) {
const path = svg.polygon();
path.fill(visual.color);
// path.stroke({
// width: 1,
// color: visual.color
// });
path.plot(visual.bounds);
}
console.log(svg.svg());
return svg;
}
export function toVisualSegmentInfo(svgInput: string | Svg): VisualSegmentInfo {
let svg = svgInput as Svg;
if (typeof svgInput === "string") {
svg = SVG().svg(svgInput);
}
throw new Error("Method not implemented.");
}

157
test/selenium.test.ts Normal file
View File

@@ -0,0 +1,157 @@
import { Builder, By, until, WebDriver } from "selenium-webdriver";
import * as Chrome from "selenium-webdriver/chrome";
import * as Path from "path";
test("Selenium Chrome test", async () => {
const driver = await setup();
try {
await waitForInstall(driver);
// This video has no ads
await goToVideo(driver, "jNQXAC9IVRw");
await createSegment(driver, "4", "10.33", "0:04.000 to 0:10.330");
await editSegments(driver, 0, "0:04.000", "0:10.330", "5", "13.211", "0:05.000 to 0:13.211", false);
await autoskipSegment(driver, 5, 13.211);
await setSegmentCategory(driver, 0, 1, false);
await setSegmentActionType(driver, 0, 1, false);
await editSegments(driver, 0, "0:05.000", "0:13.211", "5", "7.5", "0:05.000 to 0:07.500", false);
await muteSkipSegment(driver, 5, 7.5);
} finally {
await driver.quit();
}
}, 100_000);
async function setup(): Promise<WebDriver> {
const options = new Chrome.Options();
options.addArguments("--load-extension=" + Path.join(__dirname, "../dist/"));
options.addArguments("--mute-audio");
options.addArguments("--disable-features=PreloadMediaEngagementData, MediaEngagementBypassAutoplayPolicies");
const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build();
driver.manage().setTimeouts({
implicit: 5000
});
return driver;
}
async function waitForInstall(driver: WebDriver, startingTab = 0): Promise<void> {
// Selenium only knows about the one tab it's on,
// so we can't wait for the help page to appear
await driver.sleep(3000);
const handles = await driver.getAllWindowHandles();
await driver.switchTo().window(handles[startingTab]);
}
async function goToVideo(driver: WebDriver, videoId: string): Promise<void> {
await driver.get("https://www.youtube.com/watch?v=" + videoId);
await driver.wait(until.elementIsVisible(await driver.findElement(By.className("ytd-video-primary-info-renderer"))));
}
async function createSegment(driver: WebDriver, startTime: string, endTime: string, expectedDisplayedTime: string): Promise<void> {
const startSegmentButton = await driver.findElement(By.id("startSegmentButton"));
const cancelSegmentButton = await driver.findElement(By.id("cancelSegmentButton"));
await driver.executeScript("document.querySelector('video').currentTime = " + startTime);
await startSegmentButton.click();
await driver.wait(until.elementIsVisible(cancelSegmentButton));
await driver.executeScript("document.querySelector('video').currentTime = " + endTime);
await startSegmentButton.click();
await driver.wait(until.elementIsNotVisible(cancelSegmentButton));
const submitButton = await driver.findElement(By.id("submitButton"));
await submitButton.click();
const sponsorTimeDisplays = await driver.findElements(By.className("sponsorTimeDisplay"));
const sponsorTimeDisplay = sponsorTimeDisplays[sponsorTimeDisplays.length - 1];
await driver.wait(until.elementTextIs(sponsorTimeDisplay, expectedDisplayedTime));
}
async function editSegments(driver: WebDriver, index: number, expectedStartTimeBox: string, expectedEndTimeBox: string,
startTime: string, endTime: string, expectedDisplayedTime: string, openSubmitBox: boolean): Promise<void> {
if (openSubmitBox) {
const submitButton = await driver.findElement(By.id("submitButton"));
await submitButton.click();
}
let editButton = await driver.findElement(By.id("sponsorTimeEditButtonSubmissionNotice" + index));
let sponsorTimeDisplays = await driver.findElements(By.className("sponsorTimeDisplay"));
let sponsorTimeDisplay = sponsorTimeDisplays[index];
await sponsorTimeDisplay.click();
// Ensure edit time appears
await driver.findElement(By.id("submittingTime0SubmissionNotice" + index));
// Try the edit button too
await editButton.click();
await editButton.click();
const startTimeBox = await driver.findElement(By.id("submittingTime0SubmissionNotice" + index));
expect((await startTimeBox.getAttribute("value"))).toBe(expectedStartTimeBox);
await startTimeBox.clear();
await startTimeBox.sendKeys(startTime);
const endTimeBox = await driver.findElement(By.id("submittingTime1SubmissionNotice" + index));
expect((await endTimeBox.getAttribute("value"))).toBe(expectedEndTimeBox);
await endTimeBox.clear();
await endTimeBox.sendKeys(endTime);
editButton = await driver.findElement(By.id("sponsorTimeEditButtonSubmissionNotice" + index));
await editButton.click();
sponsorTimeDisplays = await driver.findElements(By.className("sponsorTimeDisplay"));
sponsorTimeDisplay = sponsorTimeDisplays[index];
await driver.wait(until.elementTextIs(sponsorTimeDisplay, expectedDisplayedTime));
}
async function setSegmentCategory(driver: WebDriver, index: number, categoryIndex: number, openSubmitBox: boolean): Promise<void> {
if (openSubmitBox) {
const submitButton = await driver.findElement(By.id("submitButton"));
await submitButton.click();
}
const categorySelection = await driver.findElement(By.css(`#sponsorTimeCategoriesSubmissionNotice${index} > option:nth-child(${categoryIndex + 1})`));
await categorySelection.click();
}
async function setSegmentActionType(driver: WebDriver, index: number, actionTypeIndex: number, openSubmitBox: boolean): Promise<void> {
if (openSubmitBox) {
const submitButton = await driver.findElement(By.id("submitButton"));
await submitButton.click();
}
const actionTypeSelection = await driver.findElement(By.css(`#sponsorTimeActionTypesSubmissionNotice${index} > option:nth-child(${actionTypeIndex + 1})`));
await actionTypeSelection.click();
}
async function autoskipSegment(driver: WebDriver, startTime: number, endTime: number): Promise<void> {
const video = await driver.findElement(By.css("video"));
await driver.executeScript("document.querySelector('video').currentTime = " + (startTime - 0.5));
await driver.executeScript("document.querySelector('video').play()");
await driver.sleep(1300);
expect(parseFloat(await video.getAttribute("currentTime"))).toBeGreaterThan(endTime);
await driver.executeScript("document.querySelector('video').pause()");
}
async function muteSkipSegment(driver: WebDriver, startTime: number, endTime: number): Promise<void> {
const duration = endTime - startTime;
const video = await driver.findElement(By.css("video"));
await driver.executeScript("document.querySelector('video').currentTime = " + (startTime - 0.5));
await driver.executeScript("document.querySelector('video').play()");
await driver.sleep(1300);
expect(await video.getAttribute("muted")).toEqual("true");
await driver.sleep(duration * 1000 + 300);
expect(await video.getAttribute("muted")).toBeNull(); // Default is null for some reason
await driver.executeScript("document.querySelector('video').pause()");
}

View File

@@ -0,0 +1,21 @@
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
//@ts-ignore
import { createSVGWindow } from "svgdom";
import { registerWindow } from "@svgdotjs/svg.js";
import { toSVG } from "../src/utils/visualUtils";
beforeAll(() => {
const window = createSVGWindow();
registerWindow(window, window.document)
})
test("Visual Segment SVG converter", async () => {
toSVG([{
time: 0,
bounds: [[0, 0], [25, 0], [25, 40], [0, 30]],
smooth: false,
curve: "linear",
color: "#000000",
}]);
});

View File

@@ -8,6 +8,11 @@
"noEmitOnError": false,
"typeRoots": [ "node_modules/@types" ],
"resolveJsonModule": true,
"jsx": "react"
"jsx": "react",
"lib": [
"es2019",
"dom",
"dom.iterable"
]
}
}

View File

@@ -10,6 +10,7 @@ module.exports = env => ({
background: path.join(__dirname, srcDir + 'background.ts'),
content: path.join(__dirname, srcDir + 'content.ts'),
options: path.join(__dirname, srcDir + 'options.ts'),
help: path.join(__dirname, srcDir + 'help.ts'),
permissions: path.join(__dirname, srcDir + 'permissions.ts')
},
output: {