Compare commits

...

146 Commits
3.0.5 ... 3.4.1

Author SHA1 Message Date
Ajay Ramachandran
07cf1764dc bump version 2021-10-17 19:12:38 -04:00
Ajay Ramachandran
aeb9c5b203 New Crowdin updates (#1012) 2021-10-17 19:12:09 -04:00
Ajay Ramachandran
ad3f0c1a06 Don't filter segments when switching videos still
Fixes #989
2021-10-16 13:41:07 -04:00
Ajay Ramachandran
4bc180077e Fix segments sometimes displaying after the seek bar if at the end 2021-10-16 13:15:47 -04:00
Ajay Ramachandran
510db57666 bump version 2021-10-15 19:29:15 -04:00
Ajay Ramachandran
5ee6a2195d Merge pull request #1002 from maximmax42/patch-1
Added margin-bottom for #sponsorblockPopup
2021-10-15 19:28:54 -04:00
Ajay Ramachandran
63d4c1aedb New Crowdin updates (#990) 2021-10-15 19:01:03 -04:00
Ajay Ramachandran
e9204be96f Merge pull request #988 from FlorianZahn/copySegment
Copy segments into your unsubmitted and SkipNotice changes
2021-10-15 19:00:38 -04:00
Ajay Ramachandran
0863061665 Fix indentation in manifest 2021-10-15 18:57:36 -04:00
FlorianZahn
8aea74160c only change color if user isVip 2021-10-15 21:01:32 +02:00
FlorianZahn
d375a97e99 Vip Warning also in popup 2021-10-15 20:52:15 +02:00
Ajay Ramachandran
fe5499e80a Code style fixes and react errors 2021-10-15 00:56:48 -04:00
Ajay Ramachandran
598da2a7fe Merge branch 'copySegment' of https://github.com/florianzahn/sponsorblock into pr/FlorianZahn/988 2021-10-15 00:31:09 -04:00
Ajay Ramachandran
fcbeeb9fc1 Remove extra segment lookup and use lockbyhash lookup 2021-10-15 00:31:07 -04:00
FlorianZahn
d82ef63d89 fix loading text not displaying upon voting 2021-10-14 19:05:36 +02:00
FlorianZahn
a457a8009e SkipNotice countdown now updates again on config update 2021-10-14 08:05:55 +02:00
FlorianZahn
7698be8462 Remove merge mistake 2021-10-14 07:21:07 +02:00
FlorianZahn
738868da8d Merge branch 'master' into copySegment 2021-10-14 07:16:55 +02:00
Ajay Ramachandran
fc7fc693ed Fix getting locked category 2021-10-13 23:57:59 -04:00
Ajay Ramachandran
27f5997e5a Add return types to vip fetching functions 2021-10-13 23:34:25 -04:00
Ajay Ramachandran
45274f5c72 Wait for vip info to be fetched 2021-10-13 23:32:52 -04:00
Ajay Ramachandran
2bdfd3f39b Merge branch 'copySegment' of https://github.com/florianzahn/sponsorblock into pr/FlorianZahn/988 2021-10-13 23:25:48 -04:00
Ajay Ramachandran
9b9174ab9a Simplify vip info fetching 2021-10-13 23:25:46 -04:00
FlorianZahn
3e3e9796b1 syntax error
Co-authored-by: Ajay Ramachandran <dev@ajay.app>
2021-10-14 05:19:18 +02:00
Ajay Ramachandran
ff5fa4c724 Move config values and close notice 2021-10-13 23:14:51 -04:00
Ajay Ramachandran
b8ab05ccad Merge pull request #985 from FlorianZahn/editSegmentTimesByScrolling
Scrolling over the edit-segment-time component will change them.
2021-10-13 22:37:31 -04:00
FlorianZahn
93e440385f Removed console.log and redundancy 2021-10-14 02:16:04 +02:00
FlorianZahn
af66a77026 Fixed logic mistake if undovotes are ever implemented 2021-10-14 02:11:15 +02:00
Maxim
75607dea1c Added margin-bottom for #sponsorblockPopup
This margin is to separate popup window from playlist/related videos list
2021-10-13 22:48:07 +05:00
FlorianZahn
5b353b05ac replaced tab with 4 spaces 2021-10-13 06:22:50 +02:00
FlorianZahn
3162ab93a1 Formatting 2021-10-13 06:19:48 +02:00
FlorianZahn
b18f631d33 better if/else readability
Co-authored-by: Ajay Ramachandran <dev@ajay.app>
2021-10-13 06:14:03 +02:00
FlorianZahn
2e254cb917 prettier spaces
Co-authored-by: Ajay Ramachandran <dev@ajay.app>
2021-10-13 06:13:32 +02:00
FlorianZahn
77ce9433a7 removed response.ok for response === 200 2021-10-13 06:08:14 +02:00
FlorianZahn
509e54762f Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into editSegmentTimesByScrolling 2021-10-13 06:02:50 +02:00
FlorianZahn
caeb347137 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into copySegment 2021-10-13 05:55:21 +02:00
Ajay Ramachandran
a2b054844a Fix unsubmitted segments sometimes not skipping 2021-10-11 22:22:36 -04:00
Ajay Ramachandran
5b79d4ef48 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-10-11 19:02:22 -04:00
Ajay Ramachandran
3de66ebe23 Potentially fix info button reappearing 2021-10-11 19:02:20 -04:00
FlorianZahn
60ef51b7f5 I forgot to change the 24h countdown back to 24h instead of 1 seconds 2021-10-11 03:50:19 +02:00
FlorianZahn
aa8ee02277 Added colored text if a category is locked for submitting and changing category 2021-10-11 03:49:14 +02:00
FlorianZahn
b927ebbbf7 Lint fixes 2021-10-10 10:56:27 +02:00
FlorianZahn
d72d5dcbcb Lint fixes 2021-10-10 10:50:35 +02:00
FlorianZahn
d9f703d808 Vip warning added when downvoting. sry that it is in the same branch, but this is the most current UI 2021-10-10 10:47:47 +02:00
FlorianZahn
a9cc43c586 Changed heigt of 2nd notice. Minor changes. Upvoting lets downvoted segment reappear 2021-10-10 00:41:21 +02:00
FlorianZahn
844567dcdf Lit fixes 2021-10-09 08:13:02 +02:00
FlorianZahn
52ed4f73f4 SkipNotice now remembers what has already been voted. Also nicer highlighting of current selection. 2021-10-09 08:08:46 +02:00
FlorianZahn
907bd68e4e Buttons now change color depending on state. Added colorPalette config entry 2021-10-09 02:43:39 +02:00
Ajay Ramachandran
f35afaf6bc bump version 2021-10-06 21:10:31 -04:00
Ajay Ramachandran
85b1b51b76 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-10-06 21:02:02 -04:00
Ajay Ramachandran
9dc5449e37 Make capitalization consistent 2021-10-06 21:01:59 -04:00
FlorianZahn
6ea226c972 Added string to the language file 2021-10-06 23:38:06 +02:00
FlorianZahn
44f9ab9806 changed let to const 2021-10-06 23:16:53 +02:00
FlorianZahn
edd1011737 margin in ContinueVoting 2021-10-06 23:13:10 +02:00
FlorianZahn
08558bfaeb Merge branch 'copySegment' of https://github.com/FlorianZahn/SponsorBlock into copySegment 2021-10-06 23:08:22 +02:00
FlorianZahn
4afc2c153a Restart Voting button. Wiki links. SkipNotice Improvements 2021-10-06 23:02:26 +02:00
FlorianZahn
988905c155 Update config.ts 2021-10-06 16:33:11 +02:00
FlorianZahn
51aab00985 Update config.ts 2021-10-06 08:31:18 +02:00
FlorianZahn
84924b6364 Update SkipNoticeComponent.tsx 2021-10-06 08:29:45 +02:00
FlorianZahn
93f02877a7 copy segments basics done 2021-10-06 08:15:15 +02:00
Ajay Ramachandran
7baac9dcbf New Crowdin updates (#984) 2021-10-05 20:52:16 -04:00
Ajay Ramachandran
4045978b54 Support older browsers 2021-10-05 20:51:20 -04:00
Ajay Ramachandran
56bc3fca04 Hide skip to highlight right away when dismissing 2021-10-05 20:06:18 -04:00
FlorianZahn
c571a9ecb6 made the tool tip fully opaque for better readability 2021-10-04 21:37:15 +02:00
FlorianZahn
1ad60720df empty function fix 2021-10-04 21:04:02 +02:00
FlorianZahn
e5fe99c89b Changed empty arrow function to empty function 2021-10-04 20:24:52 +02:00
FlorianZahn
3fc32a68c3 Changing the time a little manually opens a popup 2021-10-04 20:20:04 +02:00
FlorianZahn
142cc2881f added step modifier ctrl 2021-10-04 14:26:24 +02:00
FlorianZahn
4de55ea5fe Scroll amount now 1/1000th while pressing "shift" 2021-10-04 04:24:14 +02:00
FlorianZahn
620e75517c Now handeling deltaY=0 and shrunk down code 2021-10-03 22:11:33 +02:00
FlorianZahn
cba26a42af combined similar code into function. More readable function names 2021-10-03 21:50:02 +02:00
FlorianZahn
f3f598d6c7 combined similar code into function. More readable function names 2021-10-03 21:48:12 +02:00
FlorianZahn
fe7d9986fa Boolean --> boolean; var --> let 2021-10-03 21:23:33 +02:00
FlorianZahn
143ca6f6e0 Highlight time stamps are synchronized when scorlling 2021-10-03 21:19:06 +02:00
FlorianZahn
69ce065588 Scrolling over the segment times will change them 2021-10-03 20:56:10 +02:00
Ajay Ramachandran
bfa31429f1 Support shorts with additional parts of url 2021-10-03 13:08:50 -04:00
Ajay Ramachandran
66f0cc8883 Support shorts 2021-10-03 13:07:47 -04:00
Ajay Ramachandran
1a0ac27e49 New Crowdin updates (#980) 2021-10-02 18:05:41 -04:00
Ajay Ramachandran
7b87ae7b08 bump version 2021-10-02 18:00:58 -04:00
Ajay Ramachandran
9ab8e63b1d Merge pull request #983 from ajayyy/test-action
Add testing action
2021-10-02 18:00:09 -04:00
Ajay Ramachandran
0e147134f3 Add testing action 2021-10-02 17:42:47 -04:00
Ajay Ramachandran
8605e23fbb Fix starting segments when there is a t=? in the url 2021-10-02 17:13:30 -04:00
Ajay Ramachandran
5f34a777f1 Fix starting segment sometimes not being skipped and duration filter 2021-10-02 16:15:53 -04:00
Ajay Ramachandran
1f43d07e16 Remove possible error in notice 2021-10-02 16:05:23 -04:00
Ajay Ramachandran
a88aaf4590 Prevent error when video not loaded yet 2021-10-02 15:46:33 -04:00
Ajay Ramachandran
25f78ed55b Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2021-10-02 15:24:01 -04:00
Ajay Ramachandran
26e73c515c Fix seeking issues with poi segment 2021-10-02 15:23:59 -04:00
Ajay Ramachandran
028374e62d Update manifest.json 2021-10-02 14:38:59 -04:00
Ajay Ramachandran
dc1e5ce762 Fix styling on voting wrong category 2021-10-01 18:28:11 -04:00
Ajay Ramachandran
8fcf8ac46c Speed up autohiding button transition 2021-10-01 18:08:02 -04:00
Ajay Ramachandran
ef70e71051 Fix segments not appearing when loaded early 2021-10-01 18:07:15 -04:00
Ajay Ramachandran
23a91c626d bump version 2021-09-30 19:39:54 -04:00
Ajay Ramachandran
c92f63af36 New Crowdin updates (#978) 2021-09-30 19:39:14 -04:00
Ajay Ramachandran
0a21ef7af0 Merge pull request #958 from FlorianZahn/PersistantHighlight
Highlight Button now persists; Implements issue #953
2021-09-30 19:33:39 -04:00
Ajay Ramachandran
5a74a28520 Fix skip to highlight text reappearing 2021-09-30 19:26:28 -04:00
Ajay Ramachandran
1bfb5cfb13 Compact button options and add option for skip to highlight button 2021-09-30 19:23:17 -04:00
Ajay Ramachandran
59f8f82655 Add alt text to skip to highlight 2021-09-30 18:20:58 -04:00
Ajay Ramachandran
2064afb235 Make hiding highlight button smooth 2021-09-30 18:15:06 -04:00
Ajay Ramachandran
ebcb600e99 Auto hide skip to highlight 2021-09-30 00:43:10 -04:00
Ajay Ramachandran
9ec984065e hide when buttons disabled and hide chapter prefix 2021-09-29 23:13:54 -04:00
Ajay Ramachandran
63cfe760b6 New Crowdin updates (#961) 2021-09-29 16:27:11 -04:00
Ajay Ramachandran
1a717542c7 Improve warning message 2021-09-28 20:05:48 -04:00
Ajay Ramachandran
de607d317f Hide segments with different video durations 2021-09-28 19:58:51 -04:00
Ajay Ramachandran
76d9a9afa9 Merge pull request #957 from mchangrh/update-workflow
Update workflow
2021-09-21 19:04:20 -04:00
FlorianZahn
22ecc05a55 Highlight Button now persists 2021-09-20 15:32:31 +02: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
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
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
71 changed files with 2999 additions and 24840 deletions

View File

@@ -10,9 +10,11 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
- run: npm install
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
- run: npm ci
- name: Copy configuration
run: cp config.json.example config.json
@@ -23,44 +25,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,16 +12,18 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v1
- uses: actions/setup-node@v1
- run: npm install
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
- run: npm ci
- name: Copy configuration
run: cp config.json.example config.json
# 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 +34,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 +44,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 +77,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 +94,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

20
.github/workflows/tests.yml vendored Normal file
View File

@@ -0,0 +1,20 @@
name: Tests
on: [push, pull_request]
jobs:
build:
name: Run tests
runs-on: ubuntu-latest
steps:
# Initialization
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '16'
- run: npm ci
- name: Run tests
run: npm run test-without-building

View File

@@ -50,16 +50,18 @@ 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
You must have Node.js 16 installed.
Rename `config.json.example` to `config.json` and adjust configuration as desired.
There are also other build scripts available. Install `npm`, then run `npm install` in the repository to install dependencies.
@@ -90,7 +92,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,27 @@
"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", "poi_highlight", "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"]
},
"wikiLinks": {
"sponsor": "https://wiki.sponsor.ajay.app/w/Sponsor",
"selfpromo": "https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion",
"interaction": "https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)",
"intro": "https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation",
"outro": "https://wiki.sponsor.ajay.app/w/Endcards/Credits",
"preview": "https://wiki.sponsor.ajay.app/w/Preview/Recap",
"music_offtopic": "https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section",
"poi_highlight": "https://wiki.sponsor.ajay.app/w/Highlight",
"guidelines": "https://wiki.sponsor.ajay.app/w/Guidelines",
"mute": "https://wiki.sponsor.ajay.app/w/Mute_Segment"
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "__MSG_fullName__",
"short_name": "SponsorBlock",
"version": "3.0.5",
"version": "3.4.1",
"default_locale": "en",
"description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app",
@@ -37,6 +37,7 @@
"icons/upvote.png",
"icons/downvote.png",
"icons/thumbs_down.svg",
"icons/thumbs_down_locked.svg",
"icons/thumbs_up.svg",
"icons/help.svg",
"icons/report.png",

23947
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
"description": "Name of the extension."
},
"Description": {
"message": "Прескачайте спонсорства, напомняния за абониране, и други неща в YouTube клипове. Докладвайте спонсорства на клиповете които гледате, за да спестите време на други потребители.",
"message": "Прескачайте спонсорства, напомняния за абониране и други неща в клипове в YouTube. Докладвайте спонсорства в клиповете, които гледате, за да спестите време на други потребители.",
"description": "Description of the extension."
},
"400": {
@@ -52,6 +52,9 @@
"reskip": {
"message": "Пропускане отново"
},
"unmute": {
"message": "Вкл. на звука"
},
"paused": {
"message": "На пауза"
},
@@ -83,7 +86,7 @@
"message": "Отказ от създаването на сегмент"
},
"noVideoID": {
"message": "Не е намерен видеоклип в YouTube.\nАко това е неправилно, опреснете раздела."
"message": "Не е намерен видеоклип в YouTube.\nАко това не е правилно, опреснете раздела."
},
"refreshSegments": {
"message": "Опресняване на сегментите"
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Възникна грешка с връзката. Код на грешката: "
},
"wantToSubmit": {
"message": "Искате ли да изпратите сегментите за видеоклип с id"
},
"clearTimes": {
"message": "Изчистване на сегментите"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане."
},
"showSkipButton": {
"message": "Оставяне в плейъра на бутона за преминаване към акцента"
},
"showInfoButton": {
"message": "Показване на бутона за информация в плейъра на YouTube"
},
"hideInfoButton": {
"message": "Скриване на бутона за информация в плейъра на YouTube"
},
"whatInfoButton": {
"message": "Това е бутонът, който отваря изскачащ прозорец в страницата на YouTube."
},
"autoHideInfoButton": {
"message": "Автоматично скриване на бутона за информация"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Показване на бутона за изтриване в плейъра на YouTube"
},
"whatDeleteButton": {
"message": "Това е бутонът в плейъра на YouTube, който ще изчисти всичките ви неизпратени сегменти за текущия видеоклип."
},
"enableViewTracking": {
"message": "Активиране проследяването на броя пропускания"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,7 @@
"message": "Импортиране/експортиране на вашия UserID"
},
"whatChangeUserID": {
"message": "Това трябва да се пази тайно. То е като парола и не трябва да се споделя с никого. Ако някой го притежава, той може да се представи за вас."
"message": "Това трябва да се пази в тайна. То е като парола и не трябва да се споделя с никого. Ако някой го има, може да се представи за вас. Ако търсите своя публичен потребителски идентификатор, щракнете върху иконата на клипборда в изскачащия прозорец."
},
"setUserID": {
"message": "Задаване на UserID"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Показване на бутона за качване"
},
"whatUploadButton": {
"message": "Този бутон се появява в плейъра на YouTube, след като сте избрали времева отметка и сте готови за изпращане."
},
"customServerAddress": {
"message": "Адрес на сървъра на SponsorBlock"
},
@@ -524,7 +528,7 @@
"message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
},
"category_selfpromo": {
"message": "Неплатени/Самореклама"
"message": "Неплатена/Самореклама"
},
"category_selfpromo_description": {
"message": "Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."
@@ -604,6 +608,9 @@
"autoSkipOnMusicVideos": {
"message": "Автоматично пропускане на всички сегменти, когато има сегмент без музика"
},
"muteSegments": {
"message": "Разрешаване на сегменти, които заглушават звука, вместо да се пропускат"
},
"colorFormatIncorrect": {
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен шестнадесетичен код с „#“ в началото."
},
@@ -643,6 +650,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": "Трябва да изберете категория за всички сегменти, които изпращате!"
},
@@ -690,7 +700,7 @@
"message": "Грешно/Неправилно време"
},
"incorrectCategory": {
"message": "Грешна категория"
"message": "Промяна на категорията"
},
"nonMusicCategoryOnMusic": {
"message": "Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани."
@@ -726,7 +736,7 @@
"message": "Скриване завинаги"
},
"warningChatInfo": {
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени, и просто искаме да изясним правилата. Можете също да се присъедините към този чат с помощта на discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
"message": "Получихте предупреждение и временно не можете да изпращате сегменти. Това означава, че забелязахме, че допускате някои често срещани грешки, които не са злонамерени. Моля, просто потвърдете, че разбирате правилата и ние ще премахнем предупреждението. Можете също да се присъедините към този чат от discord.gg/SponsorBlock или matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Гласуването е отхвърлено поради предупреждение. Щракнете, за да отворите чат и да го разрешите, или се върнете по-късно, когато имате време.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Научете повече"
},
"CopyDownvoteButtonInfo": {
"message": "Гласуване против и създаване на локално копие, за да го изпратите отново"
},
"OpenCategoryWikiPage": {
"message": "Отваряне на wiki страницата на тази категория."
},
"CopyAndDownvote": {
"message": "Копиране и гласуване против"
},
"ContinueVoting": {
"message": "Продължаване на гласуването"
},
"ChangeCategoryTooltip": {
"message": "Това незабавно ще се приложи към вашите сегменти"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Използвайте колелото на мишката, докато държите курсора върху полето за редактиране, за да коригирате бързо времето. Комбинации с клавиша ctrl или shift могат да се използват за фина настройка на промените."
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Znovu přeskočit"
},
"unmute": {
"message": "Zrušit ztlumení"
},
"paused": {
"message": "Pozastaveno"
},
@@ -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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Skryje tlačítka, která se zobrazí v YouTube přehrávači pro přeskočení segmentů."
},
"showSkipButton": {
"message": "Nechat tlačítko přeskočení na zvýraznění v přehrávači"
},
"showInfoButton": {
"message": "Zobrazit informační tlačítko v YouTube přehrávači"
},
"hideInfoButton": {
"message": "Skrýt informační tlačítko v YouTube přehrávači"
},
"whatInfoButton": {
"message": "Toto je tlačítko, které otevře vyskakovací nabídku na YouTube stránce."
},
"autoHideInfoButton": {
"message": "Automaticky skrýt informační tlačítko"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Zobrazit tlačítko Odstranit v YouTube přehrávači"
},
"whatDeleteButton": {
"message": "Toto je tlačítko v YouTube přehrávači, které odebere všechny vaše neodeslané segmenty v současném videu."
},
"enableViewTracking": {
"message": "Povolit počítadlo přeskočení"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Zobrazit tlačítko Nahrát"
},
"whatUploadButton": {
"message": "Toto tlačítko se objeví v YouTube přehrávači po vybrání časového razítka a po připravení k odeslání."
},
"customServerAddress": {
"message": "Adresa serveru SponsorBlock"
},
@@ -604,6 +608,9 @@
"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."
},
@@ -643,6 +650,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!"
},
@@ -690,7 +700,7 @@
"message": "Nesprávné / špatné časování"
},
"incorrectCategory": {
"message": "Špatná kategorie"
"message": "Změnit kategorii"
},
"nonMusicCategoryOnMusic": {
"message": "Toto video je kategorizováno jako hudba. Jste si jisti, že je v něm sponzorská sekce? Pokud se opravdu jedná o \"Nehudební segment\", otevřete nastavení a povolte tuto kategorii. Poté budete moct odeslat segment jako \"Nehudební\" místo sponzorského. Pokud jste zmateni, přečtěte si prosím pokyny."
@@ -726,7 +736,7 @@
"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. Ta 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é, stačí potvrdit přečtení pravidel a odebereme varování. Ta 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.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Zjistit více"
},
"CopyDownvoteButtonInfo": {
"message": "Zahlasuje proti a vytvoří pro vás lokální kopii pro opětovné odeslání"
},
"OpenCategoryWikiPage": {
"message": "Otevřít wiki stránku této kategorie."
},
"CopyAndDownvote": {
"message": "Zkopírovat a hlasovat proti"
},
"ContinueVoting": {
"message": "Pokračovat v hlasování"
},
"ChangeCategoryTooltip": {
"message": "Toto bude okamžitě platit pro vaše segmenty"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Použijte kolečko myši při přechodu přes editační okno pro rychlou úpravu času. Kombinace kláves Ctrl nebo Shift mohou být použity k doladění změn."
}
}

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"
},
@@ -86,10 +89,10 @@
"message": "Kein YouTube-Video gefunden.\nWenn dies falsch ist, aktualisiere den Tab."
},
"refreshSegments": {
"message": "Segment aktualisieren"
"message": "Segmente aktualisieren"
},
"success": {
"message": "Geschafft!"
"message": "Erfolg!"
},
"voted": {
"message": "Abgestimmt!"
@@ -100,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"
},
@@ -162,7 +162,7 @@
"message": "Benutzernamen festlegen"
},
"copyPublicID": {
"message": "Öffentliche UserID kopieren"
"message": "Öffentliche Benutzer-ID kopieren"
},
"discordAdvert": {
"message": "Tritt dem offiziellen Discord-Server bei und teile Anregungen und Feedback!"
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Versteckt die Schaltflächen im YouTube-Videoplayer, um Segmente einzusenden."
},
"showSkipButton": {
"message": "\"Zum Highlight springen\"-Knopf im Player behalten"
},
"showInfoButton": {
"message": "Zeige Info-Knopf im Youtube-Videoplayer"
},
"hideInfoButton": {
"message": "Deaktiviere Info-Knopf im Youtube-Videoplayer"
},
"whatInfoButton": {
"message": "Dieser Knopf öffnet ein Pop-up auf der Youtube-Seite."
},
"autoHideInfoButton": {
"message": "Info-Button automatisch ausblenden"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Zeige den Löschen-Knopf im Youtube-Videoplayer"
},
"whatDeleteButton": {
"message": "Dieser Knopf im YouTube-Videoplayer löscht alle nicht übermittelten Segmente für das aktuelle Video."
},
"enableViewTracking": {
"message": "Aktiviere das Zählen übersprungener Segmente"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"message": "{0} übersprungen",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} stummgeschaltet",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Zu {0} gesprungen",
"description": "Used for skipping to things (Skipped to Highlight)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Upload-Knopf anzeigen"
},
"whatUploadButton": {
"message": "Dieser Knopf erscheint im YouTube-Videoplayer, nachdem du ein Videosegment markiert hast und dazu bereit bist, es zu übermitteln."
},
"customServerAddress": {
"message": "SponsorBlock Serveradresse"
},
@@ -460,7 +464,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"
@@ -487,7 +491,7 @@
"message": "Vorschau"
},
"unsubmitted": {
"message": "Nicht eingereicht"
"message": "Nicht übermittelt"
},
"inspect": {
"message": "Überprüfen"
@@ -569,7 +573,7 @@
"message": "Musikvideoteile ohne Musik"
},
"category_poi_highlight": {
"message": "Hervorheben"
"message": "Highlight"
},
"category_poi_highlight_description": {
"message": "Der Teil des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare."
@@ -599,11 +603,14 @@
"message": "Beim Laden des Videos fragen"
},
"showOverlay_POI": {
"message": "In der Video-Zeitleiste anzeigen"
"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."
},
@@ -643,6 +650,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!"
},
@@ -690,7 +700,7 @@
"message": "Nicht korrekt oder falsches Timing"
},
"incorrectCategory": {
"message": "Falsche Kategorie"
"message": "Kategorie ändern"
},
"nonMusicCategoryOnMusic": {
"message": "Dieses Video ist als Musikvideo kategorisiert. Bist du dir sicher, dass es ein gesponsertes Videosegment hat? Wenn dies tatsächlich ein Musikvideoteil ohne Musik ist, öffne die Optionen von SponsorBlock und aktiviere diese Kategorie. Danach kannst du dieses Segment als solches markieren. Bitte lese die Richtlinien, wenn du dir nicht sicher bist."
@@ -719,17 +729,17 @@
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Abmeldung aller zukünftigen Experimente",
"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 hast eine Warnung erhalten und kannst vorübergehend keine Segmente einreichen. Uns ist nämlich aufgefallen, dass du nicht bösartige Fehler in deinen Einreichungen machst. Bitte bestätige, dass du die Regeln verstanden hast. Darauffolgend können wir die Warnung entfernen. Du kannst diesem Chat auch mit 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": {
@@ -751,7 +761,7 @@
"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 zu erhalten, was sie sind."
"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."
@@ -775,7 +785,7 @@
"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 Abostrphe-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."
"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?"
@@ -793,12 +803,30 @@
"message": "Wo kann ich den Quellcode kriegen?"
},
"Credits": {
"message": "Credits"
"message": "Mitwirkende"
},
"highlightNewFeature": {
"message": "Neu! Gehe mit einem Klick zum Punkt des Videos mit der neuen Highlight Kategorie"
"message": "Neu! Gehe mit einem Klick zum Punkt des Videos mit der neuen \"Hervorheben\" Kategorie"
},
"LearnMore": {
"message": "Erfahre mehr"
},
"CopyDownvoteButtonInfo": {
"message": "Meldet als unzulässig und erstellt eine lokale Kopie zur späteren Einreichung"
},
"OpenCategoryWikiPage": {
"message": "Den Wiki-Artikel dieser Kategorie aufrufen."
},
"CopyAndDownvote": {
"message": "Kopieren und abwerten"
},
"ContinueVoting": {
"message": "Bewerten fortsetzen"
},
"ChangeCategoryTooltip": {
"message": "Dies wirkt sich sofort auf eigene Segmente aus"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Benutze das Mausrad während der Mauszeiger über dem Eingabefeld schwebt um die Zeit schnell anzupassen. Benutze Strg bzw. Shift für gröbere/genauere Änderungen."
}
}

View File

@@ -139,9 +139,6 @@
"chooseACategory": {
"message": "Επιλέξτε μια κατηγορία"
},
"incorrectCategory": {
"message": "Λάθος κατηγορία"
},
"multipleSegments": {
"message": "Πολλαπλά Τμήματα"
},

View File

@@ -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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "This hides the buttons that appear on the YouTube player to submit skip segments."
},
"showSkipButton": {
"message": "Keep Skip To Highlight Button On Player"
},
"showInfoButton": {
"message": "Show Info Button On YouTube Player"
},
"hideInfoButton": {
"message": "Hide Info Button On YouTube Player"
},
"whatInfoButton": {
"message": "This is the button that opens up a popup in the YouTube page."
},
"autoHideInfoButton": {
"message": "Auto-hide Info Button"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Show Delete Button On YouTube Player"
},
"whatDeleteButton": {
"message": "This is the button on the YouTube player that will clear all your un-submitted segments for the current video."
},
"enableViewTracking": {
"message": "Enable Skip Count Tracking"
},
@@ -302,9 +299,15 @@
"skip": {
"message": "Skip"
},
"mute": {
"message": "Mute"
},
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Show Upload Button"
},
"whatUploadButton": {
"message": "This button appears on the YouTube player after you have selected a timestamp and are ready to submit."
},
"customServerAddress": {
"message": "SponsorBlock Server Address"
},
@@ -604,6 +608,9 @@
"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."
},
@@ -643,6 +650,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!"
},
@@ -690,7 +700,7 @@
"message": "Incorrect/Wrong Timing"
},
"incorrectCategory": {
"message": "Wrong Category"
"message": "Change Category"
},
"nonMusicCategoryOnMusic": {
"message": "This video is categorized as music. Are you sure this has a sponsor? If this is actually a \"Non-Music segment\", open up the extension options and enable this category. Then, you can submit this segment as \"Non-Music\" instead of sponsor. Please read the guidelines if you are confused."
@@ -726,7 +736,7 @@
"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, please just confirm that you understand the rules and we will remove the warning. 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.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Learn More"
},
"CopyDownvoteButtonInfo": {
"message": "Downvotes and creates a local copy for you to resubmit"
},
"OpenCategoryWikiPage": {
"message": "Open this category's wiki page."
},
"CopyAndDownvote": {
"message": "Copy and downvote"
},
"ContinueVoting": {
"message": "Continue Voting"
},
"ChangeCategoryTooltip": {
"message": "This will instantly apply to your segments"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Use your mousewheel while hovering over the edit box to quickly adjust the time. Combinations of the ctrl or shift key can be used to fine tune the changes."
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Volver a saltar"
},
"unmute": {
"message": "Restaurar sonido"
},
"paused": {
"message": "Pausado"
},
@@ -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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Esto oculta los botones que aparecen en el reproductor de YouTube que se usan para enviar segmentos saltados."
},
"showSkipButton": {
"message": "Mantener el Botón de \"Saltar a Destacado\" en el Reproductor"
},
"showInfoButton": {
"message": "Mostrar botón de información en el reproductor de YouTube"
},
"hideInfoButton": {
"message": "Ocultar botón de información en el reproductor de YouTube"
},
"whatInfoButton": {
"message": "Este es el botón que abre una ventana en la página de YouTube."
},
"autoHideInfoButton": {
"message": "Ocular automáticamente el Botón de Información"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Mostrar botón de eliminar en el reproductor de YouTube"
},
"whatDeleteButton": {
"message": "Este es el botón en el reproductor de YouTube que eliminará todos tus segmentos no enviados para el vídeo actual."
},
"enableViewTracking": {
"message": "Habilitar el conteo de omisiones"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,7 @@
"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 el ID de usuario"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Mostrar botón de subida"
},
"whatUploadButton": {
"message": "Este botón aparece en el reproductor de YouTube después de que has seleccionado una marca de tiempo y estas listo para enviar."
},
"customServerAddress": {
"message": "Dirección del servidor SponsorBlock"
},
@@ -604,6 +608,9 @@
"autoSkipOnMusicVideos": {
"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."
},
@@ -643,6 +650,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!"
},
@@ -690,7 +700,7 @@
"message": "Tiempo incorrecto/equivocado"
},
"incorrectCategory": {
"message": "Categoría Incorrecta"
"message": "Cambiar Categoría"
},
"nonMusicCategoryOnMusic": {
"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."
@@ -726,7 +736,7 @@
"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": "Has recibido una advertencia y no puedes enviar segmentos temporalmente. Esto significa que hemos notado que estabas cometiendo algunos errores comunes que no son maliciosos, por favor, solo confirma que entiendes las reglas y anularemos la advertencia. También 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.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Aprenda Más"
},
"CopyDownvoteButtonInfo": {
"message": "Vota negativamente y crea una copia local para que la puedas volver a enviar"
},
"OpenCategoryWikiPage": {
"message": "Abrir la página de la wiki de esta categoría."
},
"CopyAndDownvote": {
"message": "Copiar y votar negativamente"
},
"ContinueVoting": {
"message": "Continuar Votando"
},
"ChangeCategoryTooltip": {
"message": "Esto se aplicará instantáneamente a tus segmentos"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Utilice la rueda del ratón mientras pasa el cursor por encima del cuadro de edición para ajustar el tiempo. Se pueden utilizar combinaciones de la tecla ctrl o shift para afinar los cambios."
}
}

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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "See peidab nupud, mis kuvatakse YouTube'i mängijal vahelejätmiste segmentide saatmiseks."
},
"showSkipButton": {
"message": "Hoia esiletõstuni vahelejätmise nuppu mängijal"
},
"showInfoButton": {
"message": "Kuva YouTube'i mängijal infonupp"
},
"hideInfoButton": {
"message": "Peida YouTube'i mängijal infonupp"
},
"whatInfoButton": {
"message": "See on see nupp, mis avab YouTube'i lehel hüpiku."
},
"autoHideInfoButton": {
"message": "Peida infonupp automaatselt"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Kuva YouTube'i mängijal kustutusnupp"
},
"whatDeleteButton": {
"message": "YouTube'i mängija nupp, mis tühjendab kõik sinu praeguse video saatmata segmendid."
},
"enableViewTracking": {
"message": "Luba vahelejätmiste arvu jälgimine"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Kuva üleslaadimisnupp"
},
"whatUploadButton": {
"message": "See nupp kuvatakse YouTube'i mängijal, kui oled ajatempli ära valinud ning saatmiseks valmis."
},
"customServerAddress": {
"message": "SponsorBlocki serveri aadress"
},
@@ -604,6 +608,9 @@
"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."
},
@@ -643,6 +650,9 @@
"message": "Kategooriaga \"{0}\" segmentide saatmiseks pead selle enne valikutes lubama. Sind suunatakse nüüd valikutesse.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Hoiatus: Seda tüüpi segmenti saab korraga aktiivne olla vaid üks. Mitme saatmine põhjustab suvalise segmendi kuvamise."
},
"youMustSelectACategory": {
"message": "Sa pead enne saatmist igale segmendile kategooria valima!"
},
@@ -690,7 +700,7 @@
"message": "Sobimatu/vale ajastus"
},
"incorrectCategory": {
"message": "Vale kategooria"
"message": "Muuda kategooriat"
},
"nonMusicCategoryOnMusic": {
"message": "See video on muusikana kategoriseeritud. Kas oled kindel, et sellel on sponsor? Kui see on tegelikult \"mitte-muusika segment\", ava laienduse valikud ning luba see kategooria. Seejärel saad selle segmendi saata \"mitte-muusika\" kategoorias. Segaduse korral palun loe üle juhised."
@@ -726,7 +736,7 @@
"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 - palun kinnita (inglise keeles), et mõistad reegleid ning me eemaldame hoiatuse. 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.",
@@ -741,6 +751,9 @@
"helpPageThanksForInstalling": {
"message": "Täname SponsorBlocki paigaldamise eest."
},
"helpPageReviewOptions": {
"message": "Palun vaata allolevad valikud üle"
},
"helpPageNews": {
"message": "Uudised ja kuidas see on valmistatud"
},
@@ -752,5 +765,23 @@
},
"LearnMore": {
"message": "Lisateave"
},
"CopyDownvoteButtonInfo": {
"message": "Annab vastuhääle ja loob kohaliku koopia, mida saad uuesti saata"
},
"OpenCategoryWikiPage": {
"message": "Ava selle kategooria vikileht."
},
"CopyAndDownvote": {
"message": "Kopeeri ja anna vastuhääl"
},
"ContinueVoting": {
"message": "Jätka hääletamist"
},
"ChangeCategoryTooltip": {
"message": "See rakendub sinu segmentidele koheselt"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Kasuta hiirekursorit muutmiskasti kohal, et kiirelt aega reguleerida. Täpsemaks muutmiseks hoia kerimise ajal all Ctrl või Shift klahvi."
}
}

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,110 @@
"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."
},
"502": {
"message": "به نظر می‌رسد سرور زیر فشار است. چند ثانیه‌ی دیگر دوباره امتحان کنید."
},
"errorCode": {
"message": "کد خطا: "
},
"skip": {
"message": "رد کردن"
},
"mute": {
"message": "بی‌صدا"
},
"minLower": {
"message": "دقیقه"
},
"hourLower": {
"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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
},
"showSkipButton": {
"message": "Pidä \"Ohita kohtaan: Kohokohta\" -painike soittimessa"
},
"showInfoButton": {
"message": "Näytä info-painike YouTuben soittimessa"
},
"hideInfoButton": {
"message": "Piilota info-painike YouTuben soittimessa"
},
"whatInfoButton": {
"message": "Tämä on painike, joka avaa ponnahdusikkunan YouTube-sivulla."
},
"autoHideInfoButton": {
"message": "Piilota info-painike automaattisesti"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Näytä poista-painike YouTuben soittimessa"
},
"whatDeleteButton": {
"message": "Tämä on YouTuben soittimen painike, joka poistaa kaikki kyseisen videon sponsorointikohdat, joita et ole vielä lähettänyt."
},
"enableViewTracking": {
"message": "Ota ohitusten lukumäärän seuranta käyttöön"
},
@@ -302,9 +299,15 @@
"skip": {
"message": "Ohita"
},
"mute": {
"message": "Mykistä"
},
"skip_category": {
"message": "Ohita {0}?"
},
"mute_category": {
"message": "Mykistä {0}?"
},
"skip_to_category": {
"message": "Ohita kohtaan: {0}",
"description": "Used for skipping to things (Skip to Highlight)"
@@ -313,6 +316,10 @@
"message": "{0} ohitettu",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Mykistetty",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Ohitettiin kohtaan: {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Näytä lähetä-painike"
},
"whatUploadButton": {
"message": "Tämä painike ilmestyy YouTube-soittimeen, kun olet valinnut aikaleiman ja olet valmis lähettämään sen."
},
"customServerAddress": {
"message": "SponsorBlock-palvelimen osoite"
},
@@ -604,6 +608,9 @@
"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."
},
@@ -643,6 +650,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ä!"
},
@@ -689,9 +699,6 @@
"downvoteDescription": {
"message": "Virheellinen/väärä aika"
},
"incorrectCategory": {
"message": "Väärä kategoria"
},
"nonMusicCategoryOnMusic": {
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton segmentti\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän segmentin oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi."
},
@@ -726,7 +733,7 @@
"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, joten vahvistakaa, että ymmärrätte säännöt ja poistamme varoituksen. 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.",
@@ -800,5 +807,8 @@
},
"LearnMore": {
"message": "Opi lisää"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Käytä hiiren rullaa samalla kun osoitin on muokkauslaatikon päällä säätääksesi aikaa nopeasti. Ctrl- tai Shift-näppäimen yhdistelmiä voi käyttää muutoksien hienosäätelyyn."
}
}

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!"
},
@@ -179,15 +182,15 @@
"hideButtonsDescription": {
"message": "Cela permet de cacher du lecteur YouTube les boutons utilisés pour soumettre des segments commerciaux. Je peux \ncomprendre que certaines personnes les trouvent perturbants. Au lieu d'utiliser ces boutons, cette fenêtre peut être utilisée \npour soumettre des segments commerciaux. Pour cacher la notification, utilisez le bouton \"Ne plus montrer\" sur la notification. Vous pouvez toujours réactiver ces paramètres plus tard."
},
"showSkipButton": {
"message": "Conserver le bouton \"Aller au point d'intérêt\" sur le lecteur"
},
"showInfoButton": {
"message": "Montrer le bouton Info sur le lecteur YouTube"
},
"hideInfoButton": {
"message": "Cacher le bouton Info sur le lecteur YouTube"
},
"whatInfoButton": {
"message": "Il s'agit du bouton qui ouvre l'encart sur la page YouTube."
},
"autoHideInfoButton": {
"message": "Masquer Automatiquement Le Button Info"
},
@@ -197,9 +200,6 @@
"showDeleteButton": {
"message": "Montrer le bouton Supprimer sur le lecteur YouTube"
},
"whatDeleteButton": {
"message": "Il s'agit du bouton qui permet de supprimer tous les segments commerciaux depuis le lecteur YouTube."
},
"enableViewTracking": {
"message": "Activer le suivi du nombre de sauts de segments"
},
@@ -227,6 +227,21 @@
"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."
@@ -284,9 +299,31 @@
"skip": {
"message": "Passer"
},
"mute": {
"message": "Couper le son"
},
"skip_category": {
"message": "Passer {0} ?"
},
"mute_category": {
"message": "Mettre en sourdine {0} ?"
},
"skip_to_category": {
"message": "Passer à {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"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 +373,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\""
@@ -402,9 +439,6 @@
"showUploadButton": {
"message": "Afficher le bouton de téléchargement"
},
"whatUploadButton": {
"message": "Ce bouton apparaît sur le lecteur YouTube dès qu'un segment est prêt à être envoyé."
},
"customServerAddress": {
"message": "Adresse du serveur SponsorBlock"
},
@@ -538,6 +572,12 @@
"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"
},
@@ -556,6 +596,21 @@
"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."
},
@@ -595,6 +650,9 @@
"message": "Pour envoyer des segments de la catégorie \"{0}\", vous devez l'activer dans les options. Vous allez être redirigé vers les options maintenant.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Avertissement : Ce type de segment ne peut avoir qu'un seul segment actif à la fois. Si vous en soumettez plusieurs, le choix sera fait au hasard."
},
"youMustSelectACategory": {
"message": "Vous devez sélectionner une catégorie pour tous les segments que vous soumettez !"
},
@@ -641,9 +699,6 @@
"downvoteDescription": {
"message": "Segment de mauvaise qualité"
},
"incorrectCategory": {
"message": "Mauvaise catégorie"
},
"nonMusicCategoryOnMusic": {
"message": "Cette vidéo est catégorisée comme de la musique. Êtes-vous sûr qu'elle est sponsorisée? S'il s'agit en fait d'un \"Segment non musical\", allez dans les options de l'extension et activez cette catégorie. Ensuite, vous pourrez soumettre ce segment en tant que \"Segment non musical\" au lieu de sponsor. Lisez les instructions en cas de confusion."
},
@@ -666,11 +721,94 @@
"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 de segments temporairement. Cela signifie que nous avons remarqué que vous commettiez des erreurs courantes qui ne sont pas malveillantes. Veuillez simplement confirmer que vous comprenez les règles et nous supprimerons l'avertissement. Vous pouvez également rejoindre cette discussion en utilisant discord.gg/SponsorBlock ou matrix.to/#/#sponsor:ajay.app"
},
"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"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches Ctrl ou Shift peuvent être utilisées pour affiner les modifications."
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "התקבלה שגיאת חיבור. קוד השגיאה: "
},
"wantToSubmit": {
"message": "האם אתה רוצה לדווח עבור סרטון שמספר הזיהוי שלו הוא"
},
"clearTimes": {
"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"
},
@@ -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"
},
@@ -315,9 +309,6 @@
"downvoteDescription": {
"message": "Neispravno/krivo vrijeme"
},
"incorrectCategory": {
"message": "Kriva kategorija"
},
"nonMusicCategoryOnMusic": {
"message": "Ovaj je video kategoriziran kao glazba. Je li stvarno ima sponzora? Ako je ovo zapravo „Ne-glazbeni segment”, otvori opcije proširenja i aktiviraj ovu kategoriju. Zatim ovaj segment možeš posalti kao „Ne-glazbeni” umjesto sponzora. Pročitaj smjernice ako nešto nije jasno."
},

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"
},
@@ -185,9 +182,6 @@
"hideInfoButton": {
"message": "Info gomb elrejtése a YouTube lejátszón"
},
"whatInfoButton": {
"message": "Ez a gomb felhoz egy felugró dobozt a YouTube oldalon."
},
"autoHideInfoButton": {
"message": "Automatikus elrejtése az Információ Gombnak"
},
@@ -197,9 +191,6 @@
"showDeleteButton": {
"message": "Törlés gomb mutatása a YouTube lejátszón"
},
"whatDeleteButton": {
"message": "Ez egy gomb a lejátszón, ami törli az összes beküldetlen szegmensét a jelenlegi videón."
},
"enableViewTracking": {
"message": "Átugrás-számláló követés bekapcsolása"
},
@@ -329,9 +320,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"
},
@@ -377,9 +365,6 @@
"showUploadButton": {
"message": "Feltöltés gomb megjelenítése"
},
"whatUploadButton": {
"message": "Ez a gomb a YouTube lejátszón jelenik meg, miután kiválasztott egy időtartamot és készen áll a beküldésre."
},
"customServerAddress": {
"message": "SponsorBlock szerver címe"
},
@@ -507,6 +492,12 @@
"category_music_offtopic_short": {
"message": "Nem-Zene"
},
"category_poi_highlight": {
"message": "Kiemelés"
},
"category_poi_highlight_description": {
"message": "A videónak az a része, amelyiket a legtöbb ember látni szeretne. Hasonlít az \"A videó x percnél kezdődik\" jellegű hozzászólásokhoz."
},
"category_livestream_messages": {
"message": "Élő adás: Adomány / üzenet olvasások"
},
@@ -534,6 +525,10 @@
"category": {
"message": "Kategória"
},
"skipOption": {
"message": "Átugrás beállítása",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "Bétateszt szerver bekapcsolása"
},
@@ -579,9 +574,6 @@
"downvoteDescription": {
"message": "Helytelen/rossz időzítés"
},
"incorrectCategory": {
"message": "Hibás kategória"
},
"nonMusicCategoryOnMusic": {
"message": "Ez a videó zeneként van kategorizálva. Biztos benne, hogy ennek van szponzora? Ha ez valójában egy \"nem-zene szegmens\", nyissa meg a bővítmény beállításait és kapcsolja be azt a kategóriát. Ezt követően elküldheti ezt a szegmenst \"nem-zene\"-ként szponzor helyett. Amennyiben nem érti, kérjük olvassa el az irányelveket."
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Lewati Ulang"
},
"unmute": {
"message": "Batalkan bisu"
},
"paused": {
"message": "Dijeda"
},
@@ -85,6 +88,9 @@
"noVideoID": {
"message": "Video YouTube tidak ditemukan.\nJika terjadi kesalahan, segarkan halaman."
},
"refreshSegments": {
"message": "Perbarui segmen"
},
"success": {
"message": "Sukses!"
},
@@ -97,9 +103,6 @@
"connectionError": {
"message": "Kesalahan koneksi terjadi. Kode kesalahan: "
},
"wantToSubmit": {
"message": "Apakah anda ingin mengirim untuk id video"
},
"clearTimes": {
"message": "Hapus Segmen"
},
@@ -158,6 +161,9 @@
"setUsername": {
"message": "Atur Nama Pengguna"
},
"copyPublicID": {
"message": "Salin UserID Publik"
},
"discordAdvert": {
"message": "Gabung dengan server resmi discord untuk memberikan kritik dan saran!"
},
@@ -176,14 +182,17 @@
"hideButtonsDescription": {
"message": "Ini akan menyembunyikan tombol yang muncul di pemutar YouTube untuk mengirimkan segmen yang dilewati."
},
"showSkipButton": {
"message": "Tetap lewati ke tombol Highlight di Pemutar"
},
"showInfoButton": {
"message": "Tampilkan Tombol Info Di Pemutar Video YouTube"
},
"hideInfoButton": {
"message": "Sembunyikan Tombol Info Di Pemutar Video YouTube"
},
"whatInfoButton": {
"message": "Ini adalah tombol yang membuka popup di halaman YouTube."
"autoHideInfoButton": {
"message": "Otomatis Sembunyikan Tombol Info"
},
"hideDeleteButton": {
"message": "Sembunyikan Tombol Hapus Di Pemutar Video YouTube"
@@ -191,9 +200,6 @@
"showDeleteButton": {
"message": "Tampilkan Tombol Hapus Di Pemutar Video YouTube"
},
"whatDeleteButton": {
"message": "Ini adalah tombol di pemutar YouTube yang akan menghapus semua segmen yang belum dikirim pada video."
},
"enableViewTracking": {
"message": "Aktifkan Pelacakan Jumlah Lewati"
},
@@ -204,7 +210,7 @@
"message": "Aktifkan Pelacakan Jumlah Lewati Pada Tab Privat/Penyamaran"
},
"enableQueryByHashPrefix": {
"message": "Query By Hash Prefix"
"message": "Kueri dengan Hash Prefix"
},
"whatQueryByHashPrefix": {
"message": "Daripada meminta segmen dari server menggunakan videoID, 4 huruf pertama dari hash dari videoID dikirim. Server akan mengirim kembali data untuk semua video dengan hash yang mirip."
@@ -221,6 +227,21 @@
"showSkipNotice": {
"message": "Tampilkan pemberitahuan setelah melewati segmen"
},
"noticeVisibilityMode0": {
"message": "Lewati maklumat ukuran penuh"
},
"noticeVisibilityMode1": {
"message": "Maklumat lewati kecil untuk lewati otomatis"
},
"noticeVisibilityMode2": {
"message": "Lewati semua maklumat kecil"
},
"noticeVisibilityMode3": {
"message": "Pudar maklumat lewati untuk semua lewati otomatis"
},
"noticeVisibilityMode4": {
"message": "Lewati semua maklumat pudar"
},
"longDescription": {
"message": "SponsorBlock membuat anda melewati sponsor, intro, outro, pengingat berlangganan dan segmen mengganggu lainnya di video YouTube. SponsorBlock adalah ekstensi browser crowdsourced yang membolehkan siapa saja mengirim waktu awal dan akhir dari segmen sponsor dan segmen video YouTube lainnya. Setelah seseorang mengirim informasi ini, orang lain yang memakai ekstensi ini akan melewati segmen sponsor di video yang sama. Anda juga dapat melewati bagian non-musik di musik video.",
"description": "Full description of the extension on the store pages."
@@ -278,9 +299,15 @@
"skip": {
"message": "Lewati"
},
"mute": {
"message": "Bisukan"
},
"skip_category": {
"message": "Lewati {0}?"
},
"mute_category": {
"message": "Bisukan {0}?"
},
"skip_to_category": {
"message": "Lompat ke {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
@@ -289,6 +316,10 @@
"message": "{0} dilewati",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Dibisukan",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Melewati ke {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
@@ -342,7 +373,7 @@
"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."
"message": "Ini harus dirahasiakan. Ini seperti kata sandi dan tidak boleh dibagikan kepada siapa pun. Jika seseorang mempunyai ini, mereka bisa menyamar jadi anda. Jika anda mencari UserID publik anda, klik ikon papan tulis di popup."
},
"setUserID": {
"message": "Atur UserID"
@@ -359,9 +390,22 @@
"supportOtherSites": {
"message": "Dukung Situs Youtube Pihak Ketiga"
},
"supportOtherSitesDescription": {
"message": "Dukung klien YouTube pihak ketiga. Untuk mengaktifkan dukungan, anda harus menerima izin tambahan. Ini tidak akan bekerja di Mode Samaran di Chrome dan varian Chromium lainnya.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Situs yang didukung: "
},
"optionsInfo": {
"message": "Aktifkan dukungan Invidious, nonaktifkan lewati otomatis, tombol sembunyi dan lainnya."
},
"addInvidiousInstance": {
"message": "Tambah Instansi Klien Pihak Ketiga"
},
"addInvidiousInstanceDescription": {
"message": "Tambahkan instansi khusus. Ini harus diformat Hanya dengan domain. Contoh: invidious.ajay.app"
},
"add": {
"message": "Tambah"
},
@@ -383,15 +427,18 @@
"minDurationDescription": {
"message": "Segmen yang lebih kecil dari nilai yang diatur tidak akan dilewati atau tampil di pemutar."
},
"skipNoticeDuration": {
"message": "Lewati maklumat berdurasi (detik):"
},
"skipNoticeDurationDescription": {
"message": "Maklumat lewati akan tetap di layar setidaknya selama ini. Untuk lewati manual, mungkin akan terlihat lebih lama."
},
"shortCheck": {
"message": "Submisi ini lebih pendek dari opsi durasi minimalmu. Ini dapat berarti ini sudah dikirim, dan hanya akan diabaikan karena opsi ini. Apakah anda yakin ingin mengirim?"
},
"showUploadButton": {
"message": "Tampilkan Tombol Unggah"
},
"whatUploadButton": {
"message": "Tombol ini muncul di pemutar video YouTube setelah anda memilih stempel waktu dan siap untuk dikirimkan."
},
"customServerAddress": {
"message": "Alamat Server SponsorBlock"
},
@@ -525,6 +572,12 @@
"category_music_offtopic_short": {
"message": "Non-Musik"
},
"category_poi_highlight": {
"message": "Sorotan"
},
"category_poi_highlight_description": {
"message": "Bagian video yang banyak orang lihat. Sama untuk komentar \"Video dimulai di x\"."
},
"category_livestream_messages": {
"message": "Livestream: Baca Pesan/Donasi"
},
@@ -543,6 +596,9 @@
"disable": {
"message": "Nonaktif"
},
"autoSkip_POI": {
"message": "Otomatis lewati ke awal"
},
"manualSkip_POI": {
"message": "Tanya saat video dimuat"
},
@@ -552,6 +608,9 @@
"autoSkipOnMusicVideos": {
"message": "Lewati semua segmen secara otomatis ketika ada segmen non-music"
},
"muteSegments": {
"message": "Perbolehkan segmen untuk bisu daripada melewati"
},
"colorFormatIncorrect": {
"message": "Warna anda tidak diformat dengan benar. Harusnya terdiri dari 3 atau 6 digit kode heksa dengan tagar di awal."
},
@@ -591,6 +650,9 @@
"message": "Untuk mengirimkan segmen dengan kategori \"{0}\", Anda harus mengaktifkannya di opsi. Anda akan diarahkan ke opsi sekarang.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Perhatian: Tipe segmen ini hanya bisa maksimum aktif satu kali. Mengirimkan beberapa dapat mengakibatkan muncul pada kondisi acak."
},
"youMustSelectACategory": {
"message": "Anda harus memilih kategori untuk semua segmen yang anda kirimkan!"
},
@@ -637,9 +699,6 @@
"downvoteDescription": {
"message": "Salah, Waktu Tidak Tepat"
},
"incorrectCategory": {
"message": "Salah Kategori"
},
"nonMusicCategoryOnMusic": {
"message": "Video ini dikategorikan sebagai musik. Apakah anda yakin ini berisi sponsor? Jika ini ternyata adalah \"Segmen non-musik\", buka pengaturan ekstensi dan aktifkan kategorinya. Lalu, anda bisa mengirim segmen ini sebagai \"Non-musik\" bukannya sponsor. Harap membaca panduan jika anda kebingungan."
},
@@ -666,9 +725,20 @@
"message": "Mengerti",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "Tidak ikut eksperimen masa depan",
"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": "Sembunyikan selamanya"
},
"warningChatInfo": {
"message": "Anda mendapatkan peringatan dan tidak bisa mengirim segmen sementara. Ini dikarenakan kami melihat kamu melakukan beberapa kesalahan yang umum, mohon konfirmasi bahwa kamu mengerti perundangan dan kami akan hapus peringatan. Kamu bisa bergabung ke obrolan menggunakan discord.gg/SponsorBlock atau matrix.io/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Suara ditolak karena peringatan. Klik untuk buka obrolan untuk menyelesaikannya, atau kembali beberapa saat lagi ketika ada waktu.",
"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": "Donasi"
},
@@ -681,7 +751,64 @@
"helpPageReviewOptions": {
"message": "Haram ditinjau opsi di bawah ini"
},
"helpPageFeatureDisclaimer": {
"message": "Banyak fitur yang dinonaktifkan secara bawaan. Jika kamu ingin lewati mula, akhir, gunakan Invidious, dll, aktifkan mereka dibawah ini.\nKamu bisa menyembunyikan/menghadirkan elemen UI."
},
"helpPageHowSkippingWorks": {
"message": "Cara kerja melewati segmen"
},
"helpPageHowSkippingWorks1": {
"message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya."
},
"helpPageHowSkippingWorks2": {
"message": "Kapanpun kamu melewati segmen, kamu akan mendapatkan maklumat. Jika waktu terlihat salah dapat menyuarakan turun dengan klik turun-suara! Kamu juga bisa menyuarakan di maklumat."
},
"Submitting": {
"message": "Mengirim"
},
"helpPageSubmitting1": {
"message": "Mengirim bisa baik dilakukan di maklumat dengan menekan tombol \"Mulai Segmen Sekarang\" atau di pemutar video dengan tombol di pemutar."
},
"helpPageSubmitting2": {
"message": "Klik tombol putar indikasikan memulai segmen dan klik tombol ikon stop indikasikan mengakhiri. Kamu bisa persiapkan beberapa sponsor sebelum menekan kirim. Klik tombol unggah akan mengirimkan. Klik tombol sampah akan menghapuskan."
},
"Editing": {
"message": "Sunting"
},
"helpPageEditing1": {
"message": "Jika kamu mengacaukan, kamu bisa sunting atau hapus segmen setelah klik tombol panah atas."
},
"helpPageTooSlow": {
"message": "Ini terlalu lambat"
},
"helpPageTooSlow1": {
"message": "Terdapat tombol pintas jika kamu ingin menggunakannya. Tekan tombol semikolon untuk indikasi mulai/akhir segmen sponsor dan tekan tombol kutip untuk mengirimkan. Ini bisa diganti di opsi. Jika kamu tidak menggunakan QWERTY, kamu dimungkinkan harus mengubah tombol."
},
"helpPageCopyOfDatabase": {
"message": "Bisakah saya mendapatkan salinan Databasis? Apa yang terjadi jika kamu tiada?"
},
"helpPageCopyOfDatabase1": {
"message": "Databasis adalah publik dan tersedia di"
},
"helpPageCopyOfDatabase2": {
"message": "Sumber kode tersedia secara bebas. Jadi, jika sesuatu terjadi pada saya, pengajuan kamu tidak akan hilang."
},
"helpPageNews": {
"message": "Berita dan bagaimana ini diciptakan"
},
"helpPageSourceCode": {
"message": "Dimana saya mendapatkankan sumber kode?"
},
"Credits": {
"message": "Kredit"
},
"highlightNewFeature": {
"message": "Baru! Dapat ke poin video dengan satu klik dengan kategori highlight terbaru"
},
"LearnMore": {
"message": "Pelajari Lebih Lanjut"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Gunakan roda mouse ketika berada di kotak edit untuk mengatur waktu dengan cepat. Kombinasi dengan tombol [Ctrl + Shift] bisa digunakan untuk perubahan yang halus."
}
}

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,40 +174,34 @@
"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"
},
"whatInfoButton": {
"message": "Questo è il pulsante che apre un popup nella pagina YouTube."
"message": "Nascondi il pulsante d'informazioni sopra al video"
},
"autoHideInfoButton": {
"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"
},
"whatDeleteButton": {
"message": "Questo è il pulsante che ti permette di cancellare tutti gli spezzoni sponsorizzati nel lettore di YouTube."
"message": "Mostra il pulsante elimina"
},
"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,13 +213,13 @@
"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"
@@ -243,15 +240,15 @@
"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": {
@@ -275,7 +272,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ù."
@@ -299,9 +296,15 @@
"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)"
@@ -310,6 +313,10 @@
"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)"
@@ -363,7 +370,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"
@@ -429,9 +436,6 @@
"showUploadButton": {
"message": "Mostra Pulsante di Caricamento"
},
"whatUploadButton": {
"message": "Questo pulsante appare sul riproduttore di YouTube dopo che hai selezionato un marcatore temporale e sei pronto ad inviarlo."
},
"customServerAddress": {
"message": "Indirizzo Server SponsorBlock"
},
@@ -601,6 +605,9 @@
"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."
},
@@ -640,6 +647,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!"
},
@@ -686,9 +696,6 @@
"downvoteDescription": {
"message": "Tempo Non Corretto/Errato"
},
"incorrectCategory": {
"message": "Categoria Errata"
},
"nonMusicCategoryOnMusic": {
"message": "Questo video è classificato come musica. Sei sicuro che questo video contenga uno sponsor? Se questo è in realtà un \"Segmento Non-Musica\", apri le opzioni di questa estensione e abilita questa categoria. Quindi, è possibile inviare questo segmento come \"Non-Music\" invece di sponsor. Si prega di leggere la guida se si è confusi."
},
@@ -722,9 +729,6 @@
"hideForever": {
"message": "Nascondi per sempre"
},
"warningChatInfo": {
"message": "Hai ricevuto un ammonimento and non puoi inviare segmenti temporaneamente. Ciò significa che abbiamo notato che stavi commettendo alcuni errori comuni senza scopo malevolo, e vogliamo che tu ricontrollassi le regole. Puoi anche partecipare a questa chat su discord.gg/SponsorBlock o matrix.to/#/+sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Voto rifiutato a causa di un ammonimento. Clicca per aprire una chat per risolverlo, oppure torna dopo quando hai tempo.",
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "再スキップ"
},
"unmute": {
"message": "ミュート解除"
},
"paused": {
"message": "一時停止中"
},
@@ -80,13 +83,13 @@
"message": "セグメント終了を記録"
},
"sponsorCancel": {
"message": "区間の作成を取り止める"
"message": "セグメントの作成を取り消す"
},
"noVideoID": {
"message": "YouTube動画が見つかりませんでした。\nこれが正しくない場合は、タブを再読み込みしてください。"
},
"refreshSegments": {
"message": "区域を更新"
"message": "セグメントを更新"
},
"success": {
"message": "成功しました!"
@@ -100,9 +103,6 @@
"connectionError": {
"message": "接続エラーが発生しました。 エラーコード: "
},
"wantToSubmit": {
"message": "次の動画IDで提出します:"
},
"clearTimes": {
"message": "セグメントを消去"
},
@@ -161,6 +161,9 @@
"setUsername": {
"message": "ユーザー名を設定"
},
"copyPublicID": {
"message": "パブリックユーザIDをコピー"
},
"discordAdvert": {
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください"
},
@@ -179,15 +182,15 @@
"hideButtonsDescription": {
"message": "YouTube再生画面のセグメント提出ボタンを非表示にします。"
},
"showSkipButton": {
"message": "プレイヤーの「ハイライトまでスキップ」ボタン表示を維持する"
},
"showInfoButton": {
"message": "YouTubeプレーヤーの情報ボタンを表示する"
},
"hideInfoButton": {
"message": "YouTubeプレーヤーの情報ボタンを隠す"
},
"whatInfoButton": {
"message": "これはYouTubeのページ上でポップアップを開くためのボタンです。"
},
"autoHideInfoButton": {
"message": "情報ボタンを自動的に隠す"
},
@@ -197,9 +200,6 @@
"showDeleteButton": {
"message": "YouTubeプレーヤーに削除ボタンを表示"
},
"whatDeleteButton": {
"message": "これはYouTubeプレーヤー上のボタンで、現在の動画から未提出のセグメントを全て消去します。"
},
"enableViewTracking": {
"message": "スキップ回数の統計を有効にする"
},
@@ -228,19 +228,19 @@
"message": "セグメントがスキップされた後に通知を表示する"
},
"noticeVisibilityMode0": {
"message": "飛び越し通知(全体)"
"message": "標準サイズのスキップ通知"
},
"noticeVisibilityMode1": {
"message": "自動飛び越し通知(小)"
"message": "自動スキップ通知を小型化"
},
"noticeVisibilityMode2": {
"message": "すべての飛び越し通知(小)"
"message": "すべてのスキップ通知を小型化"
},
"noticeVisibilityMode3": {
"message": "表示の終了した自動飛び越し通知"
"message": "自動スキップ通知を透過"
},
"noticeVisibilityMode4": {
"message": "表示の終了した全ての飛び越し通知"
"message": "すべてのスキップ通知を透過"
},
"longDescription": {
"message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。",
@@ -299,9 +299,15 @@
"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)"
@@ -310,6 +316,10 @@
"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)"
@@ -363,7 +373,7 @@
"message": "ユーザーIDのインポート/エクスポート"
},
"whatChangeUserID": {
"message": "ユーザーIDは公開しないでください。これはパスワードのようなもので誰とも共有するべきではありません。 他の誰かが知った場合、あなたになりすます可能性があります。"
"message": "この情報を誰にも開示しないでください。これはパスワードのように、誰とも共有するべきではありません。 誰かがこれを持っている場合、あなたになりすますことができます。パブリックユーザーIDを探している場合は、ポップアップのクリップボードアイコンをクリックしてください。"
},
"setUserID": {
"message": "ユーザーIDを設定"
@@ -429,9 +439,6 @@
"showUploadButton": {
"message": "アップロードボタンを表示"
},
"whatUploadButton": {
"message": "このボタンはタイムスタンプを選択して投稿の準備ができた後にYouTubeプレーヤーに表示されます。"
},
"customServerAddress": {
"message": "SponsorBlock サーバーアドレス"
},
@@ -566,10 +573,10 @@
"message": "音楽以外の部分"
},
"category_poi_highlight": {
"message": "強調表示"
"message": "ハイライト"
},
"category_poi_highlight_description": {
"message": "ほとんどの人が必要としている動画の箇所。「xx:xx 開始」というようなコメントと類似。"
"message": "多くの人が求めている動画の部分。「動画はXからスタート」のようなコメントです。"
},
"category_livestream_messages": {
"message": "ライブ配信: 寄付/メッセージの読み上げ"
@@ -590,7 +597,7 @@
"message": "無効"
},
"autoSkip_POI": {
"message": "動画の開始時刻まで飛び越し"
"message": "冒頭へ自動スキップ"
},
"manualSkip_POI": {
"message": "動画を読み込んだ際に確認する"
@@ -601,6 +608,9 @@
"autoSkipOnMusicVideos": {
"message": "非音楽区域がある場合,全区域を自動的に飛び越す"
},
"muteSegments": {
"message": "スキップする代わりに音声をミュートしてセグメントを許可"
},
"colorFormatIncorrect": {
"message": "カラーコードの書式が間違っています。 #から始まる3桁または6桁の16進数コードでなければなりません。"
},
@@ -640,6 +650,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": "送信するすべてのセグメントにカテゴリを選択する必要があります!"
},
@@ -687,7 +700,7 @@
"message": "不正確あるいは間違った時刻です"
},
"incorrectCategory": {
"message": "カテゴリが違います"
"message": "カテゴリーを変更してください"
},
"nonMusicCategoryOnMusic": {
"message": "この動画は音楽として分類されています。本当にこの動画にスポンサー部分がありますか? 本セグメントが本当に「音楽以外の区域」だった場合は、設定画面からこの分類を有効にしてください。その後、「スポンサー部分」の代わりに「音楽以外のセグメント」としてセグメントを提出できます。よく分からない場合は、ガイドラインを参照してください。"
@@ -723,7 +736,7 @@
"message": "二度と表示しない"
},
"warningChatInfo": {
"message": "警告のため,区域の送信が一時的に禁止されています。これは利用者さまが間違いを犯されているというこちらどもの判断ではありますが,この間違いが悪意あるものとは思っておりません。単に,利用者さまに区域送信における規則を知っていただきたいだけです。連絡先: discord.gg/SponsorBlockmatrix.to/#/+sponsor:ajay.app"
"message": "警告のためにあなたは一時的にセグメントを提出することができなくなりました。これはあなたが悪意のない一般的なミスを犯していることに私たちが気づいた事を意味します、ルールを理解していることを確認していただければこの警告を解除します。discord.gg/SponsorBlock または matrix.to/#/#sponsor:ajay.app を使ってこのチャットに参加することもできます。"
},
"voteRejectedWarning": {
"message": "警告により投票が拒否されました。クリックして運営に連絡するか,少し時間を置いてからやりなおしてください。",
@@ -756,9 +769,30 @@
"Submitting": {
"message": "提出中"
},
"helpPageSubmitting1": {
"message": "提出するにはポップアップの「セグメント開始を記録」ボタン、またはビデオプレーヤー内にあるボタンを押してください。"
},
"helpPageSubmitting2": {
"message": "再生ボタンをクリックするとセグメントの開始、停止アイコンをクリックすると終了となります。 複数のスポンサーを用意してから送信ボタンを押すことができます。アップロードボタンをクリックすると提出されます。ゴミ箱をクリックすると削除されます。"
},
"Editing": {
"message": "編集中"
},
"helpPageEditing1": {
"message": "もし失敗しても、上矢印ボタンをクリックすれば、セグメントを編集・削除することができます。"
},
"helpPageTooSlow": {
"message": "遅すぎます"
},
"helpPageTooSlow1": {
"message": "利用可能なホットキーがあります。セミコロンキーを押してスポンサーセグメントの開始/終了を示し、アポストロフィキーを押して送信します。これらはオプションで変更できます。QWERTYを使わない場合は、キーバインドを変更したほうがいいでしょう。"
},
"helpPageCopyOfDatabase": {
"message": "データベースのコピーを取得できますか? あなたがいなくなった場合はどうなりますか?"
},
"helpPageCopyOfDatabase1": {
"message": "データベースは公開されており、次の場所で利用できます:"
},
"helpPageCopyOfDatabase2": {
"message": "ソースコードは自由に利用できます。運営になにがあろうとも,あなたの貢献(提出された区域)が失われることはありません。"
},
@@ -771,7 +805,28 @@
"Credits": {
"message": "謝辞"
},
"highlightNewFeature": {
"message": "新機能! 新しいハイライトカテゴリを使用し、動画の要点にワンクリックで\n移動できます。"
},
"LearnMore": {
"message": "さらに詳しく"
},
"CopyDownvoteButtonInfo": {
"message": "反対票を投じ、再提出するためにローカルコピーを作成します。"
},
"OpenCategoryWikiPage": {
"message": "このカテゴリーのWikiページを開きます。"
},
"CopyAndDownvote": {
"message": "コピーして反対票を投じる"
},
"ContinueVoting": {
"message": "投票を続ける"
},
"ChangeCategoryTooltip": {
"message": "この変更は即座にあなたのセグメントに適用されます"
},
"SponsorTimeEditScrollNewFeature": {
"message": "編集ボックスにカーソルを合わせながらマウスホイールを使用すると、時間をすばやく調整できます。 CtrlキーまたはShiftキーの組み合わせを使用して変更を微調整できます。"
}
}

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": "공식 디스코드 서버에 들어와서 기능 제안을 해주시거나 피드백을 남겨주세요!"
},
@@ -179,15 +182,15 @@
"hideButtonsDescription": {
"message": "스킵할 구간을 제출하기 위해 YouTube 플레이어에 나타나는 버튼을 숨깁니다"
},
"showSkipButton": {
"message": "플레이어에 하이라이트로 건너뛰기 버튼 표시"
},
"showInfoButton": {
"message": "YouTube 플레이어에서 정보 버튼 표시하기"
},
"hideInfoButton": {
"message": "YouTube 플레이어에서 정보 버튼 숨기기"
},
"whatInfoButton": {
"message": "YouTube 페이지에 팝업으로 표시되는 버튼입니다"
},
"autoHideInfoButton": {
"message": "정보 버튼 자동 숨김"
},
@@ -197,9 +200,6 @@
"showDeleteButton": {
"message": "YouTube 플레이어에서 삭제 버튼 표시하기"
},
"whatDeleteButton": {
"message": "현재 영상에 제출되지 않은 구간을 YouTube 플레이어 내에서 지우는 버튼입니다"
},
"enableViewTracking": {
"message": "스킵 개수 추적 활성화"
},
@@ -299,9 +299,15 @@
"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)"
@@ -310,6 +316,10 @@
"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)"
@@ -363,7 +373,7 @@
"message": "사용자 ID 가져오기/내보내기"
},
"whatChangeUserID": {
"message": "이 정보는 다른 사람에게 공개하지 마세요. 이것은 비밀번호처럼 절대로 알려주면 안되는 정보입니다. 다른 사람이 이 정보를 습득했을 경우 사용자를 사칭할 수도 있습니다."
"message": "이 정보는 다른 사람에게 공개하지 마세요. 이것은 비밀번호처럼 절대로 알려주면 안되는 정보입니다. 다른 사람이 이 정보를 습득했을 경우 사용자를 사칭할 수도 있습니다. 혹시 공개 사용자 ID를 찾고 있다면, 팝업 내 클립보드 아이콘을 누르시기 바랍니다."
},
"setUserID": {
"message": "사용자ID 설정"
@@ -429,9 +439,6 @@
"showUploadButton": {
"message": "업로드 버튼 표시"
},
"whatUploadButton": {
"message": "이 버튼은 타임 스탬프를 설정 후 제출 준비가 되었을 때 YouTube 플레이어에 나타납니다."
},
"customServerAddress": {
"message": "SponsorBlock 서버 주소"
},
@@ -601,6 +608,9 @@
"autoSkipOnMusicVideos": {
"message": "음악이 아닌 구간이 있을 때는 모든 구간 자동 건너뛰기"
},
"muteSegments": {
"message": "구간을 건너뛰지 않고 음소거 처리"
},
"colorFormatIncorrect": {
"message": "올바르지 않은 색상 코드입니다. 색상 코드는 샵 (#) 기호로 시작하여 3자리 또는 6자리의 16진수로 구성되어야 합니다."
},
@@ -640,6 +650,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": "제출 해야하는 모든 구간의 카테고리를 설정해야합니다!"
},
@@ -686,9 +699,6 @@
"downvoteDescription": {
"message": "잘못된 타이밍입니다"
},
"incorrectCategory": {
"message": "잘못된 카테고리입니다"
},
"nonMusicCategoryOnMusic": {
"message": "이 영상은 음악 영상으로 분류됩니다. 정말로 스폰서가 있는 것이 확실한가요? 만약 음악 이외의 구간인 경우, 확장 옵션을 열어 이 카테고리를 활성화 하세요. 그리고, 이 구간을 스폰서 대신 음악이 아닌 구간으로 제출하세요. 헷갈릴 경우 가이드라인을 읽으세요."
},
@@ -723,7 +733,7 @@
"message": "다시 보지 않음"
},
"warningChatInfo": {
"message": "현재 귀하가 악의적이지 않은 일반적인 실수를 저지르고 있음을 발견했습니다. 이에 따라 경고 조치가 내려져 일시적으로 구간을 제출할 수 없게 되었습니다. 저희는 단지 규칙을 명확히 전달하고자 합니다. discord.gg/SponsorBlock 또는 matrix.to/#/+sponsor:ajay.app 링크를 통해 대화에 참여할 수도 있습니다."
"message": "현재 귀하가 악의적이지 않은 일반적인 실수를 저지르고 있음을 발견했습니다. 이에 따라 경고 조치가 내려져 일시적으로 구간을 제출할 수 없게 되었습니다. 규정을 잘 숙지했음을 확인해주십시오. 그러면 경고를 삭제하겠습니다. discord.gg/SponsorBlock 또는 matrix.to/#/#sponsor:ajay.app 링크를 통해 대화에 참여할 수도 있습니다."
},
"voteRejectedWarning": {
"message": "경고로 인해 투표가 거부되었습니다. 클릭하여 대화로 해결하거나, 나중에 시간이 나면 다시 오세요.",
@@ -797,5 +807,8 @@
},
"LearnMore": {
"message": "더보기"
},
"SponsorTimeEditScrollNewFeature": {
"message": "편집 상자 위에 커서를 올린 채 스크롤하면 시간을 빠르게 조정할 수 있습니다. Ctrl이나 Shift 키를 누른 채로 스크롤하면 세밀한 조정이 가능합니다."
}
}

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "ഒരു കണക്ഷൻ പിശക് സംഭവിച്ചു. പിശക് കോഡ്: "
},
"wantToSubmit": {
"message": "വീഡിയോ ഐഡിക്ക് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ"
},
"clearTimes": {
"message": "സെഗ്‌മെന്റുകൾ മായ്‌ക്കുക"
},
@@ -179,18 +176,12 @@
"hideInfoButton": {
"message": "YouTube പ്ലെയറിൽ വിവര ബട്ടൺ മറയ്‌ക്കുക"
},
"whatInfoButton": {
"message": "YouTube പേജിൽ ഒരു പോപ്പ്അപ്പ് തുറക്കുന്ന ബട്ടണാണിത്."
},
"hideDeleteButton": {
"message": "YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ മറയ്‌ക്കുക"
},
"showDeleteButton": {
"message": "YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ കാണിക്കുക"
},
"whatDeleteButton": {
"message": "നിലവിലെ വീഡിയോയ്‌ക്കായി നിങ്ങൾ സമർപ്പിക്കാത്ത എല്ലാ സെഗ്‌മെന്റുകളും മായ്‌ക്കുന്ന YouTube പ്ലെയറിലെ ബട്ടൺ ഇതാണ്."
},
"enableViewTracking": {
"message": "ക Count ണ്ട് ട്രാക്കിംഗ് ഒഴിവാക്കുക പ്രാപ്തമാക്കുക"
},
@@ -320,9 +311,6 @@
"changeUserID": {
"message": "നിങ്ങളുടെ യൂസർ ഐഡി ഇറക്കുമതി ചെയ്യുക / കയറ്റുമതി ചെയ്യുക"
},
"whatChangeUserID": {
"message": "ഇത് സ്വകാര്യമായി സൂക്ഷിക്കണം. ഇത് ഒരു പാസ്‌വേഡ് പോലെയാണ്, ഇത് ആരുമായും പങ്കിടാൻ പാടില്ല. ആർക്കെങ്കിലും ഇത് ഉണ്ടെങ്കിൽ, അവർക്ക് നിങ്ങളെ ആൾമാറാട്ടം നടത്താം."
},
"setUserID": {
"message": "യൂസർ ഐഡി സജ്ജമാക്കുക"
},
@@ -365,9 +353,6 @@
"showUploadButton": {
"message": "അപ്‌ലോഡ് ബട്ടൺ കാണിക്കുക"
},
"whatUploadButton": {
"message": "നിങ്ങൾ ഒരു ടൈംസ്റ്റാമ്പ് തിരഞ്ഞെടുത്ത് സമർപ്പിക്കാൻ തയ്യാറായ ശേഷം ഈ ബട്ടൺ YouTube പ്ലെയറിൽ ദൃശ്യമാകും."
},
"customServerAddress": {
"message": "സ്പോൺസർബ്ലോക്ക് സെർവർ വിലാസം"
},
@@ -569,9 +554,6 @@
"downvoteDescription": {
"message": "തെറ്റായ / തെറ്റായ സമയം"
},
"incorrectCategory": {
"message": "തെറ്റായ വിഭാഗം"
},
"nonMusicCategoryOnMusic": {
"message": "ഈ വീഡിയോയെ സംഗീതമായി വർഗ്ഗീകരിച്ചിരിക്കുന്നു. ഇതിന് ഒരു സ്പോൺസർ ഉണ്ടെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് യഥാർത്ഥത്തിൽ \"സംഗീതേതര വിഭാഗമാണ്\" എങ്കിൽ, വിപുലീകരണ ഓപ്ഷനുകൾ തുറന്ന് ഈ വിഭാഗം പ്രാപ്തമാക്കുക. തുടർന്ന്, സ്പോൺസറിന് പകരം \"നോൺ-മ്യൂസിക്\" എന്ന് നിങ്ങൾക്ക് ഈ സെഗ്മെന്റ് സമർപ്പിക്കാൻ കഴിയും. നിങ്ങൾ ആശയക്കുഴപ്പത്തിലാണെങ്കിൽ ദയവായി മാർഗ്ഗനിർദ്ദേശങ്ങൾ വായിക്കുക."
},

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"
},
@@ -179,18 +176,12 @@
"hideInfoButton": {
"message": "Sembunyikan Butang Maklumat Pada Pemain YouTube"
},
"whatInfoButton": {
"message": "Ini adalah butang yang membuka pop timbul di halaman YouTube."
},
"hideDeleteButton": {
"message": "Sembunyikan Butang Padam Pada Pemain YouTube"
},
"showDeleteButton": {
"message": "Tunjukkan Butang Padam Pada Pemain YouTube"
},
"whatDeleteButton": {
"message": "Ini adalah butang pada pemain YouTube yang akan membersihkan semua segmen anda yang belum dihantar untuk video semasa."
},
"enableViewTracking": {
"message": "Dayakan Skip Count Tracking"
},
@@ -320,9 +311,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"
},
@@ -365,9 +353,6 @@
"showUploadButton": {
"message": "Tunjukkan Butang Muat Naik"
},
"whatUploadButton": {
"message": "Butang ini muncul di pemain YouTube setelah anda memilih cap waktu dan siap untuk dihantar."
},
"customServerAddress": {
"message": "Alamat Pelayan Sponsorblock"
},
@@ -569,9 +554,6 @@
"downvoteDescription": {
"message": "Pemasaan Tidak Betul / Salah"
},
"incorrectCategory": {
"message": "Kategori Salah"
},
"nonMusicCategoryOnMusic": {
"message": "Video ini dikategorikan sebagai muzik. Adakah anda pasti ini mempunyai penaja? Sekiranya ini sebenarnya adalah \"Segmen Bukan Muzik\", buka pilihan peluasan dan aktifkan kategori ini. Kemudian, anda boleh menghantar segmen ini sebagai \"Bukan Muzik\" dan bukannya penaja. Sila baca panduan sekiranya anda keliru."
},

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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Dit verbergt de knoppen die verschijnen op de YouTube-speler om segmenten over te slaan."
},
"showSkipButton": {
"message": "Knop voor \"overslaan naar hoogtepunt\" op speler houden"
},
"showInfoButton": {
"message": "Info-knop op YouTube-speler weergeven"
},
"hideInfoButton": {
"message": "Info-knop op YouTube-speler verbergen"
},
"whatInfoButton": {
"message": "Dit is de knop die een pop-up opent op de YouTube-pagina."
},
"autoHideInfoButton": {
"message": "Infoknop automatisch verbergen"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Verwijderen-knop op YouTube-speler weergeven"
},
"whatDeleteButton": {
"message": "Dit is de knop op de YouTube-speler die al uw niet-ingediende segmenten van de huidige video zal wissen."
},
"enableViewTracking": {
"message": "Bijhouden van het aantal keren overslaan inschakelen"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Uploaden-knop weergeven"
},
"whatUploadButton": {
"message": "Deze knop verschijnt op de YouTube-speler nadat u een tijdstempel heeft geselecteerd en klaar bent om in te dienen."
},
"customServerAddress": {
"message": "SponsorBlock-serveradres"
},
@@ -604,6 +608,9 @@
"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."
},
@@ -643,6 +650,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!"
},
@@ -690,7 +700,7 @@
"message": "Verkeerde timing"
},
"incorrectCategory": {
"message": "Verkeerde categorie"
"message": "Categorie wijzigen"
},
"nonMusicCategoryOnMusic": {
"message": "Deze video is gecategoriseerd als muziek. Weet u zeker dat dit een sponsor heeft? Als dit eigenlijk een \"niet-muzieksegment\" is, open dan de extensie-opties en schakel deze categorie in. Vervolgens kunt u dit segment indienen als \"niet-muziek\" in plaats van als sponsor. Lees de richtlijnen als u in de war bent."
@@ -726,7 +736,7 @@
"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. Bevestig dat u de regels begrijpt en we zullen de waarschuwing verwijderen. 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.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Meer informatie"
},
"CopyDownvoteButtonInfo": {
"message": "Doet een downvote en maakt een lokale kopie aan die u opnieuw kunt indienen"
},
"OpenCategoryWikiPage": {
"message": "Wikipagina van deze categorie openen."
},
"CopyAndDownvote": {
"message": "Kopiëren en downvote doen"
},
"ContinueVoting": {
"message": "Doorgaan met stemmen"
},
"ChangeCategoryTooltip": {
"message": "Dit is direct van toepassing op uw segmenten"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Gebruik het muiswiel terwijl u over het invoerveld beweegt om de tijd snel aan te passen. Combinaties van de ctrl- of shift-toets kunnen worden gebruikt om de wijzigingen te verfijnen."
}
}

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"
},
@@ -179,18 +176,12 @@
"hideInfoButton": {
"message": "Skjul infoknappen på YouTube-avspilleren"
},
"whatInfoButton": {
"message": "Dette er knappen som åpner et oppsprett på YouTube-siden."
},
"hideDeleteButton": {
"message": "Skjul Slett-knappen på YouTube-avspilleren"
},
"showDeleteButton": {
"message": "Vis Slett-knappen på YouTube-avspilleren"
},
"whatDeleteButton": {
"message": "Dette er knappen på YouTube-avspilleren som tømmer alle dine uinnsendte segmenter for den nåværende videoen."
},
"enableViewTracking": {
"message": "Skru på telling av hopp"
},
@@ -320,9 +311,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"
},
@@ -365,9 +353,6 @@
"showUploadButton": {
"message": "Vis opplastingsknapp"
},
"whatUploadButton": {
"message": "Denne knappen dukker opp på YouTube-avspilleren etter at du har valgt et tidsstempel og er klar til å sende inn."
},
"customServerAddress": {
"message": "SponsorBlock-tjeneradresse"
},
@@ -581,9 +566,6 @@
"downvoteDescription": {
"message": "Feil tidtaking"
},
"incorrectCategory": {
"message": "Feil kategori"
},
"nonMusicCategoryOnMusic": {
"message": "Denne videoen er kategorisert som musikk. Er du sikker på at dette har en sponsor? Hvis det egentlig er et \"Ikke-musikk-segment\", åpne opp innstillingene til utvidelsen og skru på denne kategorien. Deretter kan du sende dette segmentet som \"Ikke-musikk\" i stedet for som sponsing. Vennligst les retningslinjene hvis du er forvirret."
},

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!"
},
@@ -185,9 +188,6 @@
"hideInfoButton": {
"message": "Ukryj przycisk informacyjny na odtwarzaczu YouTube"
},
"whatInfoButton": {
"message": "Jest to przycisk otwierający okienko pop-up na stronie YouTube."
},
"autoHideInfoButton": {
"message": "Autoukrywanie przycisku informacji"
},
@@ -197,9 +197,6 @@
"showDeleteButton": {
"message": "Pokaż przycisk usuwania na odtwarzaczu YouTube"
},
"whatDeleteButton": {
"message": "Ten przycisk na odtwarzaczu YouTube wyczyści wszystkie twoje niewysłane segmenty dla bieżącego filmu."
},
"enableViewTracking": {
"message": "Włącz monitorowanie liczby pominięć"
},
@@ -227,6 +224,21 @@
"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."
@@ -284,13 +296,31 @@
"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 {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"
},
@@ -340,7 +370,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"
@@ -406,9 +436,6 @@
"showUploadButton": {
"message": "Pokaż przycisk wysyłania"
},
"whatUploadButton": {
"message": "Ten przycisk pojawia się na odtwarzaczu YouTube po wybraniu przedziału czasowego, gdy segment jest gotowy do wysłania."
},
"customServerAddress": {
"message": "Adres serwera SponsorBlock"
},
@@ -543,7 +570,10 @@
"message": "Bez muzyki"
},
"category_poi_highlight": {
"message": "Podświetlone"
"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"
@@ -563,9 +593,21 @@
"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ą (#)."
},
@@ -605,6 +647,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!"
},
@@ -651,9 +696,6 @@
"downvoteDescription": {
"message": "Niepoprawne/Zły czas"
},
"incorrectCategory": {
"message": "Zła kategoria"
},
"nonMusicCategoryOnMusic": {
"message": "Ten film jest skategoryzowany jako muzyka. Czy masz pewność, że jest tutaj sponsor? Jeśli w rzeczywistości jest to „Sekcja Niemuzyczna”, otwórz opcje rozszerzenia i włącz tę kategorię. Wtedy będziesz w stanie zamieścić ten segment jako „Bez Muzyki” zamiast sponsora. Przeczytaj proszę wytyczne, jeśli masz wątpliwości."
},
@@ -676,6 +718,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."
@@ -684,18 +730,78 @@
"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 przesyłać segmentów. Oznacza to, że zauważyliśmy, że popełniłeś/aś pewne powszechne błędy, które nie są złośliwe, Proszę tylko potwierdzić, że rozumiesz zasady i usuniemy ostrzeżenie. 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"
},
@@ -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!"
},
@@ -179,15 +182,15 @@
"hideButtonsDescription": {
"message": "Esta opção esconde os botões que aparecem para enviar segmentos no player do YouTube."
},
"showSkipButton": {
"message": "Manter botão Pular para os Destaques no player"
},
"showInfoButton": {
"message": "Mostrar botão de Informações no player do Youtube"
},
"hideInfoButton": {
"message": "Esconder botão de Informações no player do Youtube"
},
"whatInfoButton": {
"message": "Este é o botão que abre o popup na pagina do Youtube."
},
"autoHideInfoButton": {
"message": "Esconder Automaticamente o Botão de Informação"
},
@@ -197,9 +200,6 @@
"showDeleteButton": {
"message": "Mostrar botão de Apagar no player do Youtube"
},
"whatDeleteButton": {
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
},
"enableViewTracking": {
"message": "Ativar Contador de Segmentos Pulados"
},
@@ -299,9 +299,15 @@
"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)"
@@ -310,6 +316,10 @@
"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)"
@@ -363,7 +373,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"
@@ -429,9 +439,6 @@
"showUploadButton": {
"message": "Mostrar botão de envio"
},
"whatUploadButton": {
"message": "Este botão aparece no reprodutor do YouTube depois de ter selecionado um carimbo de data/hora e está pronto para ser enviado."
},
"customServerAddress": {
"message": "Endereço do servidor do SponsorBlock"
},
@@ -601,6 +608,9 @@
"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."
},
@@ -640,6 +650,9 @@
"message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Aviso: Este tipo de segmento pode ter no máximo um ativo por vez. Enviar múltiplos fará com que um aleatório seja mostrado."
},
"youMustSelectACategory": {
"message": "Você deve selecionar uma categoria para todos os segmentos que você está enviando!"
},
@@ -687,7 +700,7 @@
"message": "Tempo errado ou incorreto"
},
"incorrectCategory": {
"message": "Categoria errada"
"message": "Mudar Categoria"
},
"nonMusicCategoryOnMusic": {
"message": "Este vídeo é categorizado como música. Tem certeza de que isto tem um patrocinador? Se este é realmente um \"Segmento Não Musical\", abra as opções da extensão e habilite esta categoria. Assim você pode enviar este segmento como \"Não-Musical\" ao invés de patrocinador. Por favor leia as diretrizes se estiver confuso."
@@ -723,7 +736,7 @@
"message": "Ocultar para sempre"
},
"warningChatInfo": {
"message": "Você recebeu um aviso e temporariamente não pode 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 não pode enviar segmentos temporariamente. Isso significa que notamos que você estava cometendo erros comuns não maliciosos, por favor confirme que você entende as regras e removeremos o aviso. Você também pode participar do 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.",
@@ -797,5 +810,20 @@
},
"LearnMore": {
"message": "Saiba mais"
},
"CopyDownvoteButtonInfo": {
"message": "Dá voto negativo e cria uma cópia local para você reenviar"
},
"OpenCategoryWikiPage": {
"message": "Abrir a wiki dessa categoria."
},
"CopyAndDownvote": {
"message": "Copiar e dar voto negativo"
},
"ContinueVoting": {
"message": "Continuar Votando"
},
"ChangeCategoryTooltip": {
"message": "Isto irá aplicar instantaneamente seus segmentos"
}
}

View File

@@ -99,18 +99,12 @@
"hideInfoButton": {
"message": "Esconder botão de Informações no player do Youtube"
},
"whatInfoButton": {
"message": "Este é o botão que abre o popup na pagina do Youtube."
},
"hideDeleteButton": {
"message": "Esconder botão de Apagar no player do Youtube"
},
"showDeleteButton": {
"message": "Mostrar botão de Apagar no player do Youtube"
},
"whatDeleteButton": {
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
},
"showNotice": {
"message": "Mostrar notificação outra vez"
},

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"
},
@@ -179,18 +176,12 @@
"hideInfoButton": {
"message": "Ascunde Butoanele De Informații Pe Playerul De YouTube"
},
"whatInfoButton": {
"message": "Acesta este butonul care deschide popup-ul pe pagina de YouTube."
},
"hideDeleteButton": {
"message": "Ascunde Butonul De Ștergere Pe Playerul De YouTube"
},
"showDeleteButton": {
"message": "Arată Butonul De Ștergere Pe Playerul De YouTube"
},
"whatDeleteButton": {
"message": "Acest buton de pe playerul de YouTube va șterge toate segmentele netrimise pentru videoclipul curent."
},
"enableViewTracking": {
"message": "Activează Urmărirea Săriturilor"
},
@@ -320,9 +311,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"
},
@@ -365,9 +353,6 @@
"showUploadButton": {
"message": "Arată Butonul De Încărcare"
},
"whatUploadButton": {
"message": "Acest buton apare pe playerul YouTube după ce ați selectat un marcaj de timp și sunteți gata să îl trimiteți."
},
"customServerAddress": {
"message": "Adresa Serverului SponsorBlock"
},
@@ -566,9 +551,6 @@
"downvoteDescription": {
"message": "Timpi Incorecți/Greșiți"
},
"incorrectCategory": {
"message": "Categorie Greșită"
},
"nonMusicCategoryOnMusic": {
"message": "Acest videoclip este categorisit ca muzică. Ești sigur ca există un sponsor? Dacă acesta este defapt un segment non-muzical, deschideți opțiunile extensiei și activați această categorie. Apoi, puteți trimite acest segment ca non-muzical în loc de sponsol. Vă rugăm să citiți ghidul dacă sunteți confuz."
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Пропустить"
},
"unmute": {
"message": "Включить звук"
},
"paused": {
"message": "Пауза"
},
@@ -59,10 +62,10 @@
"message": "Таймер остановлен"
},
"confirmMSG": {
"message": "Чтобы изменить или удалить отдельные значения, нажмите кнопку «Информация» или откройте всплывающее окно расширения, щелкнув значок расширения в правом верхнем углу."
"message": "Чтобы изменить или удалить отдельные значения, нажмите кнопку «Информация» или откройте всплывающее окно расширения, щелкнув на значок расширения в правом верхнем углу."
},
"clearThis": {
"message": "Вы уверены, что хотите удалить эту информацию?\n\n"
"message": "Вы уверены, что хотите это удалить?\n\n"
},
"Unknown": {
"message": "При отправке сегмента произошла ошибка. Попытайтесь отправить его позже."
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Ошибка соединения. Код ошибки: "
},
"wantToSubmit": {
"message": "Вы хотите отправить сегменты для видео с id"
},
"clearTimes": {
"message": "Очистить сегменты"
},
@@ -116,7 +116,7 @@
"message": "Отправить сегменты"
},
"submitCheck": {
"message": "Вы уверены, что хотите отправить эту информацию?"
"message": "Вы уверены, что хотите это отправить?"
},
"whitelistChannel": {
"message": "Добавить канал в белый список"
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Эта настройка скрывает кнопки для отправки сегментов, расположенные в плеере YouTube."
},
"showSkipButton": {
"message": "Не скрывать кнопку \"Пропустить до важного\" в плеере YouTube"
},
"showInfoButton": {
"message": "Показывать кнопку информации в плеере YouTube"
},
"hideInfoButton": {
"message": "Скрыть кнопку информации в плеере YouTube"
},
"whatInfoButton": {
"message": "Эта кнопка открывает всплывающее окно на странице YouTube."
},
"autoHideInfoButton": {
"message": "Автоматически скрывать кнопку Информация"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Показывать кнопку удаления в плеере YouTube"
},
"whatDeleteButton": {
"message": "Эта кнопка позволяет Вам очистить все неотправленные сегменты в плеере YouTube для текущего видео."
},
"enableViewTracking": {
"message": "Включить отслеживание количества пропусков сегментов"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,7 @@
"message": "Импорт/Экспорт Вашего идентификатора пользователя"
},
"whatChangeUserID": {
"message": "Его нужно держать в секрете. Это как пароль, не стоит им ни с кем делиться. Если он у кого-то есть, он сможет выдать себя за Вас."
"message": "Держите его в тайне. Относитесь к нему как к паролю и не передавайте никому. Если кто-то им завладеет, то сможет выдать себя за вас. Если вы ищете публичный ID пользователя, нажмите значок буфера обмена во всплывающем окне."
},
"setUserID": {
"message": "Установить идентификатор пользователя"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Показывать кнопку отправки"
},
"whatUploadButton": {
"message": "Эта кнопка появляется в плеере YouTube после того, как Вы выбрали отметку времени и готовы к отправке."
},
"customServerAddress": {
"message": "Адрес сервера SponsorBlock"
},
@@ -604,6 +608,9 @@
"autoSkipOnMusicVideos": {
"message": "Пропускать все сегменты автоматически при наличии сегмента без музыки"
},
"muteSegments": {
"message": "Разрешить сегменты, которые отключают звук вместо пропуска"
},
"colorFormatIncorrect": {
"message": "Вы ввели цвет в неправильном формате. Это должно быть 3-х или 6-ти значное шестнадцатеричное число с символом # в начале."
},
@@ -643,6 +650,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": "Вы должны выбрать категорию для всех сегментов, которые вы отправляете!"
},
@@ -690,7 +700,7 @@
"message": "Не нужен/неверно указано время"
},
"incorrectCategory": {
"message": "Неверная категория"
"message": "Изменить категорию"
},
"nonMusicCategoryOnMusic": {
"message": "Это видео классифицировано как музыкальное. Вы уверены, что в нём есть спонсоры? Если на самом деле это \"Сегмент без музыки\", откройте параметры расширения и включите эту категорию. Затем вы можете отправить этот сегмент как \"Без музыки\", а не как спонсора. Пожалуйста, прочтите руководство, если вы запутались."
@@ -726,7 +736,7 @@
"message": "Скрыть навсегда"
},
"warningChatInfo": {
"message": "Вы получили предупреждение и временно не можете отправлять сегменты. Мы заметили, что вы совершали распространенные ошибки, которые не являются злонамеренными, и просто хотим уточнить для вас правила. Вы также можете присоединиться к нашему чату, используя discord.gg/SponsorBlock или matrix.to/#/+sponsor:ajay.app"
"message": "Вы получили предупреждение и временно не можете отправлять сегменты. Мы заметили, что вы совершали распространенные ошибки, которые не были злонамеренными. Пожалуйста, подтвердите, что вы прочитали правила и предупреждение будет удалено. Вы также можете присоединиться к нашему чату, используя discord.gg/SponsorBlock или matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Голосование отклонено из-за предупреждения. Нажмите, чтобы открыть чат, где вы можете решить проблему, или вернитесь, когда у вас будет время.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Узнать больше"
},
"CopyDownvoteButtonInfo": {
"message": "Голосует против и создаёт локальную копию сегмента для повторной отправки"
},
"OpenCategoryWikiPage": {
"message": "Открыть вики-страницу этой категории."
},
"CopyAndDownvote": {
"message": "Скопировать и проголосовать против"
},
"ContinueVoting": {
"message": "Продолжить голосование"
},
"ChangeCategoryTooltip": {
"message": "Это мгновенно применится к вашим сегментам"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Наведите курсор на поле редактирования и используйте колесо мыши для быстрой настройки времени. Клавиши Ctrl или Shift могут быть использованы для точной настройки."
}
}

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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Skryje tlačidlá pre preskočenie segmentov, ktoré sa zobrazujú v YouTube prehrávači."
},
"showSkipButton": {
"message": "Zobrazovať tlačidlo preskočiť na hlavný obsah videa"
},
"showInfoButton": {
"message": "Zobraziť info tlačidlo v YouTube prehrávači"
},
"hideInfoButton": {
"message": "Skryť info tlačidlo v YouTube prehrávači"
},
"whatInfoButton": {
"message": "Toto tlačidlo zobrazí vyskakovacie okno na YouTube stránke."
},
"autoHideInfoButton": {
"message": "Automaticky skryť tlačidlo Info"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Zobraziť tlačidlo Zmazať v YouTube prehrávači"
},
"whatDeleteButton": {
"message": "Toto tlačidlo v YouTube prehrávači zmaže všetky ešte neodoslané segmenty v aktuálnom videu."
},
"enableViewTracking": {
"message": "Zapnúť počítanie preskočení"
},
@@ -230,6 +227,21 @@
"showSkipNotice": {
"message": "Zobraziť upozornenie pri preskočení segmentu"
},
"noticeVisibilityMode0": {
"message": "Veľké upozornenia o preskočení"
},
"noticeVisibilityMode1": {
"message": "Malé upozornenia o automatickom preskočení"
},
"noticeVisibilityMode2": {
"message": "Malé upozornenia o všetkých preskočeniach"
},
"noticeVisibilityMode3": {
"message": "Priehľadné upozornenia o automatickom preskočení"
},
"noticeVisibilityMode4": {
"message": "Priehľadné upozornenia o všetkých preskočeniach"
},
"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."
@@ -287,9 +299,15 @@
"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)"
@@ -298,6 +316,10 @@
"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)"
@@ -351,7 +373,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"
@@ -417,9 +439,6 @@
"showUploadButton": {
"message": "Ukázať Nahrávacie Tlačidlo"
},
"whatUploadButton": {
"message": "Toto tlačidlo sa zobrazí v YouTube prehrávači po tom ako označíte začiatok a koniec segmentu na odoslanie."
},
"customServerAddress": {
"message": "Adresa serveru SponsorBlock"
},
@@ -589,6 +608,9 @@
"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."
},
@@ -628,6 +650,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!"
},
@@ -674,9 +699,6 @@
"downvoteDescription": {
"message": "Nesprávne/Zlé načasovanie"
},
"incorrectCategory": {
"message": "Nesprávna kategória"
},
"nonMusicCategoryOnMusic": {
"message": "Toto video je kategorizované ako hudobné. Ste si istý, že obsahuje sponzora? Ak sa skutočne jedná o časť bez hudby, otvorte možnosti rozšírenia a povoľte túto kategóriu. Potom môžete tento segment uložiť ako kategóriu \"Bez hudby\" namiesto sponzora. Ak si neviete rady, tak si prosím prečítajte pravidlá."
},
@@ -711,7 +733,7 @@
"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á a potom Vám to varovanie odoberieme. Môžete sa pripojiť do konverzácie pomocou discord.gg/SponsorBlock alebo matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Hlasovanie bolo zamietnuté kvôli varovaniu. Kliknite pre otvorenie chatu, aby ste ho vyriešili, alebo sa vráťte až budete mať čas.",
@@ -785,5 +807,8 @@
},
"LearnMore": {
"message": "Zistiť viac"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Čas môžete rýchlo zmeniť kolieskom myši, ak je kurozor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift."
}
}

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"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Detta döljer knapparna på YouTube-spelaren som du kan skicka in segment med som ska hoppas över."
},
"showSkipButton": {
"message": "Behåll knappen hoppa till markerat på spelaren"
},
"showInfoButton": {
"message": "Visa Infoknapp På YouTube-spelaren"
},
"hideInfoButton": {
"message": "Dölj Infoknapp På YouTube-spelaren"
},
"whatInfoButton": {
"message": "Detta är knappen som öppnar popup-rutan på YouTube-sidan."
},
"autoHideInfoButton": {
"message": "Dölj informationsknappen automatiskt"
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Visa knappen ta bort på YouTube-spelaren"
},
"whatDeleteButton": {
"message": "Den här knappen på YouTube-spelaren rensar bort alla segment som ej har skickats in på aktuell video."
},
"enableViewTracking": {
"message": "Aktivera spåra antalet hoppa över"
},
@@ -302,9 +299,15 @@
"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)"
@@ -313,6 +316,10 @@
"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)"
@@ -366,7 +373,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"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Visa uppladdningsknapp"
},
"whatUploadButton": {
"message": "Denna knapp visas på YouTube-spelaren efter att du har valt en tidpunkt och är redo att rapportera."
},
"customServerAddress": {
"message": "Serveradress för SponsorBlock"
},
@@ -604,6 +608,9 @@
"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."
},
@@ -643,6 +650,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!"
},
@@ -690,7 +700,7 @@
"message": "Fel/Fel tidsintervall"
},
"incorrectCategory": {
"message": "Fel kategori"
"message": "Ändra kategori"
},
"nonMusicCategoryOnMusic": {
"message": "Den här videon kategoriseras som musik. Är du säker på att denna har en sponsor? Om detta faktiskt är ett \"icke-musiksegment\", öppna tilläggsalternativen och aktivera denna kategori. Då kan du skicka in detta segment som \"icke-musik\" i stället för sponsor. Läs riktlinjerna om något är oklart."
@@ -726,7 +736,7 @@
"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 längre skicka in segment. Vi har upptäckt att du har gjort några vanliga misstag som inte är uppsåtliga. Bekräfta därför att du förstår reglerna, så tar vi bort varningen. 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.",
@@ -800,5 +810,23 @@
},
"LearnMore": {
"message": "Läs mer"
},
"CopyDownvoteButtonInfo": {
"message": "Rösta ner och skapar en lokal kopia för dig att skicka igen"
},
"OpenCategoryWikiPage": {
"message": "Öppna denna kategoris wiki-sida."
},
"CopyAndDownvote": {
"message": "Kopiera och rösta ner"
},
"ContinueVoting": {
"message": "Fortsätt rösta"
},
"ChangeCategoryTooltip": {
"message": "Detta kommer omedelbart att verkställas till dina segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Använd mushjulet medan du håller muspekaren över redigeringsrutan för att snabbt justera tiden. Kombinationer av CTRL- eller SKIFT-tangenten kan användas för att finjustera tiden."
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "ரெஸ்கிப்"
},
"unmute": {
"message": "ஒலியடக்கு"
},
"paused": {
"message": "இடைநிறுத்தப்பட்டது"
},
@@ -79,9 +82,15 @@
"sponsorEnd": {
"message": "பிரிவு இப்போது முடிகிறது"
},
"sponsorCancel": {
"message": "உருவாக்கும் பகுதியை ரத்து செய்"
},
"noVideoID": {
"message": "YouTube வீடியோ எதுவும் கிடைக்கவில்லை.\nஇது தவறாக இருந்தால், தாவலைப் புதுப்பிக்கவும்."
},
"refreshSegments": {
"message": "பிரிவுகளைப் புதுப்பிக்கவும்"
},
"success": {
"message": "வெற்றி!"
},
@@ -94,9 +103,6 @@
"connectionError": {
"message": "இணைப்பு பிழை ஏற்பட்டது. பிழை குறியீடு: "
},
"wantToSubmit": {
"message": "வீடியோ ஐடிக்கு நீங்கள் சமர்ப்பிக்க விரும்புகிறீர்களா"
},
"clearTimes": {
"message": "பிரிவுகளை அழிக்கவும்"
},
@@ -155,6 +161,9 @@
"setUsername": {
"message": "பயனர்பெயரை அமைக்கவும்"
},
"copyPublicID": {
"message": "பொது பயனர் IDயை நகலெடுக்கவும்"
},
"discordAdvert": {
"message": "பரிந்துரைகள் மற்றும் கருத்துக்களை வழங்க அதிகாரப்பூர்வ டிஸ்கார்ட் சேவையகத்தில் சேர வாருங்கள்!"
},
@@ -173,14 +182,17 @@
"hideButtonsDescription": {
"message": "ஸ்கிப் பிரிவுகளைச் சமர்ப்பிக்க YouTube பிளேயரில் தோன்றும் பொத்தான்களை இது மறைக்கிறது."
},
"showSkipButton": {
"message": "பிளேயரில் Skip To Highlight பொத்தானை வைக்கவும்"
},
"showInfoButton": {
"message": "YouTube பிளேயரில் தகவல் பொத்தானைக் காட்டு"
},
"hideInfoButton": {
"message": "YouTube பிளேயரில் தகவல் பொத்தானை மறைக்கவும்"
},
"whatInfoButton": {
"message": "YouTube பக்கத்தில் ஒரு பாப்அப்பைத் திறக்கும் பொத்தான் இது."
"autoHideInfoButton": {
"message": "தகவல் பொத்தானை தானாக மறைக்கும்"
},
"hideDeleteButton": {
"message": "YouTube பிளேயரில் நீக்கு பொத்தானை மறைக்க"
@@ -188,15 +200,15 @@
"showDeleteButton": {
"message": "YouTube பிளேயரில் நீக்கு பொத்தானைக் காட்டு"
},
"whatDeleteButton": {
"message": "இது YouTube பிளேயரில் உள்ள பொத்தானாகும், இது தற்போதைய வீடியோவிற்கு நீங்கள் சமர்ப்பிக்காத அனைத்து பகுதிகளையும் அழிக்கும்."
},
"enableViewTracking": {
"message": "ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கு"
},
"whatViewTracking": {
"message": "இந்த அம்சம் பயனர்கள் தங்கள் சமர்ப்பிப்பு மற்றவர்களுக்கு எவ்வளவு உதவியது மற்றும் ஸ்பேம் தரவுத்தளத்தில் வரவில்லை என்பதை உறுதிப்படுத்த அப்வோட்களுடன் ஒரு மெட்ரிக்காகப் பயன்படுத்தப்படுவதை பயனர்களுக்குத் தெரியப்படுத்த நீங்கள் எந்த பகுதிகளைத் தவிர்த்துவிட்டீர்கள் என்பதைக் கண்காணிக்கிறது. ஒவ்வொரு முறையும் நீங்கள் ஒரு பகுதியைத் தவிர்க்கும்போது நீட்டிப்பு சேவையகத்திற்கு ஒரு செய்தியை அனுப்புகிறது. பார்வை எண்கள் துல்லியமாக இருக்க பெரும்பாலான மக்கள் இந்த அமைப்பை மாற்ற மாட்டார்கள் என்று நம்புகிறோம். :)"
},
"enableViewTrackingInPrivate": {
"message": "தனிப்பட்ட/மறைநிலை தாவல்களில் ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கவும்"
},
"enableQueryByHashPrefix": {
"message": "ஹாஷ் முன்னொட்டு மூலம் வினவல்"
},
@@ -215,6 +227,21 @@
"showSkipNotice": {
"message": "ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"
},
"noticeVisibilityMode0": {
"message": "முழு அளவு தவிர்க்கும் அறிவிப்புகள்"
},
"noticeVisibilityMode1": {
"message": "ஆட்டோ ஸ்கிப்பிற்கான சிறிய ஸ்கிப் அறிவிப்புகள்"
},
"noticeVisibilityMode2": {
"message": "அனைத்து சிறிய தவிர்க்கும் அறிவிப்புகள்"
},
"noticeVisibilityMode3": {
"message": "ஆட்டோ ஸ்கிப்பிற்கான மங்கலான தவிர்க்கும் அறிவிப்புகள்"
},
"noticeVisibilityMode4": {
"message": "அனைத்து மங்கலான தவிர்க்கும் அறிவிப்புகள்"
},
"longDescription": {
"message": "ஸ்பான்சர்கள், அறிமுகங்கள், அவுட்ரோஸ், சந்தா நினைவூட்டல்கள் மற்றும் YouTube வீடியோக்களின் பிற எரிச்சலூட்டும் பகுதிகளைத் தவிர்க்க ஸ்பான்சர் பிளாக் உங்களை அனுமதிக்கிறது. ஸ்பான்சர் பிளாக் என்பது ஒரு கூட்ட நெரிசலான உலாவி நீட்டிப்பாகும், இது ஸ்பான்சர் செய்யப்பட்ட பிரிவுகளின் தொடக்க மற்றும் இறுதி நேரங்களையும் YouTube வீடியோக்களின் பிற பிரிவுகளையும் எவரும் சமர்ப்பிக்கலாம். ஒரு நபர் இந்த தகவலைச் சமர்ப்பித்தவுடன், இந்த நீட்டிப்பு உள்ள மற்றவர்கள் ஸ்பான்சர் செய்யப்பட்ட பிரிவைத் தவிர்த்து விடுவார்கள். இசை வீடியோக்களின் இசை அல்லாத பிரிவுகளையும் நீங்கள் தவிர்க்கலாம்.",
"description": "Full description of the extension on the store pages."
@@ -238,6 +265,9 @@
"setSkipShortcut": {
"message": "ஒரு பகுதியைத் தவிர்ப்பதற்கான விசையை அமைக்கவும்"
},
"setStartSponsorShortcut": {
"message": "துவக்க/நிறுத்த பிரிவு விசைப்பலகைக்கு விசையை அமைக்கவும்"
},
"setSubmitKeybind": {
"message": "சமர்ப்பிக்கும் விசைப்பலகைக்கு விசையை அமைக்கவும்"
},
@@ -269,9 +299,31 @@
"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": "{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": "ஆட்டோ ஸ்கிப்பை முடக்கு"
},
@@ -321,7 +373,7 @@
"message": "உங்கள் பயனர் ஐடியை இறக்குமதி / ஏற்றுமதி செய்யுங்கள்"
},
"whatChangeUserID": {
"message": "இதை தனிப்பட்ட முறையில் வைத்திருக்க வேண்டும். இது கடவுச்சொல் போன்றது மற்றும் யாருடனும் பகிரக்கூடாது. யாராவது இதை வைத்திருந்தால், அவர்கள் உங்களைப் போல ஆள்மாறாட்டம் செய்யலாம்."
"message": "இதை தனிப்பட்டதாக வைத்திருக்க வேண்டும். இது கடவுச்சொல் போன்றது, அதை யாருடனும் பகிரக்கூடாது. யாரிடமாவது இது இருந்தால், அவர் உங்களைப் போல ஆள்மாறாட்டம் செய்யலாம். உங்கள் பொது பயனர் IDயை நீங்கள் தேடுகிறீர்களானால், பாப்அப்பில் உள்ள கிளிப்போர்டு ஐகானைக் கிளிக் செய்யவும்."
},
"setUserID": {
"message": "UserID ஐ அமைக்கவும்"
@@ -335,9 +387,25 @@
"keybindCurrentlySet": {
"message": ". இது தற்போது அமைக்கப்பட்டுள்ளது:"
},
"supportOtherSites": {
"message": "3 வது தரப்பு YouTube-தளங்களை ஆதரிக்கவும்"
},
"supportOtherSitesDescription": {
"message": "மூன்றாம் தரப்பு YouTube தளங்களை ஆதரிக்கவும். ஆதரவை இயக்க, நீங்கள் கூடுதல் அனுமதிகளை ஏற்க வேண்டும். இது Chrome மற்றும் பிற Chromium வகைகளில் தனிப்பட்ட தாவல்களில் வேலை செய்யாது.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "ஆதரிக்கப்படும் தளங்கள்: "
},
"optionsInfo": {
"message": "ஆக்கிரமிப்பு ஆதரவை இயக்கு, ஆட்டோஸ்கிப்பை முடக்கு, பொத்தான்களை மறை மற்றும் பலவற்றை."
},
"addInvidiousInstance": {
"message": "3 வது தரப்பு தளங்களை சேர்க்கவும்"
},
"addInvidiousInstanceDescription": {
"message": "தனிப்பட்ட தளங்களை சேர்க்கவும். இது Domain வடிவமைப்பில் இருக்க வேண்டும். உதாரணம்: invidious.ajay.app"
},
"add": {
"message": "சேர்"
},
@@ -359,15 +427,18 @@
"minDurationDescription": {
"message": "தொகுப்பு மதிப்பை விடக் குறைவான பகுதிகள் தவிர்க்கப்படாது அல்லது பிளேயரில் காண்பிக்கப்படாது."
},
"skipNoticeDuration": {
"message": "அறிவிப்பு காலத்தை தவிர்க்கவும் (வினாடிகள்):"
},
"skipNoticeDurationDescription": {
"message": "தவிர்க்கும் அறிவிப்பு குறைந்தபட்சம் இவ்வளவு நேரம் திரையில் இருக்கும். மேனுவல் ஸ்கிப்பிங்கிற்கு, இது நீண்ட நேரம் தெரியும்."
},
"shortCheck": {
"message": "பின்வரும் சமர்ப்பிப்பு உங்கள் குறைந்தபட்ச கால விருப்பத்தை விட குறைவாக உள்ளது. இது ஏற்கனவே சமர்ப்பிக்கப்பட்டுள்ளது என்பதையும், இந்த விருப்பத்தின் காரணமாக புறக்கணிக்கப்படுவதையும் இது குறிக்கலாம். நீங்கள் சமர்ப்பிக்க விரும்புகிறீர்களா?"
},
"showUploadButton": {
"message": "பதிவேற்ற பொத்தானைக் காட்டு"
},
"whatUploadButton": {
"message": "நீங்கள் நேர முத்திரையைத் தேர்ந்தெடுத்து சமர்ப்பிக்கத் தயாரான பிறகு இந்த பொத்தான் YouTube பிளேயரில் தோன்றும்."
},
"customServerAddress": {
"message": "ஸ்பான்சர் பிளாக் சேவையக முகவரி"
},
@@ -419,6 +490,9 @@
"preview": {
"message": "முன்னோட்ட"
},
"unsubmitted": {
"message": "சமர்ப்பிக்கப்படவில்லை"
},
"inspect": {
"message": "ஆய்வு செய்யுங்கள்"
},
@@ -483,6 +557,12 @@
"category_outro_description": {
"message": "வரவுகளை அல்லது YouTube எண்ட்கார்டுகள் தோன்றும் போது. தகவலுடன் முடிவுகளுக்கு அல்ல."
},
"category_preview": {
"message": "முன்னோட்டம்/மறுபரிசீலனை"
},
"category_preview_description": {
"message": "முந்தைய எபிசோடுகளின் விரைவான மறுபரிசீலனை அல்லது தற்போதைய வீடியோவில் பின்னர் என்ன வரப்போகிறது என்பதற்கான முன்னோட்டம். ஒன்றாக தொகுக்கப்பட்ட கிளிப்புகள், பேசப்பட்ட சுருக்கங்களுக்கு அல்ல."
},
"category_music_offtopic": {
"message": "இசை: இசை அல்லாத பிரிவு"
},
@@ -492,6 +572,12 @@
"category_music_offtopic_short": {
"message": "இசை அல்லாதது"
},
"category_poi_highlight": {
"message": "முன்னிலைப்படுத்த"
},
"category_poi_highlight_description": {
"message": "பெரும்பாலான மக்கள் தேடும் வீடியோவின் பகுதி. \"வீடியோ x இல் தொடங்குகிறது\" போன்றது."
},
"category_livestream_messages": {
"message": "லைவ்ஸ்ட்ரீம்: நன்கொடை / செய்தி அளவீடுகள்"
},
@@ -569,9 +655,6 @@
"downvoteDescription": {
"message": "தவறான / தவறான நேரம்"
},
"incorrectCategory": {
"message": "தவறான வகை"
},
"nonMusicCategoryOnMusic": {
"message": "இந்த வீடியோ இசை என வகைப்படுத்தப்பட்டுள்ளது. இதற்கு ஒரு ஸ்பான்சர் இருப்பதை நீங்கள் உறுதியாக நம்புகிறீர்களா? இது உண்மையில் \"இசை அல்லாத பிரிவு\" என்றால், நீட்டிப்பு விருப்பங்களைத் திறந்து இந்த வகையை இயக்கவும். பின்னர், நீங்கள் இந்த பகுதியை ஸ்பான்சருக்கு பதிலாக \"இசை அல்லாதது\" என்று சமர்ப்பிக்கலாம். நீங்கள் குழப்பமாக இருந்தால் வழிகாட்டுதல்களைப் படிக்கவும்."
},

View File

@@ -94,9 +94,6 @@
"connectionError": {
"message": "కనెక్షన్ లోపం సంభవించింది. లోపం కోడ్: "
},
"wantToSubmit": {
"message": "మీరు వీడియో ఐడి కోసం సమర్పించాలనుకుంటున్నారా"
},
"clearTimes": {
"message": "విభాగాలను క్లియర్ చేయండి"
},
@@ -179,18 +176,12 @@
"hideInfoButton": {
"message": "YouTube ప్లేయర్‌లో సమాచారం బటన్‌ను దాచండి"
},
"whatInfoButton": {
"message": "ఇది YouTube పేజీలో పాపప్‌ను తెరిచే బటన్."
},
"hideDeleteButton": {
"message": "YouTube ప్లేయర్‌లో తొలగించు బటన్‌ను దాచండి"
},
"showDeleteButton": {
"message": "YouTube ప్లేయర్‌లో తొలగించు బటన్‌ను చూపించు"
},
"whatDeleteButton": {
"message": "ఇది YouTube ప్లేయర్‌లోని బటన్, ఇది ప్రస్తుత వీడియో కోసం మీరు సమర్పించని అన్ని విభాగాలను క్లియర్ చేస్తుంది."
},
"enableViewTracking": {
"message": "స్కిప్ కౌంట్ ట్రాకింగ్‌ను ప్రారంభించండి"
},
@@ -320,9 +311,6 @@
"changeUserID": {
"message": "మీ యూజర్‌ఐడిని దిగుమతి / ఎగుమతి చేయండి"
},
"whatChangeUserID": {
"message": "దీన్ని ప్రైవేట్‌గా ఉంచాలి. ఇది పాస్‌వర్డ్ లాంటిది మరియు ఎవరితోనూ భాగస్వామ్యం చేయకూడదు. ఎవరైనా దీన్ని కలిగి ఉంటే, వారు మిమ్మల్ని వంచించగలరు."
},
"setUserID": {
"message": "UserID ని సెట్ చేయండి"
},
@@ -365,9 +353,6 @@
"showUploadButton": {
"message": "అప్‌లోడ్ బటన్ చూపించు"
},
"whatUploadButton": {
"message": "మీరు టైమ్‌స్టాంప్‌ను ఎంచుకుని సమర్పించడానికి సిద్ధంగా ఉన్న తర్వాత ఈ బటన్ YouTube ప్లేయర్‌లో కనిపిస్తుంది."
},
"customServerAddress": {
"message": "స్పాన్సర్బ్లాక్ సర్వర్ చిరునామా"
},
@@ -569,9 +554,6 @@
"downvoteDescription": {
"message": "తప్పు / తప్పు సమయం"
},
"incorrectCategory": {
"message": "తప్పు వర్గం"
},
"nonMusicCategoryOnMusic": {
"message": "ఈ వీడియోను సంగీతంగా వర్గీకరించారు. దీనికి స్పాన్సర్ ఉందని మీరు ఖచ్చితంగా అనుకుంటున్నారా? ఇది వాస్తవానికి \"నాన్-మ్యూజిక్ సెగ్మెంట్\" అయితే, పొడిగింపు ఎంపికలను తెరిచి ఈ వర్గాన్ని ప్రారంభించండి. అప్పుడు, మీరు ఈ విభాగాన్ని స్పాన్సర్‌కు బదులుగా \"నాన్-మ్యూజిక్\" గా సమర్పించవచ్చు. మీరు గందరగోళంలో ఉంటే దయచేసి మార్గదర్శకాలను చదవండి."
},

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!"
},
@@ -185,9 +188,6 @@
"hideInfoButton": {
"message": "YouTube Oynatıcısındaki Bilgi Butonunu Gizle"
},
"whatInfoButton": {
"message": "Bu, YouTube sayfasında açılan pencereyi açan butondur."
},
"autoHideInfoButton": {
"message": "Bilgi düğmesini otomatik gizle"
},
@@ -197,9 +197,6 @@
"showDeleteButton": {
"message": "YouTube Oynatıcısında Silme Tuşunu Göster"
},
"whatDeleteButton": {
"message": "Bu, YouTube oynatıcısındaki mevcut video için gönderilmemiş bölümleri temizleyen butondur."
},
"enableViewTracking": {
"message": "Kısım Atlama Sayaç Takibine İzin Ver"
},
@@ -227,6 +224,15 @@
"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."
@@ -284,9 +290,15 @@
"skip": {
"message": "Atla"
},
"mute": {
"message": "Sustur"
},
"skip_category": {
"message": "{0} atla?"
},
"mute_category": {
"message": "{0} susturulsun mu?"
},
"skip_to_category": {
"message": "{0} kısmına atlansın mı?",
"description": "Used for skipping to things (Skip to Highlight)"
@@ -295,6 +307,10 @@
"message": "{0} Atlandı",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} susturuldu",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "{0} kısmına atlandı",
"description": "Used for skipping to things (Skipped to Highlight)"
@@ -348,7 +364,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"
@@ -414,9 +430,6 @@
"showUploadButton": {
"message": "Karşıya Yükleme Butonunu Göster"
},
"whatUploadButton": {
"message": "Bu buton, YouTube oynatıcısında bir zaman seçtiğiniz ve göndermeye hazır olduğunuzda gözükür."
},
"customServerAddress": {
"message": "SponsorBlock Sunucu Adresi"
},
@@ -550,6 +563,12 @@
"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"
},
@@ -580,6 +599,9 @@
"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."
},
@@ -619,6 +641,9 @@
"message": "\"{0}\" kategorisinde bir kısım göndermek için onu ayarlardan açmalısınız. Ayarlara yönlendiriliyorsunuz.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Uyarı: Bu tür kısımlardan sadece bir adet etkin olabilir. Birden fazla gönderdiğinizde onlardan rastgele biri gösterilir."
},
"youMustSelectACategory": {
"message": "Göndereceğin tüm kısımlar için bir kategori seçmelisin!"
},
@@ -665,9 +690,6 @@
"downvoteDescription": {
"message": "Hatalı/Yanlış Zaman"
},
"incorrectCategory": {
"message": "Yanlış Kategori"
},
"nonMusicCategoryOnMusic": {
"message": "Bu video müzik olarak sınıflandırılmıştır. Bunun bir sponsor olduğundan emin misin? Bu aslında bir \"Müzik Dışı bölüm\" ise, uzantı seçeneklerini açın ve bu kategoriyi etkinleştirin. Ardından, bu kısmı sponsor yerine \"Müzik Olmayan\" olarak gönderebilirsiniz. Kafanız karıştıysa lütfen yönergeleri okuyun."
},
@@ -690,6 +712,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."
@@ -697,11 +723,65 @@
"hideForever": {
"message": "Asla gösterme"
},
"warningChatInfo": {
"message": "Bir uyarı aldınız ve geçici bir süreliğine kısım gönderemeyeceksiniz. Sizin kısım göndermede zararlı olmayan bazı hatalar yaptığınızı belirledik ve size kurallarıı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"
},
"helpPageHowSkippingWorks1": {
"message": "Video kısımları veri tabanında mevcut ise otomatikman atlanır. Eklentinin simgesine tıklayınca açılan pencereden, video için mevcut olan kısımları görebilirsiniz."
},
"helpPageHowSkippingWorks2": {
"message": "Bir kısmı atladığınızda size bildirim gönderilir. Eğer kısım hatalıysa bunu eksi oylayınız. Eklentinin penceresinde de oy verebilirsiniz."
},
"Submitting": {
"message": "Gönderme"
},
"Editing": {
"message": "Düzenleme"
},
"helpPageEditing1": {
"message": "Eğer kısımlarda hata yaptıysanız, yukarı ok işareti olan düğmeye tıkladıktan sonra kısımları silebilir veya düzeltebilirsiniz."
},
"helpPageTooSlow": {
"message": "Bu fazla yavaş"
},
"helpPageCopyOfDatabase": {
"message": "Veri tabanının bir kopyasını alabilir miyim? Bir gün ortadan kaybolursanız ne olacak?"
},
"helpPageCopyOfDatabase1": {
"message": "Veri tabanı herkese açıktır ve şuradan erişilebilir: "
},
"helpPageCopyOfDatabase2": {
"message": "Kaynak koduna serbestçe erişilebilir. Ben bir gün bu dünyada yalan olsam dahi, sizin gönderdiğiniz kısımlar kaybolmayacak."
},
"helpPageSourceCode": {
"message": "Kaynak koduna nereden ulaşabilirim?"
},
"Credits": {
"message": "Emeği Geçenler"
},
"highlightNewFeature": {
"message": "Yeni! \"Vurgu\" kategorisi sayesinde tek tıkla videonun asıl yerine gidebilirsiniz"
},
"LearnMore": {
"message": "Dahasını Öğren"
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Пропустити"
},
"unmute": {
"message": "Увімкнути звук"
},
"paused": {
"message": "Пауза"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "Помилка з'єднання. Код помилки: "
},
"wantToSubmit": {
"message": "Ви хочете надіслати сегменти для відео з id"
},
"clearTimes": {
"message": "Очистити сегменти"
},
@@ -182,15 +182,15 @@
"hideButtonsDescription": {
"message": "Це налаштування приховує кнопки для надсилання спонсорських вставок, які з'являються в плеєрі YouTube."
},
"showSkipButton": {
"message": "Залишати кнопку \"Перейти до Основне\" на плеєрі"
},
"showInfoButton": {
"message": "Показувати кнопку інформації в плеєрі YouTube"
},
"hideInfoButton": {
"message": "Приховати кнопку інформації в плеєрі YouTube"
},
"whatInfoButton": {
"message": "Ця кнопка відкриває спливаюче вікно на сторінці YouTube."
},
"autoHideInfoButton": {
"message": "Кнопка \"Автоматично сховати інформацію\""
},
@@ -200,9 +200,6 @@
"showDeleteButton": {
"message": "Показувати кнопку видалення в плеєрі YouTube"
},
"whatDeleteButton": {
"message": "Ця кнопка дозволяє очистити всі спонсорські вставки в плеєрі YouTube."
},
"enableViewTracking": {
"message": "Увімкнути відстеження кількості пропусків сегментів"
},
@@ -302,17 +299,27 @@
"skip": {
"message": "Пропустити"
},
"mute": {
"message": "Вимкнути звук"
},
"skip_category": {
"message": "Пропустити {0}?"
},
"mute_category": {
"message": "Вимкнути звук {0}?"
},
"skip_to_category": {
"message": "Пропустить до {0}?",
"message": "Пропустити до {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} Пропущено",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Вимкнений звук",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Пропущено до {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
@@ -366,7 +373,7 @@
"message": "Імпортувати/Експортувати Ваш ідентифікатор користувача"
},
"whatChangeUserID": {
"message": "Це потрібно тримати в секреті. Це як пароль, не варто ним ні з ким ділитися. Якщо він у кого-то є, він зможе видати себе за Вас."
"message": "Тримайте його в таємниці. Ставтеся до нього як до паролю і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний ID користувача, натисніть значок буфера обміну у спливаючому вікні."
},
"setUserID": {
"message": "Встановити ідентифікатор користувача"
@@ -432,9 +439,6 @@
"showUploadButton": {
"message": "Показувати кнопку надсилання"
},
"whatUploadButton": {
"message": "Ця кнопка з'являється в плеєрі YouTube після того, як Ви вибрали позначку часу і готові до надсилання."
},
"customServerAddress": {
"message": "Адреса сервера SponsorBlock"
},
@@ -569,10 +573,10 @@
"message": "Без музики"
},
"category_poi_highlight": {
"message": "Основные"
"message": "Основне"
},
"category_poi_highlight_description": {
"message": "Часть видео, которую ищут большинство людей. Аналогично комментарию «Видео начинается с X:XX»."
"message": "Частина відео яку шукає більшість людей (Аналогічно коментарю \"Відео починається з Х:ХХ\")."
},
"category_livestream_messages": {
"message": "Прямі трансляції: пожертвування/читання повідомлення"
@@ -587,23 +591,26 @@
"message": "Пропуск вручну"
},
"showOverlay": {
"message": "Показувати в смузі прокрутки"
"message": "Показувати в смузі перемотування"
},
"disable": {
"message": "Вимкнути"
},
"autoSkip_POI": {
"message": "Автоматический переход к началу"
"message": "Автоматично перейти до початку"
},
"manualSkip_POI": {
"message": "Спросите, когда видео загружается"
"message": "Спитати поки відео завантажується"
},
"showOverlay_POI": {
"message": "Показать на панели поиска"
"message": "Показати в смузі перемотування"
},
"autoSkipOnMusicVideos": {
"message": "Автоматично пропустити усі сегменти, якщо присутній сегмент без музики"
},
"muteSegments": {
"message": "Дозволити сегменти, які відключають звук замість пропуску"
},
"colorFormatIncorrect": {
"message": "Ви ввели колір в неправильному форматі. Це повинно бути 3-х або 6-ти значне шістнадцяткове число з символом # на початку."
},
@@ -643,6 +650,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": "Ви повинні обрати категорію для всіх сегментів, які ви відправляєте!"
},
@@ -690,7 +700,7 @@
"message": "Невірно вказано час"
},
"incorrectCategory": {
"message": "Невірна категорія"
"message": "Змінити категорію"
},
"nonMusicCategoryOnMusic": {
"message": "Це відео класифіковано як музичне. Ви впевнені, що в ньому є спонсори? Якщо насправді це \"Сегмент без музики\", відкрийте параметри розширення і увімкніть цю категорію. Потім ви можете надіслати цей сегмент як \"Без музики\", а не як спонсора. Будь ласка, прочитайте керівництво, якщо ви заплуталися."
@@ -726,7 +736,7 @@
"message": "Сховати назавжди"
},
"warningChatInfo": {
"message": "Ви отримали попередження, тому тимчасово не можете обирати сегменти. Це означає, що ми помітили, що ви робили кілька поширених помилок, які не є злісними. Тому ми хочемо нагадати вам правила. Ви можете приєднатися до чату з правилами використовуючи discord.gg/SponsorBlock або matrix.to/#/+sponsor:ajay.app"
"message": "Ви отримали попередження, тому тимчасово не можете надсилати сегменти. Це означає, що ми помітили, що ви робили кілька поширених помилок не маючи шкідливих намірів. Будь ласка просто підтвердьте, що ви розумієте правила, і ми приберемо попередження. Ви також можете приєднатися до чату з правилами використовуючи discord.gg/SponsorBlock or matrix.to/#/#sponsor:ajay.app"
},
"voteRejectedWarning": {
"message": "Голосування відхилено через попередження. Натисніть, щоб відкрити чат для вирішення цієї проблеми, або поверніться пізніше.",
@@ -800,5 +810,8 @@
},
"LearnMore": {
"message": "Дізнатися більше"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін."
}
}

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "Bỏ qua lại"
},
"unmute": {
"message": "Bật tiếng"
},
"paused": {
"message": "Tạm dừng"
},
@@ -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!"
},
@@ -179,15 +182,15 @@
"hideButtonsDescription": {
"message": "Không hiển thị nút trên trình chạy video Youtube để đăng đoạn quảng cáo."
},
"showSkipButton": {
"message": "Giữ nút bỏ qua Highlight trên trình phát player"
},
"showInfoButton": {
"message": "Hiển thị nút thông tin trên trình chạy video Youtube"
},
"hideInfoButton": {
"message": "Không hiển thị nút thông tin trên trình chạy video Youtube"
},
"whatInfoButton": {
"message": "Đây là nút để mở bảng popup trên trang Youtube."
},
"autoHideInfoButton": {
"message": "Tự động ẩn nút Info"
},
@@ -197,9 +200,6 @@
"showDeleteButton": {
"message": "Hiển thị nút xóa trên trình chạy video Youtube"
},
"whatDeleteButton": {
"message": "Đây là nút trên trình chạy video Youtube để xóa tất cả những đoạn quảng cáo chưa đăng của bạn trong video đang xem."
},
"enableViewTracking": {
"message": "Bật tính năng theo dõi số quảng cáo được bỏ qua"
},
@@ -299,9 +299,20 @@
"skip": {
"message": "Bỏ qua"
},
"mute": {
"message": "Ngắt tiếng"
},
"skip_category": {
"message": "Bỏ qua {0}?"
},
"skipped": {
"message": "{0} đã bỏ qua",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} đã ngắt tiếng (Muted)",
"description": "Example: Sponsor Muted"
},
"disableAutoSkip": {
"message": "Tắt tự động bỏ qua"
},
@@ -351,7 +362,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"
@@ -417,9 +428,6 @@
"showUploadButton": {
"message": "Hiển thị nút tải lên"
},
"whatUploadButton": {
"message": "Nút này xuất hiện trên trình chạy video Youtube sau khi bạn chọn mốc thời gian và sẵn sàng đăng đoạn quảng cáo."
},
"customServerAddress": {
"message": "Địa chỉ máy chủ SponsorBlock"
},
@@ -553,6 +561,12 @@
"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"
},
@@ -571,9 +585,21 @@
"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."
},
@@ -613,6 +639,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!"
},
@@ -659,14 +688,11 @@
"downvoteDescription": {
"message": "Phân đoạn sai / không đúng"
},
"incorrectCategory": {
"message": "Sai thể loại"
},
"nonMusicCategoryOnMusic": {
"message": "Video này đã được phân loại là âm nhạc. Bạn có chắc đây là quảng cáo nhà tài trợ không? Nếu đây là phân đoạn \"Không phải nhạc\", hãy mở Cài đặt tiện ích và bật lựa chọn đó. Rồi bạn có thể đăng tải phân đoạn lên dưới danh mục \"Không phải nhạc\" thay vì \"Quảng cáo nhà tài trợ\". Hãy đọc Hướng dẫn nếu bạn vẫn còn vướng mắc"
},
"multipleSegments": {
"message": "Nhiều đoạn"
"message": "Nhiều phân đoạn"
},
"guidelines": {
"message": "Hướng dẫn"
@@ -684,6 +710,10 @@
"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."
@@ -692,19 +722,79 @@
"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."
"message": "Bạn đã nhận được một cảnh báo 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 phân đoạn 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 đó để giúp bạn không mắc lỗi trong tương lai. 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."
},
"Submitting": {
"message": "Gửi lên"
},
"helpPageSubmitting1": {
"message": "Việc gửi một phân đoạn mới có thể được thực hiện trong cửa sổ bật lên bằng cách nhấn vào nút \"Đoạn quảng cáo bắt đầu vào lúc này\" hoặc trong trình phát video bằng các nút trên thanh trình phát."
},
"helpPageSubmitting2": {
"message": "Bạn nhấp 1 lần vào nút \"Đoạn quảng cáo bắt đầu vào lúc này\" để bắt đầu 1 phân đoạn, nhấn 2 lần để đánh dấu kết thúc phân đoạn đó. Bạn có thể chuẩn bị nhiều phân đoạn trước khi nhấn gửi. Nhấp vào nút \"Đăng đoạn quảng cáo\" sẽ gửi. Nhấp vào nút \"Xoá đoạn quảng cáo\" để xóa."
},
"Editing": {
"message": "Chỉnh sửa"
},
"helpPageEditing1": {
"message": "Nếu bạn muốn chỉnh sửa thời gian phân đoạn hoặc kiểu của phân đoạn, bạn có thể chỉnh sửa hoặc xóa các phân đoạn của mình sau khi nhấp vào nút \"Đăng đoạn quảng cáo\"."
},
"helpPageTooSlow": {
"message": "Quá chậm"
"message": "Nếu như bạn cảm thấy thao tác ở trên quá chậm..."
},
"helpPageTooSlow1": {
"message": "Bạn có thể sử dụng các hotkeys - phím nóng. Nhấn phím dấu chấm phẩy (;) để chỉ ra điểm bắt đầu / kết thúc của phân đoạn nhà tài trợ và nhấp vào dấu nháy đơn (') để gửi. Nếu bạn không sử dụng QWERTY, có lẽ bạn nên thay đổi keybinding bằng cách vào phần cài đặt của tiện ích."
},
"helpPageCopyOfDatabase": {
"message": "Tôi có thể lấy bản sao của database không? Điều gì xảy ra nếu có chuyện tệ (server chết, chủ nhân trang web mất, ...)?"
},
"helpPageCopyOfDatabase1": {
"message": "Database được công khai và luôn có sẵn tại "
},
"helpPageCopyOfDatabase2": {
"message": "Mã nguồn mở cũng luôn có sẵn. Vì vậy, ngay cả khi có điều gì đó tệ, các phân đoạn cũng sẽ không biến mất."
},
"helpPageNews": {
"message": "Tôi có thể cập nhật tin tức ở đâu?"
},
"helpPageSourceCode": {
"message": "Bạn có thể tìm thấy source code ở đâu?"
},
"Credits": {
"message": "Lời cảm ơn đến"
},
"highlightNewFeature": {
"message": "Tính năng mới! Đi đến đoạn quan trọng của video chỉ với 1 cú click với dạng phân đoạn Highlight"
},
"LearnMore": {
"message": "Tìm hiểu thêm"
}
}

View File

@@ -97,9 +97,6 @@
"connectionError": {
"message": "连接错误。错误代码: "
},
"wantToSubmit": {
"message": "您是否想为以下视频 ID 提交:"
},
"clearTimes": {
"message": "清除片段"
},
@@ -182,18 +179,12 @@
"hideInfoButton": {
"message": "在 Youtube 播放器上隐藏信息按钮"
},
"whatInfoButton": {
"message": "此按钮用于在 Youtube 页面中打开弹窗。"
},
"hideDeleteButton": {
"message": "在 Youtube 播放器上隐藏删除按钮"
},
"showDeleteButton": {
"message": "在 Youtube 播放器上显示删除按钮"
},
"whatDeleteButton": {
"message": "此按钮用于在 Youtube 播放器中清除所有赞助商广告。"
},
"enableViewTracking": {
"message": "启用跳过次数统计跟踪"
},
@@ -323,9 +314,6 @@
"changeUserID": {
"message": "导入/导出您的用户 ID"
},
"whatChangeUserID": {
"message": "这应该被保密。这就像一个密码,且不应该告诉任何人。如果有人拥有它,他就可以冒充您。"
},
"setUserID": {
"message": "设定用户 ID"
},
@@ -371,9 +359,6 @@
"showUploadButton": {
"message": "显示上传按钮"
},
"whatUploadButton": {
"message": "在您选择了时间并准备提交后,此按钮会出现在 Youtube 播放器中。"
},
"customServerAddress": {
"message": "SponsorBlock 服务器地址"
},
@@ -581,9 +566,6 @@
"downvoteDescription": {
"message": "不正确/错误的时间"
},
"incorrectCategory": {
"message": "错误的类别"
},
"nonMusicCategoryOnMusic": {
"message": "此视频的分类为音乐。 您确定其中包含赞助商广告吗?如果这是“非音乐片段”,请打开扩展选项并启用此类别。 之后,您可以以“非音乐”而不是赞助商广告类别提交此片段。如果您不太明白,请阅读指南。"
},

View File

@@ -52,6 +52,9 @@
"reskip": {
"message": "繼續跳過"
},
"unmute": {
"message": "解除靜音"
},
"paused": {
"message": "已暫停"
},
@@ -100,9 +103,6 @@
"connectionError": {
"message": "已發生連線錯誤。錯誤碼: "
},
"wantToSubmit": {
"message": "您想為這個影片ID提交嗎"
},
"clearTimes": {
"message": "清除片段"
},
@@ -185,9 +185,6 @@
"hideInfoButton": {
"message": "在 YouTube 播放器上隱藏資訊按鈕"
},
"whatInfoButton": {
"message": "這個按鈕可用來在 YouTube 頁面打開彈出視窗"
},
"autoHideInfoButton": {
"message": "自動隱藏資訊按鈕"
},
@@ -197,9 +194,6 @@
"showDeleteButton": {
"message": "在 YouTube 播放器上顯示刪除按鈕"
},
"whatDeleteButton": {
"message": "這個按鈕可用來在 YouTube 播放器清除所有未提交的片段"
},
"enableViewTracking": {
"message": "啟用跳過次數追蹤"
},
@@ -335,9 +329,6 @@
"changeUserID": {
"message": "匯入/匯出您的使用者 ID"
},
"whatChangeUserID": {
"message": "這應該被保密。這就像一個密碼,不應該與他人分享。如果有人擁有它,他們就可以冒充您。"
},
"setUserID": {
"message": "設定使用者 ID"
},
@@ -399,9 +390,6 @@
"showUploadButton": {
"message": "顯示上傳按鈕"
},
"whatUploadButton": {
"message": "在您選擇了時間範圍並準備提交後,此按鈕會出現在 YouTube 播放器中。"
},
"customServerAddress": {
"message": "SponsorBlock 伺服器地址"
},
@@ -535,6 +523,9 @@
"category_music_offtopic_short": {
"message": "非音樂"
},
"category_poi_highlight": {
"message": "重點"
},
"category_livestream_messages": {
"message": "直播:捐贈/訊息閱讀"
},
@@ -641,9 +632,6 @@
"downvoteDescription": {
"message": "不正確/錯誤的時間"
},
"incorrectCategory": {
"message": "錯誤的類別"
},
"nonMusicCategoryOnMusic": {
"message": "這個影片被分類為音樂。您確定這有贊助內容嗎?如果這其實是\"非音樂片段\"的話,開啟擴充功能設定並啟用這個類別。接下來您即可提交這個片段為\"非音樂片段\"。如果您感到困惑,請閱讀方針"
},
@@ -666,11 +654,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

@@ -75,16 +75,26 @@
vertical-align: top;
}
#infoButton.playerButton:not(.hidden) {
transform: translateX(0%) scale(1);
/* opacity is from YouTube page */
transition: transform 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
.autoHiding {
overflow: visible !important;
}
#infoButton.playerButton.hidden {
.autoHiding:not(.hidden) {
transform: translateX(0%) scale(1);
/* opacity is from YouTube page */
transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
}
.autoHiding.hidden {
transform: translateX(100%) scale(0);
/* opacity is from YouTube page */
transition: transform 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
width: 0px !important;
}
.autoHiding.hidden.autoHideLeft {
transform: translateX(-100%) scale(0);
}
.playerButton.hidden {
@@ -207,7 +217,7 @@
/* if two are very close to eachother */
.secondSkipNotice {
bottom: 250px;
bottom: 290px;
}
.noticeLeftIcon {
@@ -244,12 +254,16 @@
.sponsorTimesVoteButtonsContainer {
float: left;
vertical-align:middle;
padding: 2px 5px;
margin-right: 4px;
}
.sponsorTimesVoteButtonsContainer div{
display: inline-block;
}
.sponsorSkipNoticeRightSection {
right: 0;
position: absolute;
@@ -320,7 +334,8 @@
}
.voteButton {
height: 17px;
height: 24px;
width: 24px;
cursor: pointer;
}
.voteButton:hover {
@@ -472,7 +487,7 @@ input::-webkit-inner-spin-button {
text-decoration: underline;
}
.sponsorTimeCategories {
.sponsorTimeEditSelector {
margin-top: 5px;
margin-bottom: 5px;
@@ -544,4 +559,19 @@ input::-webkit-inner-spin-button {
border-width: 15px;
border-style: solid;
border-color: rgba(28, 28, 28, 0.7) transparent transparent transparent;
}
}
.sponsorBlockLockedColor {
color: #ffc83d;
}
.sponsorBlockRectangleTooltip {
position: absolute;
border-radius: 5px;
padding: 10px;
min-width: 250px;
min-height: 75px;
white-space: normal;
line-height: 1.5em;
}

View File

@@ -30,7 +30,7 @@
</p>
<p>
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>.
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>

View File

@@ -0,0 +1,58 @@
<?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="24"
viewBox="0 0 24 24"
width="24"
version="1.1"
id="svg6"
sodipodi:docname="thumbs_down.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="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"
id="path4"
style="fill:#ffc83d" />
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -50,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/>
@@ -271,7 +287,22 @@
<div class="small-description">__MSG_hideButtonsDescription__</div>
</div>
<br/>
<div option-type="toggle" toggle-type="reverse" sync-option="hideSkipButtonPlayerControls">
<label class="switch-container">
<label class="switch">
<input type="checkbox" checked>
<span class="slider round"></span>
</label>
<div class="switch-label">
__MSG_showSkipButton__
</div>
</label>
</div>
<br/>
<br/>
<br/>
@@ -285,14 +316,9 @@
__MSG_showInfoButton__
</div>
</label>
<br/>
<br/>
<br/>
<div class="small-description">__MSG_whatInfoButton__</div>
</div>
<br/>
<br/>
<br/>
@@ -306,13 +332,11 @@
__MSG_autoHideInfoButton__
</div>
</label>
<br/>
<br/>
<br/>
<br/>
</div>
<br/>
<br/>
<br/>
<div option-type="toggle" toggle-type="reverse" sync-option="hideDeleteButtonPlayerControls">
<label class="switch-container">
@@ -324,14 +348,9 @@
__MSG_showDeleteButton__
</div>
</label>
<br/>
<br/>
<br/>
<div class="small-description">__MSG_whatDeleteButton__</div>
</div>
<br/>
<br/>
<br/>
@@ -345,14 +364,10 @@
__MSG_showUploadButton__
</div>
</label>
<br/>
<br/>
<br/>
<div class="small-description">__MSG_whatUploadButton__</div>
</div>
<br/>
<br/>
<br/>
<br/>

View File

@@ -46,6 +46,7 @@
width: 330px;
padding: 22px;
text-align: center;
margin-bottom: var(--ytd-margin-6x);
}
#issueReporterTimeButtons > .votingButtons > .segmentTimeButton {
@@ -275,6 +276,10 @@ background-color:#ec1c1c;
cursor: pointer;
}
button#setUsernameButton {
flex: 0 1;
}
#submitUsername {
padding-left: 5pt;
}
@@ -285,6 +290,7 @@ background-color:#ec1c1c;
#usernameValue, #usernameInput, #sponsorTimesContributionsDisplay{
font-size: 16px;
flex: 1 0;
}
.SBWhitelistIcon {
@@ -343,6 +349,7 @@ label>p, #disableExtension>p, #usernameValue, #usernameElement > div > p,#sponso
#copyUserID {
width: 100%;
flex: 0 1;
}
#setUsernameContainer {

View File

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

@@ -274,8 +274,8 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
if (countdownTime == 3) {
//start fade out animation
const notice = document.getElementById("sponsorSkipNotice" + this.idSuffix);
notice.style.removeProperty("animation");
notice.classList.add("sponsorSkipNoticeFadeOut");
notice?.style.removeProperty("animation");
notice?.classList.add("sponsorSkipNoticeFadeOut");
}
this.setState({

View File

@@ -1,17 +1,25 @@
import * as React from "react";
import * as CompileConfig from "../../config.json";
import Config from "../config"
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode } from "../types";
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType } from "../types";
import NoticeComponent from "./NoticeComponent";
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
import SubmissionNotice from "../render/SubmissionNotice";
import Utils from "../utils";
const utils = new Utils();
import { getCategoryActionType, getSkippingText } from "../utils/categoryUtils";
import ThumbsUpSvg from "../svg-icons/thumbs_up_svg";
import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
import PencilSvg from "../svg-icons/pencil_svg";
export enum SkipNoticeAction {
None,
Upvote,
Downvote,
CategoryVote,
CopyDownvote,
Unskip
}
@@ -39,10 +47,11 @@ export interface SkipNoticeState {
maxCountdownTime?: () => number;
countdownText?: string;
unskipText?: string;
unskipCallback?: (index: number) => void;
skipButtonText?: string;
skipButtonCallback?: (index: number) => void;
showSkipButton?: boolean;
downvoting?: boolean;
editing?: boolean;
choosingCategory?: boolean;
thanksForVotingText?: string; //null until the voting buttons should be hidden
@@ -51,6 +60,10 @@ export interface SkipNoticeState {
showKeybindHint?: boolean;
smaller?: boolean;
voted?: SkipNoticeAction[];
copied?: SkipNoticeAction[];
}
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
@@ -68,6 +81,10 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
noticeRef: React.MutableRefObject<NoticeComponent>;
categoryOptionRef: React.RefObject<HTMLSelectElement>;
selectedColor: string;
unselectedColor: string;
lockedColor: string;
// Used to update on config change
configListener: () => void;
@@ -93,12 +110,16 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.segments.sort((a, b) => a.segment[0] - b.segment[0]);
}
//this is the suffix added at the end of every id
// This is the suffix added at the end of every id
for (const segment of this.segments) {
this.idSuffix += segment.UUID;
}
this.idSuffix += this.amountOfPreviousNotices;
this.selectedColor = Config.config.colorPalette.red;
this.unselectedColor = Config.config.colorPalette.white;
this.lockedColor = Config.config.colorPalette.locked;
// Setup state
this.state = {
noticeTitle,
@@ -110,10 +131,11 @@ 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,
editing: false,
choosingCategory: false,
thanksForVotingText: null,
@@ -121,12 +143,16 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
showKeybindHint: this.props.showKeybindHint ?? true,
smaller: this.props.smaller ?? false
smaller: this.props.smaller ?? false,
// Keep track of what segment the user interacted with.
voted: new Array(this.props.segments.length).fill(SkipNoticeAction.None),
copied: new Array(this.props.segments.length).fill(SkipNoticeAction.None),
}
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()));
}
}
@@ -184,29 +210,38 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
key={0}>
{/* Vote Button Container */}
{!this.state.thanksForVotingText ?
{!this.state.thanksForVotingText ?
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
className="sponsorTimesVoteButtonsContainer">
{/* 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>
<div id={"sponsorTimesDownvoteButtonsContainerUpvote" + this.idSuffix}
className="voteButton"
style={{marginRight: "5px"}}
title={chrome.i18n.getMessage("upvoteButtonInfo")}
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
<ThumbsUpSvg fill={(this.state.actionState === SkipNoticeAction.Upvote) ? this.selectedColor : this.unselectedColor} />
</div>
{/* 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>
<div id={"sponsorTimesDownvoteButtonsContainerDownvote" + this.idSuffix}
className="voteButton"
style={{marginRight: "5px", marginLeft: "5px"}}
title={chrome.i18n.getMessage("reportButtonInfo")}
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
<ThumbsDownSvg fill={this.downvoteButtonColor(SkipNoticeAction.Downvote)} />
</div>
{/* Copy and Downvote Button */}
<div id={"sponsorTimesDownvoteButtonsContainerCopyDownvote" + this.idSuffix}
className="voteButton"
style={{marginLeft: "5px"}}
onClick={() => this.openEditingOptions()}>
<PencilSvg fill={this.state.editing === true
|| this.state.actionState === SkipNoticeAction.CopyDownvote
|| this.state.choosingCategory === true
? this.selectedColor : this.unselectedColor} />
</div>
</td>
:
@@ -214,7 +249,22 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
<td id={"sponsorTimesVoteButtonInfoMessage" + this.idSuffix}
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
style={{marginRight: "10px"}}>
{this.state.thanksForVotingText}
{/* Submitted string */}
<span style={{marginRight: "10px"}}>
{this.state.thanksForVotingText}
</span>
{/* Continue Voting Button */}
<button id={"sponsorTimesContinueVotingContainer" + this.idSuffix}
className="sponsorSkipObject sponsorSkipNoticeButton"
title={"Continue Voting"}
onClick={() => this.setState({
thanksForVotingText: null,
messages: []
})}>
{chrome.i18n.getMessage("ContinueVoting")}
</button>
</td>
}
@@ -227,45 +277,46 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
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}
/* Edit Segments Row */
(this.state.editing && !this.state.thanksForVotingText && !(this.state.choosingCategory || this.state.actionState === SkipNoticeAction.CopyDownvote) &&
<tr id={"sponsorSkipNoticeEditSegmentsRow" + this.idSuffix}
key={2}>
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
<td id={"sponsorTimesEditSegmentsContainer" + this.idSuffix}>
{/* Normal downvote */}
{/* Copy Segment */}
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
{chrome.i18n.getMessage("downvoteDescription")}
title={chrome.i18n.getMessage("CopyDownvoteButtonInfo")}
style={{color: this.downvoteButtonColor(SkipNoticeAction.Downvote)}}
onClick={() => this.prepAction(SkipNoticeAction.CopyDownvote)}>
{chrome.i18n.getMessage("CopyAndDownvote")}
</button>
{/* Category vote */}
<button className="sponsorSkipObject sponsorSkipNoticeButton"
onClick={() => this.openCategoryChooser()}>
title={chrome.i18n.getMessage("ChangeCategoryTooltip")}
style={{color: (this.state.actionState === SkipNoticeAction.CategoryVote && this.state.editing == true) ? this.selectedColor : this.unselectedColor}}
onClick={() => this.resetStateToStart(SkipNoticeAction.CategoryVote, true, true)}>
{chrome.i18n.getMessage("incorrectCategory")}
</button>
</td>
</tr>
),
/* Category Chooser Row */
(this.state.choosingCategory &&
(this.state.choosingCategory && !this.state.thanksForVotingText &&
<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
className="sponsorTimeCategories sponsorTimeEditSelector"
defaultValue={this.segments[0].category}
ref={this.categoryOptionRef}>
{this.getCategoryOptions()}
@@ -279,13 +330,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
{chrome.i18n.getMessage("submit")}
</button>
}
</td>
</tr>
),
/* Segment Chooser Row */
(this.state.actionState !== SkipNoticeAction.None &&
(this.state.actionState !== SkipNoticeAction.None && this.segments.length > 1 && !this.state.thanksForVotingText &&
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}
key={4}>
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
@@ -297,17 +347,18 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
getSkipButton(): JSX.Element {
if (this.segments.length > 1
if (this.state.showSkipButton && (this.segments.length > 1
|| getCategoryActionType(this.segments[0].category) !== CategoryActionType.POI
|| this.props.unskipTime) {
|| this.props.unskipTime)) {
return (
<span className="sponsorSkipNoticeUnskipSection">
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
className="sponsorSkipObject sponsorSkipNoticeButton"
style={{marginLeft: "4px"}}
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
{this.state.unskipText + (this.state.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "")}
className="sponsorSkipObject sponsorSkipNoticeButton"
style={{marginLeft: "4px",
color: (this.state.actionState === SkipNoticeAction.Unskip) ? this.selectedColor : this.unselectedColor
}}
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "")}
</button>
</span>
);
@@ -316,20 +367,40 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
getSubmissionChooser(): JSX.Element[] {
const elements: JSX.Element[] = [];
for (let i = 0; i < this.segments.length; i++) {
elements.push(
<button className="sponsorSkipObject sponsorSkipNoticeButton"
style={{opacity: this.getSubmissionChooserOpacity(i),
color: this.getSubmissionChooserColor(i)}}
onClick={() => this.performAction(i)}
key={"submission" + i + this.segments[i].category + this.idSuffix}>
{(i + 1) + ". " + chrome.i18n.getMessage("category_" + this.segments[i].category)}
</button>
);
}
return elements;
}
getSubmissionChooserOpacity(index: number): number {
const isUpvote = this.state.actionState === SkipNoticeAction.Upvote;
const isDownvote = this.state.actionState == SkipNoticeAction.Downvote;
const isCopyDownvote = this.state.actionState == SkipNoticeAction.CopyDownvote;
const shouldBeGray: boolean = (isUpvote && this.state.voted[index] == SkipNoticeAction.Upvote) ||
(isDownvote && this.state.voted[index] == SkipNoticeAction.Downvote) ||
(isCopyDownvote && this.state.copied[index] == SkipNoticeAction.CopyDownvote);
return shouldBeGray ? 0.35 : 1;
}
getSubmissionChooserColor(index: number): string {
const isDownvote = this.state.actionState == SkipNoticeAction.Downvote;
const isCopyDownvote = this.state.actionState == SkipNoticeAction.CopyDownvote;
const shouldWarnUser = Config.config.isVip && (isDownvote || isCopyDownvote)
&& this.segments[index].locked === 1;
return shouldWarnUser ? this.lockedColor : this.unselectedColor;
}
onMouseEnter(): void {
if (this.state.smaller) {
this.setState({
@@ -338,16 +409,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
}
}
prepAction(action: SkipNoticeAction): void {
if (this.segments.length === 1) {
this.performAction(0, action);
} else {
this.setState({
actionState: action
});
}
}
getMessageBoxes(): JSX.Element[] {
if (this.state.messages.length === 0) {
// Add a spacer if there is no text
@@ -363,8 +424,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
for (let i = 0; i < this.state.messages.length; i++) {
elements.push(
<tr>
<td>
<tr key={i + "_messageBox"}>
<td key={i + "_messageBox"}>
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
text={this.state.messages[i]}
onClick={this.state.messageOnClick}
@@ -378,6 +439,33 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
return elements;
}
prepAction(action: SkipNoticeAction): void {
if (this.segments.length === 1) {
this.performAction(0, action);
} else {
switch (action ?? this.state.actionState) {
case SkipNoticeAction.None:
this.resetStateToStart();
break;
case SkipNoticeAction.Upvote:
this.resetStateToStart(SkipNoticeAction.Upvote);
break;
case SkipNoticeAction.Downvote:
this.resetStateToStart(SkipNoticeAction.Downvote);
break;
case SkipNoticeAction.CategoryVote:
this.resetStateToStart(SkipNoticeAction.CategoryVote, true, true);
break;
case SkipNoticeAction.CopyDownvote:
this.resetStateToStart(SkipNoticeAction.CopyDownvote, true);
break;
case SkipNoticeAction.Unskip:
this.resetStateToStart(SkipNoticeAction.Unskip);
break;
}
}
}
/**
* Performs the action from the current state
*
@@ -386,78 +474,136 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
performAction(index: number, action?: SkipNoticeAction): void {
switch (action ?? this.state.actionState) {
case SkipNoticeAction.None:
this.noAction(index);
break;
case SkipNoticeAction.Upvote:
this.contentContainer().vote(1, this.segments[index].UUID, undefined, this);
this.upvote(index);
break;
case SkipNoticeAction.Downvote:
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
this.downvote(index);
break;
case SkipNoticeAction.CategoryVote:
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value as Category, this)
this.categoryVote(index);
break;
case SkipNoticeAction.CopyDownvote:
this.copyDownvote(index);
break;
case SkipNoticeAction.Unskip:
this.state.unskipCallback(index);
this.unskipAction(index);
break;
default:
this.resetStateToStart();
break;
}
}
noAction(index: number): void {
const voted = this.state.voted;
voted[index] = SkipNoticeAction.None;
this.setState({
actionState: SkipNoticeAction.None
voted
});
}
adjustDownvotingState(value: boolean): void {
if (!value) this.clearConfigListener();
upvote(index: number): void {
if (this.segments.length === 1) this.resetStateToStart();
this.contentContainer().vote(1, this.segments[index].UUID, undefined, this);
}
downvote(index: number): void {
if (this.segments.length === 1) this.resetStateToStart();
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
}
categoryVote(index: number): void {
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value as Category, this)
}
copyDownvote(index: number): void {
const sponsorVideoID = this.props.contentContainer().sponsorVideoID;
const sponsorTimesSubmitting : SponsorTime = {
segment: this.segments[index].segment,
UUID: null,
category: this.segments[index].category,
actionType: this.segments[index].actionType,
source: 2
};
const segmentTimes = Config.config.segmentTimes.get(sponsorVideoID) || [];
segmentTimes.push(sponsorTimesSubmitting);
Config.config.segmentTimes.set(sponsorVideoID, segmentTimes);
this.props.contentContainer().sponsorTimesSubmitting.push(sponsorTimesSubmitting);
this.props.contentContainer().updatePreviewBar();
this.props.contentContainer().resetSponsorSubmissionNotice();
this.props.contentContainer().updateEditButtonsOnPlayer();
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
const copied = this.state.copied;
copied[index] = SkipNoticeAction.CopyDownvote;
this.setState({
downvoting: value,
choosingCategory: false
copied
});
}
clearConfigListener(): void {
if (this.configListener) {
Config.configListeners.splice(Config.configListeners.indexOf(this.configListener), 1);
this.configListener = null;
}
unskipAction(index: number): void {
this.state.skipButtonCallback(index);
}
openCategoryChooser(): void {
// Add as a config listener
this.configListener = () => this.forceUpdate();
Config.configListeners.push(this.configListener);
this.setState({
choosingCategory: true,
downvoting: false
}, () => {
if (this.segments.length > 1) {
// Use the action selectors as a submit button
this.prepAction(SkipNoticeAction.CategoryVote);
}
});
openEditingOptions(): void {
this.resetStateToStart(undefined, true);
}
getCategoryOptions(): React.ReactElement[] {
const elements = [];
const categories = CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable));
const categories = (CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable))) as Category[];
for (const category of categories) {
elements.push(
<option value={category}
key={category}>
key={category}
className={this.getCategoryNameClass(category)}>
{chrome.i18n.getMessage("category_" + category)}
</option>
);
}
return elements;
}
getCategoryNameClass(category: string): string {
return this.props.contentContainer().lockedCategories.includes(category) ? "sponsorBlockLockedColor" : ""
}
unskip(index: number): void {
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime);
this.unskippedMode(index, chrome.i18n.getMessage("reskip"));
this.unskippedMode(index, this.getReskipText());
}
reskip(index: number): void {
this.contentContainer().reskipSponsorTime(this.segments[index]);
const newState: SkipNoticeState = {
skipButtonText: this.getUnskipText(),
skipButtonCallback: this.unskip.bind(this),
maxCountdownTime: () => Config.config.skipNoticeDuration,
countdownTime: Config.config.skipNoticeDuration
};
// See if the title should be changed
if (!this.autoSkip) {
newState.noticeTitle = chrome.i18n.getMessage("noticeTitle");
}
//reset countdown
this.setState(newState, () => {
this.noticeRef.current.resetCountdown();
});
}
/** Sets up notice to be not skipped yet */
@@ -479,52 +625,51 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
} : this.state.maxCountdownTime;
return {
unskipText: buttonText,
unskipCallback: (index) => this.reskip(index),
skipButtonText: buttonText,
skipButtonCallback: (index) => this.reskip(index),
// change max duration to however much of the sponsor is left
maxCountdownTime: maxCountdownTime,
countdownTime: maxCountdownTime()
} as SkipNoticeState;
}
reskip(index: number): void {
this.contentContainer().reskipSponsorTime(this.segments[index]);
const newState: SkipNoticeState = {
unskipText: chrome.i18n.getMessage("unskip"),
unskipCallback: this.unskip.bind(this),
maxCountdownTime: () => Config.config.skipNoticeDuration,
countdownTime: Config.config.skipNoticeDuration
};
// See if the title should be changed
if (!this.autoSkip) {
newState.noticeTitle = chrome.i18n.getMessage("noticeTitle");
}
//reset countdown
this.setState(newState, () => {
this.noticeRef.current.resetCountdown();
});
}
afterVote(segment: SponsorTime, type: number, category: Category): void {
const index = utils.getSponsorIndexFromUUID(this.segments, segment.UUID);
const wikiLinkText = CompileConfig.wikiLinks[segment.category];
const voted = this.state.voted;
switch (type) {
case 0:
this.clearConfigListener();
this.setNoticeInfoMessageWithOnClick(() => window.open(wikiLinkText), chrome.i18n.getMessage("OpenCategoryWikiPage"));
voted[index] = SkipNoticeAction.Downvote;
break;
case 1:
voted[index] = SkipNoticeAction.Upvote;
break;
case 20:
voted[index] = SkipNoticeAction.None;
break;
}
this.setState({
voted
});
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
if (type === 0) {
this.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
this.adjustDownvotingState(false);
}
// Change the sponsor locally
if (segment) {
if (type === 0) {
segment.hidden = SponsorHideType.Downvoted;
} else if (category) {
segment.category = category;
segment.category = category; // This is the actual segment on the video page
this.segments[index].category = category; //this is the segment inside the skip notice.
} else if (type === 1) {
segment.hidden = SponsorHideType.Visible;
}
this.contentContainer().updatePreviewBar();
}
}
@@ -559,6 +704,79 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
this.props.closeListener();
}
clearConfigListener(): void {
if (this.configListener) {
Config.configListeners.splice(Config.configListeners.indexOf(this.configListener), 1);
this.configListener = null;
}
}
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
});
}
}
resetStateToStart(actionState: SkipNoticeAction = SkipNoticeAction.None, editing = false, choosingCategory = false): void {
this.setState({
actionState: actionState,
editing: editing,
choosingCategory: choosingCategory,
thanksForVotingText: null,
messages: []
});
}
downvoteButtonColor(downvoteType: SkipNoticeAction): string {
// Also used for "Copy and Downvote"
if (this.segments.length > 1) {
return (this.state.actionState === downvoteType) ? this.selectedColor : this.unselectedColor;
} else {
// You dont have segment selectors so the lockbutton needs to be colored and cannot be selected.
return Config.config.isVip && this.segments[0].locked === 1 ? this.lockedColor : this.unselectedColor;
}
}
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,12 +1,13 @@
import * as React from "react";
import Config from "../config";
import * as CompileConfig from "../../config.json";
import Config from "../config";
import { ActionType, ActionTypes, Category, CategoryActionType, ContentContainer, SponsorTime } from "../types";
import Utils from "../utils";
import { Category, CategoryActionType, ContentContainer, SponsorTime } from "../types";
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
import { getCategoryActionType } from "../utils/categoryUtils";
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
import { RectangleTooltip } from "../render/RectangleTooltip";
const utils = new Utils();
export interface SponsorTimeEditProps {
@@ -23,6 +24,7 @@ export interface SponsorTimeEditProps {
export interface SponsorTimeEditState {
editing: boolean;
sponsorTimeEdits: [string, string];
selectedCategory: Category;
}
const DEFAULT_CATEGORY = "chooseACategory";
@@ -32,6 +34,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
idSuffix: string;
categoryOptionRef: React.RefObject<HTMLSelectElement>;
actionTypeOptionRef: React.RefObject<HTMLSelectElement>;
configUpdateListener: () => void;
@@ -39,12 +42,14 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
super(props);
this.categoryOptionRef = React.createRef();
this.actionTypeOptionRef = React.createRef();
this.idSuffix = this.props.idSuffix;
this.state = {
editing: false,
sponsorTimeEdits: [null, null]
sponsorTimeEdits: [null, null],
selectedCategory: DEFAULT_CATEGORY as Category
};
}
@@ -54,6 +59,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
event.stopPropagation();
});
// Prevent scrolling while changing times
document.getElementById("sponsorTimesContainer" + this.idSuffix).addEventListener('wheel', function (event) {
event.preventDefault();
}, {passive: false});
// Add as a config listener
if (!this.configUpdateListener) {
this.configUpdateListener = () => this.configUpdate();
@@ -84,7 +94,6 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
node.style.setProperty("text-shadow", "none", "important");
}
};
// Create time display
let timeDisplay: JSX.Element;
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
@@ -99,20 +108,13 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
onClick={() => this.setTimeToNow(0)}>
{chrome.i18n.getMessage("bracketNow")}
</span>
<input id={"submittingTime0" + this.idSuffix}
className="sponsorTimeEdit sponsorTimeEditInput"
ref={oldYouTubeDarkStyles}
type="text"
value={this.state.sponsorTimeEdits[0]}
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();
}}>
onChange={(e) => {this.handleOnChange(0, e, sponsorTime, e.target.value)}}
onWheel={(e) => {this.changeTimesWhenScrolling(0, e, sponsorTime)}}>
</input>
{getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable ? (
@@ -126,14 +128,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
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.saveEditTimes();
}}>
onChange={(e) => {this.handleOnChange(1, e, sponsorTime, e.target.value)}}
onWheel={(e) => {this.changeTimesWhenScrolling(1, e, sponsorTime)}}>
</input>
<span id={"nowButton1" + this.idSuffix}
@@ -153,12 +149,14 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
);
} else {
timeDisplay = (
<div id={"sponsorTimesContainer" + this.idSuffix}
className="sponsorTimeDisplay"
onClick={this.toggleEditTime.bind(this)}>
onClick={this.toggleEditTime.bind(this)}
onWheel={this.toggleEditTime.bind(this)}>
{utils.getFormattedTime(segment[0], true) +
((!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable)
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
</div>
);
}
@@ -171,7 +169,7 @@ 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)}>
@@ -188,6 +186,19 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
</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 */}
@@ -225,6 +236,67 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
);
}
handleOnChange(index: number, e: React.ChangeEvent, sponsorTime: SponsorTime, targetValue: string): void {
const sponsorTimeEdits = this.state.sponsorTimeEdits;
// check if change is small engough to show tooltip
const before = utils.getFormattedTimeToSeconds(sponsorTimeEdits[index]);
const after = utils.getFormattedTimeToSeconds(targetValue);
const difference = Math.abs(before - after);
if (0 < difference && difference< 0.5) this.showToolTip();
sponsorTimeEdits[index] = targetValue;
if (index === 0 && getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = targetValue;
this.setState({sponsorTimeEdits});
this.saveEditTimes();
}
changeTimesWhenScrolling(index: number, e: React.WheelEvent, sponsorTime: SponsorTime): void {
let step = 0;
// shift + ctrl = 1
// ctrl = 0.1
// default = 0.01
// shift = 0.001
if (e.shiftKey) {
step = (e.ctrlKey) ? 1 : 0.001;
} else {
step = (e.ctrlKey) ? 0.1 : 0.01;
}
const sponsorTimeEdits = this.state.sponsorTimeEdits;
let timeAsNumber = utils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[index]);
if (timeAsNumber !== null && e.deltaY != 0) {
if (e.deltaY < 0) {
timeAsNumber += step;
} else if (timeAsNumber >= step) {
timeAsNumber -= step;
} else {
timeAsNumber = 0;
}
sponsorTimeEdits[index] = utils.getFormattedTime(timeAsNumber, true);
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = sponsorTimeEdits[0];
this.setState({sponsorTimeEdits});
this.saveEditTimes();
}
}
showToolTip(): void {
if (!Config.config.scrollToEditTimeUpdate && document.getElementById("sponsorRectangleTooltip" + "sponsorTimesContainer" + this.idSuffix) === null) {
const element = document.getElementById("sponsorTimesContainer" + this.idSuffix);
new RectangleTooltip({
text: chrome.i18n.getMessage("SponsorTimeEditScrollNewFeature"),
referenceNode: element.parentElement,
prependElement: element,
timeout: 15,
bottomOffset: 75 + "px",
leftOffset: -318 + "px",
backgroundColor: "rgba(28, 28, 28, 1.0)",
htmlId: "sponsorTimesContainer" + this.idSuffix,
buttonFunction: () => {Config.config.scrollToEditTimeUpdate = true}
});
}
}
getCategoryOptions(): React.ReactElement[] {
const elements = [(
<option value={DEFAULT_CATEGORY}
@@ -236,7 +308,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
for (const category of (this.props.categoryList ?? CompileConfig.categoryList)) {
elements.push(
<option value={category}
key={category}>
key={category}
className={this.getCategoryLockedClass(category)}>
{chrome.i18n.getMessage("category_" + category)}
</option>
);
@@ -245,6 +318,10 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
return elements;
}
getCategoryLockedClass(category: string): string {
return this.props.contentContainer().lockedCategories.includes(category) ? "sponsorBlockLockedColor" : "";
}
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
// See if show more categories was pressed
if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
@@ -264,11 +341,31 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
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());
}
@@ -331,6 +428,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
}
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);
@@ -343,7 +442,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 {

View File

@@ -15,13 +15,13 @@ export interface SubmissionNoticeProps {
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;
@@ -192,4 +192,4 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
}
}
export default SubmissionNoticeComponent;
export default SubmissionNoticeComponent;

View File

@@ -3,7 +3,9 @@ import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, P
interface SBConfig {
userID: string,
/** Contains unsubmitted segments that the user has created. */
isVip: boolean,
lastIsVipUpdate: number,
/* Contains unsubmitted segments that the user has created. */
segmentTimes: SBMap<string, SponsorTime[]>,
defaultCategory: Category,
whitelistedChannels: string[],
@@ -17,6 +19,7 @@ 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,
@@ -25,6 +28,7 @@ interface SBConfig {
hideInfoButtonPlayerControls: boolean,
hideDeleteButtonPlayerControls: boolean,
hideUploadButtonPlayerControls: boolean,
hideSkipButtonPlayerControls: boolean,
hideDiscordLaunches: number,
hideDiscordLink: boolean,
invidiousInstances: string[],
@@ -41,7 +45,13 @@ interface SBConfig {
showDonationLink: boolean,
autoHideInfoButton: boolean,
autoSkipOnMusicVideos: boolean,
highlightCategoryUpdate: boolean
highlightCategoryUpdate: boolean,
colorPalette: {
red: string,
white: string,
locked: string
},
scrollToEditTimeUpdate: boolean,
// What categories should be skipped
categorySelections: CategorySelection[],
@@ -149,6 +159,8 @@ const Config: SBObject = {
configListeners: [],
defaults: {
userID: null,
isVip: false,
lastIsVipUpdate: 0,
segmentTimes: new SBMap("segmentTimes"),
defaultCategory: "chooseACategory" as Category,
whitelistedChannels: [],
@@ -162,6 +174,7 @@ const Config: SBObject = {
submissionCountSinceCategories: 0,
showTimeWithSkips: true,
disableSkipping: false,
muteSegments: true,
trackViewCount: true,
trackViewCountInPrivate: true,
dontShowNotice: false,
@@ -170,6 +183,7 @@ const Config: SBObject = {
hideInfoButtonPlayerControls: false,
hideDeleteButtonPlayerControls: false,
hideUploadButtonPlayerControls: false,
hideSkipButtonPlayerControls: false,
hideDiscordLaunches: 0,
hideDiscordLink: false,
invidiousInstances: ["invidious.snopyta.org"],
@@ -187,12 +201,19 @@ const Config: SBObject = {
autoHideInfoButton: true,
autoSkipOnMusicVideos: false,
highlightCategoryUpdate: false, // TODO: Remove this once update is done
scrollToEditTimeUpdate: false, // false means the tooltip will be shown
categorySelections: [{
name: "sponsor" as Category,
option: CategorySkipOption.AutoSkip
}],
colorPalette: {
red: "#780303",
white: "#ffffff",
locked: "#ffc83d"
},
// Preview bar
barTypes: {
"preview-chooseACategory": {

View File

@@ -1,5 +1,5 @@
import Config from "./config";
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, CategoryActionType, ChannelIDInfo, ChannelIDStatus, SponsorSourceType, SegmentUUID, Category, SkipToTimeParams, ToggleSkippable } 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";
@@ -16,6 +16,7 @@ import * as Chat from "./js-components/chat";
import { getCategoryActionType } from "./utils/categoryUtils";
import { SkipButtonControlBar } from "./js-components/skipButtonControlBar";
import { Tooltip } from "./render/Tooltip";
import { getStartTimeFromUrl } from "./utils/urlParser";
// Hack to get the CSS loaded on permission-based sites (Invidious)
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
@@ -29,11 +30,14 @@ let sponsorVideoID: VideoID = null;
// List of open skip notices
const skipNotices: SkipNotice[] = [];
let activeSkipKeybindElement: ToggleSkippable = null;
let lastPOISkip = 0;
// JSON video info
let videoInfo: VideoInfo = null;
//the channel this video is about
// The channel this video is about
let channelIDInfo: ChannelIDInfo;
// Locked Categories in this tab, like: ["sponsor","intro","outro"]
let lockedCategories: Category[] = [];
// Skips are scheduled to ensure precision.
// Skips are rescheduled every seeking event.
@@ -45,6 +49,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[] = [];
@@ -118,7 +123,8 @@ const skipNoticeContentContainer: ContentContainer = () => ({
updateEditButtonsOnPlayer,
previewTime,
videoInfo,
getRealCurrentTime: getRealCurrentTime
getRealCurrentTime: getRealCurrentTime,
lockedCategories
});
// value determining when to count segment as skipped and send telemetry to server (percent based)
@@ -228,6 +234,7 @@ function resetValues() {
status: ChannelIDStatus.Fetching,
id: null
};
lockedCategories = [];
//empty the preview bar
if (previewBar !== null) {
@@ -385,6 +392,13 @@ function createPreviewBar(): void {
function durationChangeListener(): void {
updateAdFlag();
updatePreviewBar();
if (sponsorTimes) sponsorTimes = sponsorTimes.filter(segmentDurationFilter);
}
function segmentDurationFilter(segment: SponsorTime): boolean {
return segment.videoDuration === 0 || !video?.duration
|| switchingVideos || Math.abs(video.duration - segment.videoDuration) < 2;
}
function cancelSponsorSchedule(): void {
@@ -396,7 +410,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 {
@@ -412,6 +425,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;
@@ -419,14 +443,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;
@@ -444,7 +466,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
}
// Don't skip if this category should not be skipped
if (!shouldSkip(currentSkip) && skipInfo.array !== sponsorTimesSubmitting) return;
if (!shouldSkip(currentSkip) && !sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment)) return;
const skippingFunction = () => {
let forcedSkipTime: number = null;
@@ -461,7 +483,8 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
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];
@@ -480,12 +503,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);
@@ -534,13 +564,17 @@ function setupVideoListeners() {
switchingVideos = false;
video.addEventListener('play', () => {
switchingVideos = false;
// If it is not the first event, then the only way to get to 0 is if there is a seek event
// This check makes sure that changing the video resolution doesn't cause the extension to think it
// gone back to the begining
if (!firstEvent && video.currentTime === 0) return;
firstEvent = false;
if (switchingVideos) {
switchingVideos = false;
// If already segments loaded before video, retry to skip starting segments
if (sponsorTimes) startSkipScheduleCheckingForStartSponsors();
}
// Check if an ad is playing
updateAdFlag();
@@ -575,11 +609,13 @@ function setupVideoListeners() {
}
if (!Config.config.dontShowNotice) {
const currentPoiSegment = sponsorTimes.find((segment) =>
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))) {
if (currentPoiSegment && lastPOISkip < Date.now() - 3000
&& !skipNotices.some((notice) => notice.segments.some((s) => s.UUID === currentPoiSegment.UUID))) {
lastPOISkip = Date.now();
skipToTime({
v: video,
skipTime: currentPoiSegment.segment,
@@ -644,13 +680,15 @@ 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}`
});
if (response?.ok) {
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
?.filter((video) => video.videoID === id)
?.map((video) => video.segments)[0];
?.map((video) => video.segments)[0]
?.filter(segmentDurationFilter);
if (!recievedSegments || !recievedSegments.length) {
// return if no video found
retryFetch();
@@ -719,6 +757,55 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
sponsorLookupRetries++;
}
lookupVipInformation(id);
}
function lookupVipInformation(id: string): void {
updateVipInfo().then((isVip) => {
if (isVip) {
lockedCategoriesLookup(id);
}
});
}
async function updateVipInfo(): Promise<boolean> {
const currentTime = Date.now();
const lastUpdate = Config.config.lastIsVipUpdate;
if (currentTime - lastUpdate > 1000 * 60 * 60 * 72) { // 72 hours
Config.config.lastIsVipUpdate = currentTime;
const response = await utils.asyncRequestToServer("GET", "/api/isUserVIP", { userID: Config.config.userID});
if (response.ok) {
let isVip = false;
try {
const vipResponse = JSON.parse(response.responseText)?.vip;
if (typeof(vipResponse) === "boolean") {
isVip = vipResponse;
}
} catch (e) { } //eslint-disable-line no-empty
Config.config.isVip = isVip;
return isVip;
}
}
return Config.config.isVip;
}
async function lockedCategoriesLookup(id: string): Promise<void> {
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
const response = await utils.asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
if (response.ok) {
try {
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === id)[0]?.categories;
if (Array.isArray(categoriesResponse)) {
lockedCategories = categoriesResponse;
}
} catch (e) { } //eslint-disable-line no-empty
}
}
function retryFetch(): void {
@@ -741,24 +828,27 @@ function retryFetch(): void {
* Ex. When segments are first loaded
*/
function startSkipScheduleCheckingForStartSponsors() {
if (!switchingVideos) {
if (!switchingVideos && sponsorTimes) {
// See if there are any starting sponsors
let startingSegmentTime = -1;
let startingSegmentTime = getStartTimeFromUrl(document.URL) || -1;
let found = false;
let startingSegment: SponsorTime = null;
for (const time of sponsorTimes) {
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;
found = true;
break;
}
}
if (startingSegmentTime === -1) {
if (!found) {
for (const time of sponsorTimesSubmitting) {
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;
found = true;
break;
}
}
@@ -815,7 +905,7 @@ function getYouTubeVideoID(url: string): string | boolean {
if(url.startsWith("https://www.youtube.com/tv#/")) url = url.replace("#", "");
//Attempt to parse url
let urlObject = null;
let urlObject: URL = null;
try {
urlObject = new URL(url);
} catch (e) {
@@ -841,9 +931,10 @@ function getYouTubeVideoID(url: string): string | boolean {
if (urlObject.searchParams.has("v") && ["/watch", "/watch/"].includes(urlObject.pathname) || urlObject.pathname.startsWith("/tv/watch")) {
const id = urlObject.searchParams.get("v");
return id.length == 11 ? id : false;
} else if (urlObject.pathname.startsWith("/embed/")) {
} else if (urlObject.pathname.startsWith("/embed/") || urlObject.pathname.startsWith("/shorts/")) {
try {
return urlObject.pathname.substr(7, 11);
const id = urlObject.pathname.split("/")[2];
if (id && id.length >= 11) return id.substr(0, 11);
} catch (e) {
console.error("[SB] Video ID not valid for " + url);
return false;
@@ -894,7 +985,7 @@ function updatePreviewBar(): void {
});
});
previewBar.set(previewBarSegments, video.duration)
previewBar.set(previewBarSegments, video?.duration)
if (Config.config.showTimeWithSkips) {
const skippedDuration = utils.getTimestampsDuration(previewBarSegments.map(({segment}) => segment));
@@ -945,31 +1036,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.filter((segment) => getCategoryActionType(segment.category) === CategoryActionType.Skippable),
array: submittedArray,
index: minSponsorTimeIndex,
endIndex: endTimeIndex,
openNotice: true
};
} else {
return {
array: sponsorTimesSubmitting.filter((segment) => getCategoryActionType(segment.category) === CategoryActionType.Skippable),
array: unsubmittedArray,
index: minUnsubmittedSponsorTimeIndex,
endIndex: previewEndTimeIndex,
openNotice: false
@@ -993,7 +1086,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;
@@ -1004,7 +1100,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;
}
@@ -1029,24 +1126,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 || shouldSkip(sponsorTimes[i]))
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)
&& getCategoryActionType(sponsorTimes[i].category) === CategoryActionType.Skippable) {
|| ((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 };
}
/**
@@ -1069,7 +1184,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) {
@@ -1092,13 +1207,27 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
if ((autoSkip || sponsorTimesSubmitting.some((time) => time.segment === skippingSegments[0].segment))
&& 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];
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 (!autoSkip
@@ -1138,19 +1267,29 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
}
function unskipSponsorTime(segment: SponsorTime, unskipTime: number = null) {
//add a tiny bit of time to make sure it is not skipped again
console.log(unskipTime)
video.currentTime = unskipTime ?? segment.segment[0] + 0.001;
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 = 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 {
@@ -1193,13 +1332,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"));
(Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic"));
}
function getControls(): HTMLElement | false {
@@ -1240,15 +1379,8 @@ async function createButtons(): Promise<void> {
if (Config.config.autoHideInfoButton && !onInvidious && controlsContainer
&& playerButtons["info"]?.button && !controlsWithEventListeners.includes(controlsContainer)) {
controlsWithEventListeners.push(controlsContainer);
playerButtons["info"].button.classList.add("hidden");
controlsContainer.addEventListener("mouseenter", () => {
playerButtons["info"].button.classList.remove("hidden");
});
controlsContainer.addEventListener("mouseleave", () => {
playerButtons["info"].button.classList.add("hidden");
});
utils.setupAutoHideAnimation(playerButtons["info"].button, controlsContainer);
}
}
@@ -1321,7 +1453,7 @@ function getRealCurrentTime(): number {
if (playButtonSVGData === replaceSVGData) {
// At the end of the video
return video.duration;
return video?.duration;
} else {
return video.currentTime;
}
@@ -1333,6 +1465,7 @@ function startOrEndTimingNewSegment() {
segment: [getRealCurrentTime()],
UUID: null,
category: Config.config.defaultCategory,
actionType: ActionType.Skip,
source: SponsorSourceType.Local
});
} else {
@@ -1389,6 +1522,7 @@ function updateSponsorTimesSubmitting(getFromConfig = true) {
segment: segmentTime.segment,
UUID: segmentTime.UUID,
category: segmentTime.category,
actionType: segmentTime.actionType,
source: segmentTime.source
});
}
@@ -1603,8 +1737,12 @@ function resetSponsorSubmissionNotice() {
}
function submitSponsorTimes() {
if (submissionNotice !== null) return;
if (submissionNotice !== null){
submissionNotice.close();
submissionNotice = null;
return;
}
if (sponsorTimesSubmitting !== undefined && sponsorTimesSubmitting.length > 0) {
submissionNotice = new SubmissionNotice(skipNoticeContentContainer, sendSubmitMessage);
}
@@ -1819,7 +1957,7 @@ function showTimeWithoutSkips(skippedDuration: number): void {
display.appendChild(duration);
}
const durationAfterSkips = utils.getFormattedTime(video.duration - skippedDuration)
const durationAfterSkips = utils.getFormattedTime(video?.duration - skippedDuration)
duration.innerText = (durationAfterSkips == null || skippedDuration <= 0) ? "" : " (" + durationAfterSkips + ")";
}

View File

@@ -31,14 +31,16 @@ export function openChat(config: ChatConfig): void {
}
export async function openWarningChat(warningMessage: string): Promise<void> {
const warningReasonMatch = warningMessage.match(/Warning reason: '(.+)'/);
alert(chrome.i18n.getMessage("warningChatInfo") + `\n\n${warningReasonMatch ? ` Warning reason: ${warningReasonMatch[1]}` : ``}`);
const userNameData = await utils.asyncRequestToServer("GET", "/api/getUsername?userID=" + Config.config.userID);
const userName = userNameData.ok ? JSON.parse(userNameData.responseText).userName : "";
const publicUserID = await utils.getHash(Config.config.userID);
const warningReasonMatch = warningMessage.match(/Warning reason: '(.+)'/);
openChat({
displayName: `${userName ? userName : ``}${userName !== publicUserID ? ` | ${publicUserID}` : ``}`,
composerInitialValue: `I got a warning and want to know what I need to do to improve.` +
composerInitialValue: `I got a warning and confirm I [REMOVE THIS CAPITAL TEXT TO CONFIRM] reread the guidelines.` +
warningReasonMatch ? ` Warning reason: ${warningReasonMatch[1]}` : ``,
customDescription: chrome.i18n.getMessage("warningChatInfo")
});

View File

@@ -197,8 +197,9 @@ class PreviewBar {
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[fullCategoryName]?.opacity;
bar.style.position = "absolute";
const duration = 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]);
bar.style.left = this.timeToPercentage(Math.min(this.videoDuration - Math.max(0, duration), segment[0]));
return bar;
}

View File

@@ -2,6 +2,8 @@ import Config from "../config";
import { SponsorTime } from "../types";
import { getSkippingText } from "../utils/categoryUtils";
import Utils from "../utils";
const utils = new Utils();
export interface SkipButtonControlBarProps {
skip: (segment: SponsorTime) => void;
@@ -53,13 +55,20 @@ export class SkipButtonControlBar {
if (leftControlsContainer && !leftControlsContainer.contains(this.container)) {
leftControlsContainer.insertBefore(this.container, this.chapterText);
if (Config.config.autoHideInfoButton) {
utils.setupAutoHideAnimation(this.skipIcon, leftControlsContainer, false, false);
}
}
}
enable(segment: SponsorTime, duration?: number): void {
if (duration) this.duration = duration;
this.segment = segment;
this.refreshText();
this.textContainer?.classList?.remove("hidden");
utils.disableAutoHideAnimation(this.skipIcon);
this.startTimer();
}
@@ -68,7 +77,8 @@ export class SkipButtonControlBar {
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 + ")" : "");
this.textContainer.innerText = this.getTitle();
this.skipIcon.setAttribute("title", this.getTitle());
}
}
@@ -84,17 +94,42 @@ export class SkipButtonControlBar {
startTimer(): void {
this.stopTimer();
this.timeout = setTimeout(() => this.disable(), Math.max(Config.config.skipNoticeDuration, this.duration) * 1000);
this.timeout = setTimeout(() => this.disableText(), Math.max(Config.config.skipNoticeDuration, this.duration) * 1000);
}
disable(): void {
this.container.classList.add("hidden");
this.textContainer?.classList?.remove("hidden");
this.chapterText?.classList?.remove("hidden");
this.getChapterPrefix()?.classList?.remove("hidden");
}
toggleSkip(): void {
this.skip(this.segment);
this.disable();
this.disableText();
}
disableText(): void {
if (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls) {
this.disable();
return;
}
this.textContainer?.classList?.add("hidden");
this.chapterText?.classList?.remove("hidden");
this.getChapterPrefix()?.classList?.add("hidden");
utils.enableAutoHideAnimation(this.skipIcon);
}
private getTitle(): string {
return getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "");
}
private getChapterPrefix(): HTMLElement {
return document.querySelector(".ytp-chapter-title-prefix");
}
}

View File

@@ -379,8 +379,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
container.removeChild(container.firstChild);
}
const isVip = Config.config.isVip;
for (let i = 0; i < segmentTimes.length; i++) {
const UUID = segmentTimes[i].UUID;
const locked = segmentTimes[i].locked;
const sponsorTimeButton = document.createElement("button");
sponsorTimeButton.className = "segmentTimeButton popupElement";
@@ -430,7 +432,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const downvoteButton = document.createElement("img");
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
downvoteButton.className = "voteButton";
downvoteButton.src = chrome.runtime.getURL("icons/thumbs_down.svg");
downvoteButton.src = locked && isVip ? chrome.runtime.getURL("icons/thumbs_down_locked.svg") : chrome.runtime.getURL("icons/thumbs_down.svg");
downvoteButton.addEventListener("click", () => vote(0, UUID));
//uuid button

View File

@@ -0,0 +1,92 @@
import * as React from "react";
import * as ReactDOM from "react-dom";
export interface RectangleTooltipProps {
text: string,
link?: string,
referenceNode: HTMLElement,
prependElement?: HTMLElement, // Element to append before
bottomOffset?: string,
leftOffset?: string,
timeout?: number,
htmlId?: string,
maxHeight?: string,
maxWidth?: string,
backgroundColor?: string,
buttonFunction?: () => void;
}
export class RectangleTooltip {
text: string;
container: HTMLDivElement;
timer: NodeJS.Timeout;
constructor(props: RectangleTooltipProps) {
props.bottomOffset ??= "0px";
props.leftOffset ??= "0px";
props.maxHeight ??= "100px";
props.maxWidth ??= "300px";
props.backgroundColor ??= "rgba(28, 28, 28, 0.7)";
this.text = props.text;
this.container = document.createElement('div');
props.htmlId ??= props.text;
this.container.id = "sponsorRectangleTooltip" + props.htmlId;
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,
left: props.leftOffset,
maxHeight: props.maxHeight,
maxWidth: props.maxWidth,
backgroundColor: props.backgroundColor}}
className="sponsorBlockRectangleTooltip" >
<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={() => {
if (props.buttonFunction) props.buttonFunction();
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

@@ -71,6 +71,10 @@ class SkipNotice {
toggleSkip(): void {
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip);
}
unmutedListener(): void {
this.skipNoticeRef?.current?.unmutedListener();
}
}
export default SkipNotice;

View File

@@ -0,0 +1,18 @@
import * as React from "react";
const pencilSvg = ({
fill = "#ffffff"
}): JSX.Element => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="18"
height="18"
viewBox="0 0 24 24"
fill={fill}
>
<path
d="M14.1 7.1l2.9 2.9L6.1 20.7l-3.6.7.7-3.6L14.1 7.1zm0-2.8L1.4 16.9 0 24l7.1-1.4L19.8 9.9l-5.7-5.7zm7.1 4.3L24 5.7 18.3 0l-2.8 2.8 5.7 5.7z"></path>
</svg>
);
export default pencilSvg;

View File

@@ -0,0 +1,23 @@
import * as React from "react";
const thumbsDownSvg = ({
fill = "#ffffff"
}): JSX.Element => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="18"
height="18"
fill={fill}
viewBox="0 0 24 24"
>
<path
fill="none"
d="M0 0h24v24H0z">
</path>
<path
d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"
></path>
</svg>
);
export default thumbsDownSvg;

View File

@@ -0,0 +1,22 @@
import * as React from "react";
const thumbsUpSvg = ({
fill = "#ffffff"
}): JSX.Element => (
<svg
xmlns="http://www.w3.org/2000/svg"
width="18"
height="18"
fill={fill}
viewBox="0 0 24 24"
>
<path
fill="none"
d="M0 0h24v24H0V0z"></path>
<path
d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z"
></path>
</svg>
);
export default thumbsUpSvg;

View File

@@ -20,7 +20,8 @@ export interface ContentContainer {
updateEditButtonsOnPlayer: () => void,
previewTime: (time: number, unpause?: boolean) => void,
videoInfo: VideoInfo,
getRealCurrentTime: () => number
getRealCurrentTime: () => number,
lockedCategories: string[]
}
}
@@ -56,6 +57,13 @@ export enum CategoryActionType {
POI = "_POI"
}
export enum ActionType {
Skip = "skip",
Mute = "mute"
}
export const ActionTypes = [ActionType.Skip, ActionType.Mute];
export type SegmentUUID = string & { __segmentUUIDBrand: unknown };
export type Category = string & { __categoryBrand: unknown };
@@ -67,11 +75,18 @@ export enum SponsorSourceType {
export interface SponsorTime {
segment: [number] | [number, number];
UUID: SegmentUUID;
locked?: number;
category: Category;
actionType: ActionType;
hidden?: SponsorHideType;
source?: SponsorSourceType;
videoDuration?: number;
}
export interface ScheduledTime extends SponsorTime {
scheduledTime: number;
}
export interface PreviewBarOption {

View File

@@ -183,6 +183,42 @@ export default class Utils {
}
}
setupAutoHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): void {
if (enabled) element.classList.add("autoHiding");
element.classList.add("hidden");
element.classList.add("animationDone");
if (!rightSlide) element.classList.add("autoHideLeft");
let mouseEntered = false;
container.addEventListener("mouseenter", () => {
mouseEntered = true;
element.classList.remove("animationDone");
// Wait for next event loop
setTimeout(() => {
if (mouseEntered) element.classList.remove("hidden")
}, 10);
});
container.addEventListener("mouseleave", () => {
mouseEntered = false;
if (element.classList.contains("autoHiding")) {
element.classList.add("hidden");
}
});
}
enableAutoHideAnimation(element: Element): void {
element.classList.add("autoHiding");
element.classList.add("hidden");
}
disableAutoHideAnimation(element: Element): void {
element.classList.remove("autoHiding");
element.classList.remove("hidden");
}
/**
* Merges any overlapping timestamp ranges into single segments and returns them as a new array.
*/
@@ -503,5 +539,4 @@ export default class Utils {
return hashHex;
}
}

View File

@@ -1,15 +1,39 @@
import { Category, CategoryActionType, SponsorTime } from "../types";
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) {
const messageId = getCategoryActionType(segments[0].category) === CategoryActionType.Skippable
? "skipped" : "skipped_to_category";
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 {
const messageId = getCategoryActionType(segments[0].category) === CategoryActionType.Skippable
? "skip_category" : "skip_to_category";
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);
}
}

26
src/utils/urlParser.ts Normal file
View File

@@ -0,0 +1,26 @@
export function getStartTimeFromUrl(url: string): number {
const urlParams = new URLSearchParams(url);
const time = urlParams?.get('t') || urlParams?.get('time_continue');
return urlTimeToSeconds(time);
}
export function urlTimeToSeconds(time: string): number {
if (!time) {
return 0;
}
const re = /(?:(\d{1,3})h)?(?:(\d{1,2})m)?(\d+)s?/;
const match = re.exec(time);
if (match) {
const hours = parseInt(match[1] ?? '0', 10);
const minutes = parseInt(match[2] ?? '0', 10);
const seconds = parseInt(match[3] ?? '0', 10);
return hours * 3600 + minutes * 60 + seconds;
} else if (/\d+/.test(time)) {
return parseInt(time, 10);
}
}

View File

@@ -3,7 +3,15 @@ import * as Chrome from "selenium-webdriver/chrome";
import * as Path from "path";
test("Selenium Chrome test", async () => {
const driver = await setup();
let driver;
try {
driver = await setup();
} catch (e) {
console.warn("A browser is probably not installed, skipping selenium tests");
console.warn(e);
return;
}
try {
await waitForInstall(driver);
@@ -13,8 +21,12 @@ test("Selenium Chrome test", async () => {
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();
}
@@ -24,7 +36,7 @@ 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")
options.addArguments("--disable-features=PreloadMediaEngagementData, MediaEngagementBypassAutoplayPolicies");
const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build();
driver.manage().setTimeouts({
@@ -106,6 +118,26 @@ async function editSegments(driver: WebDriver, index: number, expectedStartTimeB
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"));
@@ -113,7 +145,21 @@ async function autoskipSegment(driver: WebDriver, startTime: number, endTime: nu
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()");
}

27
test/urlParser.test.ts Normal file
View File

@@ -0,0 +1,27 @@
import { getStartTimeFromUrl } from '../src/utils/urlParser';
describe("getStartTimeFromUrl", () => {
it("parses with a number", () => {
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=123")).toBe(123);
});
it("parses with seconds", () => {
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=123s")).toBe(123);
});
it("parses with minutes", () => {
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=23m3s")).toBe(23 * 60 + 3);
});
it("parses with hours", () => {
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=1h2m3s")).toBe(1 * 60 * 60 + 2 * 60 + 3);
});
it("works with time_continue", () => {
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&time_continue=123")).toBe(123);
});
it("works with no time", () => {
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ")).toBe(0);
});
});

View File

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