Compare commits

...

74 Commits
5.1.1 ... 5.1.9

Author SHA1 Message Date
Ajay Ramachandran
ab87afc82b New Crowdin updates (#1580) 2022-12-11 16:59:21 -05:00
Ajay
8798dd29b8 bump version 2022-12-11 16:59:01 -05:00
Ajay
3e3059d79a Fix bar being too long due to time to decimal changing while remaking bar not true 2022-12-11 16:58:40 -05:00
Ajay
16581d39a4 Reverse fast interval to decimal
It doesn't work when there are imported chapters closely or identical to existing chapters. Causes bar to extend too far.
2022-12-11 16:24:53 -05:00
Ajay
3b776991a6 Don't run some chapter init code when not necessary 2022-12-11 15:46:29 -05:00
Ajay
7eb6b3a79d Don't regenerate groups if not needed 2022-12-11 15:20:05 -05:00
Ajay
a5d91c9b57 clarify comment 2022-12-11 14:25:34 -05:00
Ajay
f59665cccb Fix smallest segment cache 2022-12-11 14:21:25 -05:00
Ajay
cf0e91c4ff Use fast time to decimal for non display calculations 2022-12-11 14:10:09 -05:00
Ajay
41a25720d0 Caching for get smallest segment
Hover previews
2022-12-11 13:19:37 -05:00
Ajay
283ec50388 Hide original chapter if similar in name 2022-12-11 12:51:36 -05:00
Ajay
e5794e6685 Fix hover text alignment issue 2022-12-11 12:04:31 -05:00
Ajay
bd3cdb98ac Fix lots of chapters freezing the browser 2022-12-11 11:58:10 -05:00
Ajay
f66d7a9547 Call whitelist check if not still waiting for channel id in window listener 2022-12-09 22:11:57 -05:00
Ajay
7be7b12d52 Generated chapters can now start after 0 seconds, so allow importing them 2022-12-04 21:55:46 -05:00
Ajay Ramachandran
b17cfa4ec2 Merge pull request #1348 from mchangrh/configDiffPlugin
config diff plugin
2022-12-04 15:10:31 -05:00
Ajay Ramachandran
8c185d4b5e Add another key to config diff whitelist 2022-12-04 15:06:16 -05:00
Ajay Ramachandran
ec86d6f99d Merge pull request #1514 from mchangrh/fv-livestream-2
Allow full video labels on livestreams
2022-12-04 15:04:15 -05:00
github-actions[bot]
ffc566c3bc Update Invidious List 2022-11-30 21:46:54 -05:00
Ajay Ramachandran
e7451eca27 Merge pull request #1595 from caneleex/patch/time-mutes
Don't include mutes in time without skips
2022-11-29 18:48:13 -05:00
Ajay Ramachandran
53713cd2e7 Merge pull request #1578 from caneleex/patch/disable-scrolling
Add option to disable scrolling to edit
2022-11-29 16:03:35 -05:00
Ajay
5925d45f74 Add new workaround for improving skipping precision on Firefox 2022-11-26 03:38:48 -05:00
Ajay
43c30bb03d bump version 2022-11-23 23:42:17 -05:00
Ajay
eac2caadce Fix document script sending events when video id not changed 2022-11-23 23:42:06 -05:00
Ajay
8d0a4ec2e6 Fix race condition causing double fetch 2022-11-23 23:37:52 -05:00
Ajay
8b6fb98b3d Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-11-23 23:24:59 -05:00
Ajay
8f13c5b8a5 Disable refetch 2022-11-23 23:24:57 -05:00
Ajay Ramachandran
ec12c1d324 bump version 2022-11-22 17:29:46 -05:00
caneleex
b696902124 why 2022-11-18 20:51:11 +01:00
caneleex
87d1522c41 Don't include mutes in time without skips 2022-11-18 20:50:05 +01:00
Ajay
4447ff3142 Fix issues with mutes ending when highlights start 2022-11-09 12:45:11 -05:00
Ajay
00ef3856ca Fix race condition causing full video label not to display 2022-11-08 13:50:56 -05:00
Ajay
cd7d74fb33 Fix category pill text on new YouTube layout 2022-11-08 13:38:19 -05:00
Ajay
ce3f77ed20 Better key moments check by not importing when no 0 second chapter 2022-11-07 21:15:04 -05:00
Ajay Ramachandran
d347f4e575 bump version 2022-11-06 13:19:56 -05:00
Ajay Ramachandran
1c5802a5e2 New Crowdin updates (#1574) 2022-11-06 13:19:35 -05:00
Ajay Ramachandran
4bc7ce7cd0 Merge pull request #1577 from caneleex/patch/outro-end-time
Don't overwrite endcards time upon submitting
2022-11-06 13:18:14 -05:00
caneleex
3c6989f67d Don't overwrite endcards time upon submitting 2022-11-06 19:15:59 +01:00
caneleex
a1e00b44d5 Add option to disable scrolling to edit 2022-11-06 18:48:42 +01:00
Ajay Ramachandran
b40749717f Merge pull request #1550 from mchangrh/stricter-ts
add noFallThrough, inplicitReturn, update packages
2022-11-04 17:06:36 -04:00
Ajay
4596f3ab0d bump version 2022-11-04 17:04:35 -04:00
mini-bomba
89e87cd74d Don't update the whole segment list on time update (#1569)
Update segment element classes instead.
This probably is more efficient than what we're doing currently.
Also, this seems to fix a bug where the vote confirmation/error msg is removed immediately
2022-11-04 17:02:54 -04:00
Ajay Ramachandran
311c4caf2b New Crowdin updates (#1544) 2022-11-04 17:02:16 -04:00
Ajay
0e0ae9165e Fix segments really close to eachother not skipping
Also combine segments that are closer than skip buffer

Fix #1510
2022-11-04 17:01:23 -04:00
Ajay
ff2cec699f adjust skip to highlight button behavior to attempt to fix issues 2022-11-04 16:18:15 -04:00
Ajay
1775835392 Add hiding skip to highlight
Fix #1530
2022-11-04 16:05:09 -04:00
Ajay
2c5db670a4 Safety on getChapterButton
Fix #1573
2022-11-04 15:44:14 -04:00
Ajay Ramachandran
4b4743f1f7 Merge pull request #1531 from mchangrh/music-progressbar
add YT Music progress bar selector
2022-11-04 15:41:51 -04:00
Ajay Ramachandran
7719ca7eca Merge pull request #1561 from mchangrh/gha-update
bump actions to node 16
2022-11-04 15:40:05 -04:00
Ajay Ramachandran
f4f7df9f2b Merge pull request #1564 from mini-bomba/userinfo-publicID
Use publicID instead of privateID for /userInfo calls
2022-11-04 15:39:44 -04:00
Ajay
95551de09a Fix precise seeking notice offset with hover preview 2022-11-01 14:41:43 -04:00
Ajay Ramachandran
8653059b13 bump version 2022-10-30 22:00:35 -04:00
Ajay
b3afd0403e Add configuration for segment failed to fetch warning 2022-10-30 20:38:48 -04:00
Ajay
6db498ccb1 Fix key moments check not working when multiple videos present 2022-10-30 20:36:05 -04:00
Ajay
ef8c5f58c5 Fix scrubbing bar missing when chapter bar using % widths 2022-10-30 14:49:19 -04:00
Ajay
71998831ee bump version 2022-10-30 13:23:12 -04:00
Ajay
8f19d3e83c Fix segment failed to fetch warning appearing for 404 2022-10-30 13:23:02 -04:00
mini-bomba
ea73a92fb7 Use publicID instead of privateID for /userInfo calls
This should reduce the load on the server a bit, as it will no longer have to compute the publicID for each sponsorblock user.
This also reduces the list of actions that leak the privateID to the server.
2022-10-29 13:20:51 +02:00
Ajay
d68c3659be bump version 2022-10-27 21:47:00 -04:00
Ajay
715bcb6bd3 Added error when segments haven't loaded and improved popup message
Resolves #1553
2022-10-27 21:46:47 -04:00
Ajay
fea8a9a37e Disable virtual time in firefox again 2022-10-27 21:39:06 -04:00
Michael C
01eeb28b60 bump actions to node 16 2022-10-27 03:26:08 -04:00
Michael C
44d4dd54aa return undefined instead of resolving void 2022-10-21 02:41:01 -04:00
Michael C
27bb6045bc make tab open listeners non-async 2022-10-21 02:37:48 -04:00
Michael M. Chang
0610eea53d Update src/popup.ts
Co-authored-by: Ajay Ramachandran <dev@ajay.app>
2022-10-21 01:01:25 -04:00
Michael C
1fcfea9fd5 add noFallThrough, inplicitReturn, update packages 2022-10-20 22:13:51 -04:00
Ajay
aec5845bce Show import button for errors 2022-10-17 09:25:11 -04:00
Ajay
5209c0ea04 Import chapters as chooseACategory if chapters is disabled 2022-10-17 09:23:59 -04:00
Ajay
b52132e311 Open submission men after importing 2022-10-17 08:52:55 -04:00
Ajay
c2e731ef89 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2022-10-17 08:50:56 -04:00
Ajay
a48269f254 Import short category names too 2022-10-17 08:50:55 -04:00
Michael C
784c1db0c1 add YT Music progress bar selector 2022-10-13 00:55:55 -04:00
Michael C
bf8003891c add configDiffPlugin 2022-10-07 17:12:16 -04:00
Michael C
adb8c4c5f9 only allow full video labels on livestreams 2022-10-07 16:37:10 -04:00
62 changed files with 4409 additions and 1960 deletions

View File

@@ -10,8 +10,8 @@ jobs:
steps: steps:
# Initialization # Initialization
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-node@v2 - uses: actions/setup-node@v3
with: with:
node-version: '18' node-version: '18'
- run: npm ci - run: npm ci
@@ -25,7 +25,7 @@ jobs:
# Create Chrome artifacts # Create Chrome artifacts
- name: Create Chrome artifacts - name: Create Chrome artifacts
run: npm run build:chrome run: npm run build:chrome
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: ChromeExtension name: ChromeExtension
path: dist path: dist
@@ -37,7 +37,7 @@ jobs:
# Create Firefox artifacts # Create Firefox artifacts
- name: Create Firefox artifacts - name: Create Firefox artifacts
run: npm run build:firefox run: npm run build:firefox
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: FirefoxExtension name: FirefoxExtension
path: dist path: dist
@@ -48,7 +48,7 @@ jobs:
# Create Beta artifacts (Builds with the name changed to beta) # Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts - name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env stream=beta run: npm run build:chrome -- --env stream=beta
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: ChromeExtensionBeta name: ChromeExtensionBeta
path: dist path: dist
@@ -58,7 +58,7 @@ jobs:
- name: Create Firefox Beta artifacts - name: Create Firefox Beta artifacts
run: npm run build:firefox -- --env stream=beta run: npm run build:firefox -- --env stream=beta
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: FirefoxExtensionBeta name: FirefoxExtensionBeta
path: dist path: dist

View File

@@ -12,8 +12,8 @@ jobs:
steps: steps:
# Initialization # Initialization
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-node@v2 - uses: actions/setup-node@v3
with: with:
node-version: '18' node-version: '18'
- run: npm ci - run: npm ci
@@ -23,7 +23,7 @@ jobs:
# Create Chrome artifacts # Create Chrome artifacts
- name: Create Chrome artifacts - name: Create Chrome artifacts
run: npm run build:chrome run: npm run build:chrome
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: ChromeExtension name: ChromeExtension
path: dist path: dist
@@ -34,7 +34,7 @@ jobs:
# Create Firefox artifacts # Create Firefox artifacts
- name: Create Firefox artifacts - name: Create Firefox artifacts
run: npm run build:firefox run: npm run build:firefox
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: FirefoxExtension name: FirefoxExtension
path: dist path: dist
@@ -44,7 +44,7 @@ jobs:
# Create Beta artifacts (Builds with the name changed to beta) # Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts - name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env stream=beta run: npm run build:chrome -- --env stream=beta
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: ChromeExtensionBeta name: ChromeExtensionBeta
path: dist path: dist
@@ -55,7 +55,7 @@ jobs:
# Create Safari artifacts # Create Safari artifacts
- name: Create Safari artifacts - name: Create Safari artifacts
run: npm run build:safari run: npm run build:safari
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: SafariExtension name: SafariExtension
path: dist path: dist
@@ -66,7 +66,7 @@ jobs:
run: rm -rf ./dist run: rm -rf ./dist
- name: Create Edge artifacts - name: Create Edge artifacts
run: npm run build:edge run: npm run build:edge
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: EdgeExtension name: EdgeExtension
path: dist path: dist
@@ -75,35 +75,35 @@ jobs:
# Upload each release asset # Upload each release asset
- name: Upload ChromeExtension to release - name: Upload ChromeExtension to release
uses: Shopify/upload-to-release@master uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with: with:
args: builds/ChromeExtension.zip args: builds/ChromeExtension.zip
name: ChromeExtension.zip name: ChromeExtension.zip
path: ./builds/ChromeExtension.zip path: ./builds/ChromeExtension.zip
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload ChromeExtensionBeta to release - name: Upload ChromeExtensionBeta to release
uses: Shopify/upload-to-release@master uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with: with:
args: builds/ChromeExtensionBeta.zip args: builds/ChromeExtensionBeta.zip
name: ChromeExtensionBeta.zip name: ChromeExtensionBeta.zip
path: ./builds/ChromeExtensionBeta.zip path: ./builds/ChromeExtensionBeta.zip
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload FirefoxExtension to release - name: Upload FirefoxExtension to release
uses: Shopify/upload-to-release@master uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with: with:
args: builds/FirefoxExtension.zip args: builds/FirefoxExtension.zip
name: FirefoxExtension.zip name: FirefoxExtension.zip
path: ./builds/FirefoxExtension.zip path: ./builds/FirefoxExtension.zip
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload SafariExtension to release - name: Upload SafariExtension to release
uses: Shopify/upload-to-release@master uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with: with:
args: builds/SafariExtension.zip args: builds/SafariExtension.zip
name: SafariExtension.zip name: SafariExtension.zip
path: ./builds/SafariExtension.zip path: ./builds/SafariExtension.zip
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload EdgeExtension to release - name: Upload EdgeExtension to release
uses: Shopify/upload-to-release@master uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with: with:
args: builds/EdgeExtension.zip args: builds/EdgeExtension.zip
name: EdgeExtension.zip name: EdgeExtension.zip
@@ -113,7 +113,7 @@ jobs:
# Firefox Beta # Firefox Beta
- name: Create Firefox Beta artifacts - name: Create Firefox Beta artifacts
run: npm run build:firefox -- --env stream=beta run: npm run build:firefox -- --env stream=beta
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: FirefoxExtensionBeta name: FirefoxExtensionBeta
path: dist path: dist
@@ -130,13 +130,13 @@ jobs:
run: sudo apt-get install rename run: sudo apt-get install rename
- name: Rename signed file - name: Rename signed file
run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' * run: cd ./web-ext-artifacts ; rename 's/.*/FirefoxSignedInstaller.xpi/' *
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v3
with: with:
name: FirefoxExtensionSigned.xpi name: FirefoxExtensionSigned.xpi
path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi path: ./web-ext-artifacts/FirefoxSignedInstaller.xpi
- name: Upload FirefoxSignedInstaller.xpi to release - name: Upload FirefoxSignedInstaller.xpi to release
uses: Shopify/upload-to-release@master uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with: with:
args: web-ext-artifacts/FirefoxSignedInstaller.xpi args: web-ext-artifacts/FirefoxSignedInstaller.xpi
name: FirefoxSignedInstaller.xpi name: FirefoxSignedInstaller.xpi

View File

@@ -9,8 +9,8 @@ jobs:
steps: steps:
# Initialization # Initialization
- uses: actions/checkout@v2 - uses: actions/checkout@v3
- uses: actions/setup-node@v2 - uses: actions/setup-node@v3
with: with:
node-version: '18' node-version: '18'
- run: npm ci - run: npm ci

View File

@@ -12,9 +12,8 @@ jobs:
update-oss: update-oss:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - uses: actions/checkout@v3
uses: actions/checkout@v2 - uses: actions/setup-node@v3
- uses: actions/setup-node@v2
with: with:
node-version: '18' node-version: '18'
- name: Install and generate attribution - name: Install and generate attribution
@@ -25,7 +24,8 @@ jobs:
mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt
- name: Create pull request to update list - name: Create pull request to update list
uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27 uses: peter-evans/create-pull-request@b4d51739f96fca8047ad065eccef63442d8e99f7
# v4.2.0
with: with:
commit-message: Update OSS Attribution commit-message: Update OSS Attribution
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

View File

@@ -8,8 +8,7 @@ jobs:
check-list: check-list:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - uses: actions/checkout@v3
uses: actions/checkout@v2
- name: Download instance list - name: Download instance list
run: | run: |
wget https://api.invidious.io/instances.json -O ci/data.json wget https://api.invidious.io/instances.json -O ci/data.json
@@ -19,7 +18,8 @@ jobs:
run: npm run ci:invidious run: npm run ci:invidious
- name: Create pull request to update list - name: Create pull request to update list
uses: peter-evans/create-pull-request@923ad837f191474af6b1721408744feb989a4c27 uses: peter-evans/create-pull-request@b4d51739f96fca8047ad065eccef63442d8e99f7
# v4.2.0
with: with:
commit-message: Update Invidious List commit-message: Update Invidious List
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

View File

@@ -1 +1 @@
["inv.cthd.icu","inv.riverside.rocks","invidio.xamh.de","invidious.kavin.rocks","invidious.namazso.eu","invidious.osi.kr","invidious.snopyta.org","vid.puffyan.us","yewtu.be","youtube.076.ne.jp","yt.artemislena.eu"] ["inv.bp.projectsegfau.lt","inv.odyssey346.dev","inv.riverside.rocks","inv.vern.cc","invidio.xamh.de","invidious.baczek.me","invidious.esmailelbob.xyz","invidious.flokinet.to","invidious.namazso.eu","invidious.nerdvpn.de","invidious.rhyshl.live","invidious.sethforprivacy.com","invidious.slipfox.xyz","invidious.snopyta.org","invidious.tiekoetter.com","invidious.weblibre.org","vid.puffyan.us","y.com.sb","yewtu.be","yt.artemislena.eu"]

View File

@@ -1,7 +1,7 @@
{ {
"name": "__MSG_fullName__", "name": "__MSG_fullName__",
"short_name": "SponsorBlock", "short_name": "SponsorBlock",
"version": "5.1.1", "version": "5.1.9",
"default_locale": "en", "default_locale": "en",
"description": "__MSG_Description__", "description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app", "homepage_url": "https://sponsor.ajay.app",

2976
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -8,23 +8,23 @@
"react-dom": "^18.2.0" "react-dom": "^18.2.0"
}, },
"devDependencies": { "devDependencies": {
"@types/chrome": "^0.0.197", "@types/chrome": "^0.0.199",
"@types/firefox-webext-browser": "^94.0.1", "@types/firefox-webext-browser": "^94.0.1",
"@types/jest": "^29.1.2", "@types/jest": "^29.2.0",
"@types/react": "^18.0.21", "@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6", "@types/react-dom": "^18.0.6",
"@types/selenium-webdriver": "^4.1.5", "@types/selenium-webdriver": "^4.1.6",
"@types/wicg-mediasession": "^1.1.4", "@types/wicg-mediasession": "^1.1.4",
"@typescript-eslint/eslint-plugin": "^5.39.0", "@typescript-eslint/eslint-plugin": "^5.40.1",
"@typescript-eslint/parser": "^5.39.0", "@typescript-eslint/parser": "^5.40.1",
"chromedriver": "^106.0.1", "chromedriver": "^106.0.1",
"concurrently": "^7.4.0", "concurrently": "^7.4.0",
"copy-webpack-plugin": "^11.0.0", "copy-webpack-plugin": "^11.0.0",
"eslint": "^8.24.0", "eslint": "^8.25.0",
"eslint-plugin-react": "^7.31.8", "eslint-plugin-react": "^7.31.10",
"fork-ts-checker-webpack-plugin": "^7.2.13", "fork-ts-checker-webpack-plugin": "^7.2.13",
"jest": "^29.1.2", "jest": "^29.2.1",
"jest-environment-jsdom": "^29.1.2", "jest-environment-jsdom": "^29.2.1",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"schema-utils": "^4.0.0", "schema-utils": "^4.0.0",
"selenium-webdriver": "^4.5.0", "selenium-webdriver": "^4.5.0",
@@ -33,7 +33,7 @@
"ts-loader": "^9.4.1", "ts-loader": "^9.4.1",
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
"typescript": "4.8", "typescript": "4.8",
"web-ext": "^7.2.0", "web-ext": "^7.3.1",
"webpack": "^5.74.0", "webpack": "^5.74.0",
"webpack-cli": "^4.10.0", "webpack-cli": "^4.10.0",
"webpack-merge": "^5.8.0" "webpack-merge": "^5.8.0"

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Възникна грешка с връзката. Код на грешката: " "message": "Възникна грешка с връзката. Код на грешката: "
}, },
"segmentsStillLoading": {
"message": "Сегментите все още се зареждат..."
},
"clearTimes": { "clearTimes": {
"message": "Изчистване на сегментите" "message": "Изчистване на сегментите"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Споделяне като URL" "message": "Споделяне като URL"
},
"segmentFetchFailureWarning": {
"message": "Внимание: сървърът все още не е отговорил със сегменти. В действителност може да има вече изпратени сегменти в този видеоклип, но просто не сте ги получили поради проблеми със сървъра."
},
"allowScrollingToEdit": {
"message": "Разрешаване на превъртане за редактиране на времената"
} }
} }

View File

@@ -35,6 +35,9 @@
"message": "অংশসমূহকে অধ্যায়সমূহতে পরিণত করুন", "message": "অংশসমূহকে অধ্যায়সমূহতে পরিণত করুন",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
}, },
"showSegmentNameInChapterBar": {
"message": "ভিডিও সময়ের পাশে বর্তমান সেগমেন্ট দেখান"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "এই জমাটিকে সমর্থন করুন" "message": "এই জমাটিকে সমর্থন করুন"
}, },
@@ -113,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "একটি সংযোগ ত্রুটি ঘটেছে. ভুল সংকেত: " "message": "একটি সংযোগ ত্রুটি ঘটেছে. ভুল সংকেত: "
}, },
"segmentsStillLoading": {
"message": "সেগমেন্ট এখনো লোড হচ্ছে..."
},
"clearTimes": { "clearTimes": {
"message": "বিভাগগুলি পরিষ্কার করুন" "message": "বিভাগগুলি পরিষ্কার করুন"
}, },
@@ -122,6 +128,9 @@
"closePopup": { "closePopup": {
"message": "পপআপ বন্ধ করুন" "message": "পপআপ বন্ধ করুন"
}, },
"closeIcon": {
"message": "বন্ধ করার চিহ্ন"
},
"SubmitTimes": { "SubmitTimes": {
"message": "সেগমেন্ট জমা দিন" "message": "সেগমেন্ট জমা দিন"
}, },
@@ -414,9 +423,18 @@
"statusReminder": { "statusReminder": {
"message": "সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।" "message": "সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।"
}, },
"changeUserID": {
"message": "‌আপনার ব্যক্তিগত ব্যবহারকারী আইডি ইম্পোর্ট/এক্সপোর্ট করুন"
},
"whatChangeUserID": { "whatChangeUserID": {
"message": "এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।" "message": "এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।"
}, },
"setUserID": {
"message": "ব্যক্তিগত ব্যবহারকারী আইডি সেট করুন"
},
"userIDChangeWarning": {
"message": "সতর্কতা: ব্যক্তিগত ব্যবহারকারী আইডি পরিবর্তন চিরস্থায়ী। আপনি কি নিশ্চিত যে আপনি এটি করত এ চান? এক্ষেত্রে আপনার পুরাতন আইডির ব্যাকআপ নিশ্চিত করুন। "
},
"createdBy": { "createdBy": {
"message": "সৃষ্টি করেছেন" "message": "সৃষ্টি করেছেন"
}, },
@@ -563,12 +581,19 @@
"message": "থেকে", "message": "থেকে",
"description": "Used between segments. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
}, },
"CopiedExclamation": {
"message": "কপি হয়েছে!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"category_sponsor": { "category_sponsor": {
"message": "স্পন্সর" "message": "স্পন্সর"
}, },
"category_sponsor_description": { "category_sponsor_description": {
"message": "পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।" "message": "পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।"
}, },
"category_sponsor_guideline1": {
"message": "পেইড প্রচারণা"
},
"category_selfpromo": { "category_selfpromo": {
"message": "বিনা অর্থপ্রাপ্ত/স্ব-প্রচার" "message": "বিনা অর্থপ্রাপ্ত/স্ব-প্রচার"
}, },
@@ -603,6 +628,9 @@
"category_intro_short": { "category_intro_short": {
"message": "ইন্টারমিশন" "message": "ইন্টারমিশন"
}, },
"category_intro_guideline1": {
"message": "মূল কনটেন্ট ব্যতীত ব্যবধান"
},
"category_outro": { "category_outro": {
"message": "এন্ডকার্ডস/ক্রেডিট" "message": "এন্ডকার্ডস/ক্রেডিট"
}, },
@@ -612,6 +640,9 @@
"category_preview": { "category_preview": {
"message": "প্রিভিউ/রিক্যাপ" "message": "প্রিভিউ/রিক্যাপ"
}, },
"category_preview_guideline2": {
"message": "আগের ভিডিওর রিক্যাপ"
},
"category_filler": { "category_filler": {
"message": "ফিলার ট্যানজেন্ট/জোকস" "message": "ফিলার ট্যানজেন্ট/জোকস"
}, },
@@ -633,6 +664,9 @@
"category_poi_highlight_description": { "category_poi_highlight_description": {
"message": "ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।" "message": "ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।"
}, },
"category_chapter": {
"message": "অধ্যায়"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "লাইভস্ট্রিম: অনুদান/বার্তা পাঠ" "message": "লাইভস্ট্রিম: অনুদান/বার্তা পাঠ"
}, },
@@ -663,6 +697,9 @@
"showOverlay_full": { "showOverlay_full": {
"message": "লেবেল দেখান" "message": "লেবেল দেখান"
}, },
"showOverlay_chapter": {
"message": "অধ্যায়গুলো দেখান"
},
"autoSkipOnMusicVideos": { "autoSkipOnMusicVideos": {
"message": "যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান" "message": "যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান"
}, },
@@ -718,6 +755,10 @@
"bracketEnd": { "bracketEnd": {
"message": "(শেষ)" "message": "(শেষ)"
}, },
"End": {
"message": "সমাপ্ত",
"description": "Button that skips to the end of a segment"
},
"hiddenDueToDownvote": { "hiddenDueToDownvote": {
"message": "লুক্কায়িতঃ ডাউনভোট" "message": "লুক্কায়িতঃ ডাউনভোট"
}, },
@@ -755,6 +796,13 @@
"downvoteDescription": { "downvoteDescription": {
"message": "সময় ভুল দেওয়া হয়েছে" "message": "সময় ভুল দেওয়া হয়েছে"
}, },
"incorrectVote": {
"message": "সঠিক নয়"
},
"harmfulVote": {
"message": "ক্ষতিকর",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
},
"incorrectCategory": { "incorrectCategory": {
"message": "বিভাগ পরিবর্তন করুন" "message": "বিভাগ পরিবর্তন করুন"
}, },
@@ -797,6 +845,12 @@
"hideForever": { "hideForever": {
"message": "চিরকালের জন্য এই বিষয়বস্তু লুকান" "message": "চিরকালের জন্য এই বিষয়বস্তু লুকান"
}, },
"questionButton": {
"message": "আমার একটি প্রশ্ন আছে"
},
"warningConfirmButton": {
"message": "আমি কারণ বুঝেছি"
},
"Donate": { "Donate": {
"message": "অনুদান" "message": "অনুদান"
}, },
@@ -869,6 +923,9 @@
"LearnMore": { "LearnMore": {
"message": "আরও জানুন" "message": "আরও জানুন"
}, },
"FullDetails": {
"message": "সম্পূর্ণ বিস্তারিত"
},
"CopyDownvoteButtonInfo": { "CopyDownvoteButtonInfo": {
"message": "ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে" "message": "ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে"
}, },
@@ -893,6 +950,12 @@
"hideSegment": { "hideSegment": {
"message": "অংশ আড়াল করুন" "message": "অংশ আড়াল করুন"
}, },
"skipSegment": {
"message": "সেগমেন্ট এড়িয়ে যান"
},
"playChapter": {
"message": "অধ্যায় চালু করুন"
},
"SponsorTimeEditScrollNewFeature": { "SponsorTimeEditScrollNewFeature": {
"message": "দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।" "message": "দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।"
}, },
@@ -949,5 +1012,33 @@
}, },
"openOptionsPage": { "openOptionsPage": {
"message": "বিকল্প পাতা খুলুন" "message": "বিকল্প পাতা খুলুন"
},
"resetToDefault": {
"message": "সেটিংস ডিফল্টে ফিরিয়ে নিন"
},
"exportSegments": {
"message": "সেগমেন্ট রপ্তানি করুন"
},
"importSegments": {
"message": "সেগমেন্ট আমদানী করুন"
},
"Import": {
"message": "আমদানী",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"chooseACountry": {
"message": "দেশ নির্বাচন করুন"
},
"videosSingular": {
"message": "ভিডিও",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "ভিডিওগুলি",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "সকল সেগমেন্ট পরিস্কার করুন",
"description": "Label for a button in settings"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Došlo k chybě připojení. Kód chyby: " "message": "Došlo k chybě připojení. Kód chyby: "
}, },
"segmentsStillLoading": {
"message": "Segmenty se stále načítají..."
},
"clearTimes": { "clearTimes": {
"message": "Vymazat segmenty" "message": "Vymazat segmenty"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Sdílet jako URL" "message": "Sdílet jako URL"
},
"segmentFetchFailureWarning": {
"message": "Varování: Server zatím neodpověděl se segmenty. U tohoto videa se již mohou nacházet odeslané segmenty, ale vy jste je neobdrželi kvůli chybě na serveru."
},
"allowScrollingToEdit": {
"message": "Povolit skrolování k časům úprav"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Der opstod en forbindelsesfejl. Fejlkode: " "message": "Der opstod en forbindelsesfejl. Fejlkode: "
}, },
"segmentsStillLoading": {
"message": "Segmenter indlæses stadig..."
},
"clearTimes": { "clearTimes": {
"message": "Ryd Segmenter" "message": "Ryd Segmenter"
}, },
@@ -1243,5 +1246,8 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Del som URL" "message": "Del som URL"
},
"segmentFetchFailureWarning": {
"message": "Advarsel: Serveren har endnu ikke svaret med segmenter. Der kan faktisk være segmenter på denne video, der allerede er indsendt, men du har bare ikke modtaget dem på grund af problemer med serveren."
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: " "message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
}, },
"segmentsStillLoading": {
"message": "Segmente werden noch geladen..."
},
"clearTimes": { "clearTimes": {
"message": "Alle Segmente löschen" "message": "Alle Segmente löschen"
}, },
@@ -369,7 +372,7 @@
"description": "Example: Sponsor Skipped" "description": "Example: Sponsor Skipped"
}, },
"muted": { "muted": {
"message": "{0} stumm geschaltet", "message": "{0} stummgeschalten",
"description": "Example: Sponsor Muted" "description": "Example: Sponsor Muted"
}, },
"skipped_to_category": { "skipped_to_category": {
@@ -521,7 +524,7 @@
"message": "Alle Einstellungen importieren/exportieren" "message": "Alle Einstellungen importieren/exportieren"
}, },
"exportOptionsCopy": { "exportOptionsCopy": {
"message": "Bearbeiten/kopieren" "message": "Bearbeiten/Kopieren"
}, },
"exportOptionsDownload": { "exportOptionsDownload": {
"message": "Als Datei speichern" "message": "Als Datei speichern"
@@ -1214,7 +1217,7 @@
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
}, },
"clearUnsubmittedSegments": { "clearUnsubmittedSegments": {
"message": "Alle Segmente löschen", "message": "Lösche alle Segmente",
"description": "Label for a button in settings" "description": "Label for a button in settings"
}, },
"clearUnsubmittedSegmentsConfirm": { "clearUnsubmittedSegmentsConfirm": {
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Als URL teilen" "message": "Als URL teilen"
},
"segmentFetchFailureWarning": {
"message": "Warnung: Der Server hat noch nicht mit Segmenten geantwortet. Möglicherweise gibt es bereits Segmente zu diesem Video, aber du hast sie aufgrund von Problemen mit dem Server noch nicht erhalten."
},
"allowScrollingToEdit": {
"message": "Scrollen zum Bearbeiten von Zeiten erlauben"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "A connection error has occurred. Error code: " "message": "A connection error has occurred. Error code: "
}, },
"segmentsStillLoading": {
"message": "Segments still loading..."
},
"clearTimes": { "clearTimes": {
"message": "Clear Segments" "message": "Clear Segments"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Share as URL" "message": "Share as URL"
},
"segmentFetchFailureWarning": {
"message": "Warning: The server hasn't responded with segments yet. There might actually be segments on this video already submitted but you just haven't recieved them due to issues with the server."
},
"allowScrollingToEdit": {
"message": "Allow Scrolling To Edit Times"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Ha ocurrido un error de conexión. Código de error: " "message": "Ha ocurrido un error de conexión. Código de error: "
}, },
"segmentsStillLoading": {
"message": "Los segmentos aún se están cargando..."
},
"clearTimes": { "clearTimes": {
"message": "Borrar Segmentos" "message": "Borrar Segmentos"
}, },
@@ -1135,7 +1138,7 @@
"message": "¡Canje exitoso!" "message": "¡Canje exitoso!"
}, },
"redeemFailed": { "redeemFailed": {
"message": "La clave de la licencia no es válida" "message": "La clave de la licencia es inválida"
}, },
"hideUpsells": { "hideUpsells": {
"message": "Ocultar opciones no disponibles sin pago extra" "message": "Ocultar opciones no disponibles sin pago extra"
@@ -1153,18 +1156,18 @@
"message": "Seleccione su país" "message": "Seleccione su país"
}, },
"alreadyDonated": { "alreadyDonated": {
"message": "Si has donado cualquier cantidad antes del presente, puedes canjear el acceso gratuito vía correo electrónico:", "message": "Si has donado cualquier cantidad antes de ahora, puedes canjear el acceso gratuito vía correo electrónico:",
"description": "After the colon is an email address" "description": "After the colon is an email address"
}, },
"cantAfford": { "cantAfford": {
"message": "Si no puedes permitirte comprar una licencia, haz clic en {here} para ver si eres elegible para un descuento", "message": "Si no puedes permitirte comprar una licencia, haz clic {aquí} para ver si eres elegible para un descuento",
"description": "Keep the curly braces. The word 'here' should be translated as well." "description": "Keep the curly braces. The word 'here' should be translated as well."
}, },
"patreonSignIn": { "patreonSignIn": {
"message": "Iniciar sesión con Patreon" "message": "Iniciar sesión con Patreon"
}, },
"redeem": { "redeem": {
"message": "Canje" "message": "Canjear"
}, },
"joinOnPatreon": { "joinOnPatreon": {
"message": "Danos tu apoyo en Patreon" "message": "Danos tu apoyo en Patreon"
@@ -1194,7 +1197,7 @@
"description": "Example: You currently have 12 unsubmitted segments on 5 videos" "description": "Example: You currently have 12 unsubmitted segments on 5 videos"
}, },
"unsubmittedSegmentCountsZero": { "unsubmittedSegmentCountsZero": {
"message": "Actualmente no tiene segmentos no enviados", "message": "Actualmente no tiene segmentos sin enviar",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments" "description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
}, },
"unsubmittedSegmentsSingular": { "unsubmittedSegmentsSingular": {
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Compartir como URL" "message": "Compartir como URL"
},
"segmentFetchFailureWarning": {
"message": "Advertencia: El servidor aún no ha respondido con segmentos. Es posible que haya segmentos en este video ya enviados, pero no los ha recibido debido a problemas con el servidor."
},
"allowScrollingToEdit": {
"message": "Permitir desplazamiento para editar tiempos"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Ühendusega esines tõrge. Veakood: " "message": "Ühendusega esines tõrge. Veakood: "
}, },
"segmentsStillLoading": {
"message": "Segmendid on veel laadimas..."
},
"clearTimes": { "clearTimes": {
"message": "Tühjenda segmendid" "message": "Tühjenda segmendid"
}, },
@@ -706,6 +709,9 @@
"category_chapter": { "category_chapter": {
"message": "Peatükk" "message": "Peatükk"
}, },
"category_chapter_guideline1": {
"message": "Ära maini sponsorite brändi nimesid"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "Otseülekanne: annetuste ja sõnumite lugemine" "message": "Otseülekanne: annetuste ja sõnumite lugemine"
}, },
@@ -914,6 +920,9 @@
"helpPageReviewOptions": { "helpPageReviewOptions": {
"message": "Palun vaata allolevad valikud üle" "message": "Palun vaata allolevad valikud üle"
}, },
"helpPageFeatureDisclaimer": {
"message": "Paljud funktsioonid on vaikimisi välja lülitatud. Kui sa soovid jätta vahele vaheaejad, kasutada Invidioust jms, lülita need allpool sisse. Sa saad ka peita/kuvada kasutajaliidese elemente."
},
"helpPageHowSkippingWorks": { "helpPageHowSkippingWorks": {
"message": "Kuidas vahelejätmine töötab" "message": "Kuidas vahelejätmine töötab"
}, },
@@ -1140,5 +1149,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Jaga URLina" "message": "Jaga URLina"
},
"segmentFetchFailureWarning": {
"message": "Hoiatus: Server ei ole veel segmentidega vastanud. Sellel videol võivad juba olla saadetud segmendid, aga sa ei ole veel neid serveri vea tõttu saanud."
},
"allowScrollingToEdit": {
"message": "Luba aegade muutmiseks kerimine"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Yhteysvirhe on tapahtunut. Virhekoodi: " "message": "Yhteysvirhe on tapahtunut. Virhekoodi: "
}, },
"segmentsStillLoading": {
"message": "Osioita ladataan yhä..."
},
"clearTimes": { "clearTimes": {
"message": "Tyhjennä osiot" "message": "Tyhjennä osiot"
}, },
@@ -238,7 +241,7 @@
"message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen" "message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen"
}, },
"trackDownvotesWarning": { "trackDownvotesWarning": {
"message": "Varoitus: Tämän poistaminen käytöstä poistaa kaikki aiemmin tallennetut alaäänet" "message": "Varoitus: Tämän käytöstä poisto poistaa kaikki aiemmat negatiiviset äänet"
}, },
"enableQueryByHashPrefix": { "enableQueryByHashPrefix": {
"message": "Kysely tiiviste-etuliittellä" "message": "Kysely tiiviste-etuliittellä"
@@ -887,7 +890,7 @@
"message": "Virheellinen/väärä aika" "message": "Virheellinen/väärä aika"
}, },
"incorrectVote": { "incorrectVote": {
"message": "Väärä" "message": "Virheellinen"
}, },
"harmfulVote": { "harmfulVote": {
"message": "Haitallinen", "message": "Haitallinen",
@@ -939,7 +942,7 @@
"message": "Piilota ikuisesti" "message": "Piilota ikuisesti"
}, },
"warningChatInfo": { "warningChatInfo": {
"message": "Huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahalleen tehtyjä" "message": "Huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole haitallisia"
}, },
"warningTitle": { "warningTitle": {
"message": "Sait varoituksen" "message": "Sait varoituksen"
@@ -1097,7 +1100,7 @@
"description": "Option label" "description": "Option label"
}, },
"unbind": { "unbind": {
"message": "Poista kytkös", "message": "Poista liitos",
"description": "Unbind keyboard shortcut" "description": "Unbind keyboard shortcut"
}, },
"notSet": { "notSet": {
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Jaa URL-osoitteena" "message": "Jaa URL-osoitteena"
},
"segmentFetchFailureWarning": {
"message": "Varoitus: Palvelin ei ole vielä toimittanut osiotietoja. Video saattaa sisältää jo lähetettyjä osioita, mutta et vain ole vielä vastaanottanut niitä palvelinongelmien takia."
},
"allowScrollingToEdit": {
"message": "Salli aikojen muokkaaminen skrollaamalla"
} }
} }

View File

@@ -35,6 +35,9 @@
"message": "Affiche les segments en tant que chapitre", "message": "Affiche les segments en tant que chapitre",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
}, },
"showSegmentNameInChapterBar": {
"message": "Afficher le segment actuel à côté de du temps de la vidéo"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Voter pour cette entrée" "message": "Voter pour cette entrée"
}, },
@@ -113,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Erreur de connexion. Code d'erreur : " "message": "Erreur de connexion. Code d'erreur : "
}, },
"segmentsStillLoading": {
"message": "Segments toujours en cours de chargement..."
},
"clearTimes": { "clearTimes": {
"message": "Effacer les segments" "message": "Effacer les segments"
}, },
@@ -122,6 +128,9 @@
"closePopup": { "closePopup": {
"message": "Fermer le Popup" "message": "Fermer le Popup"
}, },
"closeIcon": {
"message": "Icône \"Fermer\""
},
"SubmitTimes": { "SubmitTimes": {
"message": "Soumettre des segments" "message": "Soumettre des segments"
}, },
@@ -246,6 +255,12 @@
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "Si la vidéo vient de sortir et qu'aucun segment n'a été encore trouvé, SponsorBlock en cherchera durant la lecture de la vidéo." "message": "Si la vidéo vient de sortir et qu'aucun segment n'a été encore trouvé, SponsorBlock en cherchera durant la lecture de la vidéo."
}, },
"enableShowCategoryWithoutPermission": {
"message": "Afficher les catégories dans le menu des contributions, même celles sans autorisation"
},
"whatShowCategoryWithoutPermission": {
"message": "Certaines catégories nécessitent une autorisation en raison d'exigences minimales de réputation"
},
"showNotice": { "showNotice": {
"message": "Afficher la notification" "message": "Afficher la notification"
}, },
@@ -408,9 +423,18 @@
"statusReminder": { "statusReminder": {
"message": "Vérifiez status.sponsor.ajay.app pour le status du serveur." "message": "Vérifiez status.sponsor.ajay.app pour le status du serveur."
}, },
"changeUserID": {
"message": "Importer/Exporter Votre ID privé d'utilisateur"
},
"whatChangeUserID": { "whatChangeUserID": {
"message": "Il doit rester privé. 0 l'instar d'un mot de passe, il ne doit être partagé avec personne. Si une autre personne est en possession de cette information, elle peut usurper votre identité SponsorBlock. Si vous cherchez votre UserID public, cliquez sur l'icône du presse-papiers dans l'encart." "message": "Il doit rester privé. 0 l'instar d'un mot de passe, il ne doit être partagé avec personne. Si une autre personne est en possession de cette information, elle peut usurper votre identité SponsorBlock. Si vous cherchez votre UserID public, cliquez sur l'icône du presse-papiers dans l'encart."
}, },
"setUserID": {
"message": "Définir l'ID privé d'utilisateur"
},
"userIDChangeWarning": {
"message": "Avertissement : La modification de l'ID privé d'utilisateur est permanente. Êtes-vous sûr de vouloir faire ça ? Assurez-vous de sauvegarder l'ancien au cas où."
},
"createdBy": { "createdBy": {
"message": "Créé par" "message": "Créé par"
}, },
@@ -508,6 +532,9 @@
"exportOptionsUpload": { "exportOptionsUpload": {
"message": "Charger à partir du fichier" "message": "Charger à partir du fichier"
}, },
"whatExportOptions": {
"message": "Contient toute votre configuration au format JSON. Inclut votre ID privé d'utilisateur, donc ne le partagez pas."
},
"setOptions": { "setOptions": {
"message": "Définir les options" "message": "Définir les options"
}, },
@@ -670,6 +697,9 @@
"category_filler": { "category_filler": {
"message": "Digressions/Blagues" "message": "Digressions/Blagues"
}, },
"category_filler_description": {
"message": "Digressions ajoutées uniquement dans un but de remplissage ou de l'humour non requis pour comprendre le sujet principal de la vidéo. Ne dois pas inclure des segments fournissant du contexte ou des détails de fond. Il s'agit d'une catégorie très agressive destinée aux moments qui ne sont pas \"pour le fun\"."
},
"category_filler_short": { "category_filler_short": {
"message": "Remplissage" "message": "Remplissage"
}, },
@@ -1025,6 +1055,12 @@
"hideSegment": { "hideSegment": {
"message": "Cacher le segment" "message": "Cacher le segment"
}, },
"skipSegment": {
"message": "Passer le segment"
},
"playChapter": {
"message": "Jouer le chapitre"
},
"SponsorTimeEditScrollNewFeature": { "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 maj peuvent être utilisées pour affiner les modifications." "message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches ctrl ou maj peuvent être utilisées pour affiner les modifications."
}, },
@@ -1145,10 +1181,17 @@
"chaptersPage1": { "chaptersPage1": {
"message": "La fonctionnalité participative des chapitres de SponsorBlock n'est disponible que pour les personnes qui achètent une licence, ou pour les personnes qui en ont l'accès gratuitement grâce à leurs contributions passées" "message": "La fonctionnalité participative des chapitres de SponsorBlock n'est disponible que pour les personnes qui achètent une licence, ou pour les personnes qui en ont l'accès gratuitement grâce à leurs contributions passées"
}, },
"chaptersPage2": {
"message": "Remarque : l'autorisation d'envoyer des chapitres est toujours basée sur la réputation calculée. L'achat d'une licence vous permet uniquement de voir les chapitres envoyés par d'autres",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": { "chapterNewFeature": {
"message": "Nouvelle fonctionnalité : Chapitres personnalisés crowd-sourcés. Ce sont des sections dans les vidéos avec un nom personnalisé qui s'améliore au fur et à mesure. Achetez une licence pour voir les chapitres soumis sur cette vidéo tels que: ", "message": "Nouvelle fonctionnalité : Chapitres personnalisés crowd-sourcés. Ce sont des sections dans les vidéos avec un nom personnalisé qui s'améliore au fur et à mesure. Achetez une licence pour voir les chapitres soumis sur cette vidéo tels que: ",
"description": "After the comma, a list of chapters for this video will appear" "description": "After the comma, a list of chapters for this video will appear"
}, },
"chapterNewFeature2": {
"message": "Nouvelle fonctionnalité : Chapitres personnalisés crowd-sourcés. Ce sont des sections dans les vidéos avec un nom personnalisé qui peuvent s'additionner pour être de plus en plus précis. Vous y avez accès gratuitement, activez la dans les options."
},
"unsubmittedSegmentCounts": { "unsubmittedSegmentCounts": {
"message": "Vous avez actuellement {0} sur {1}", "message": "Vous avez actuellement {0} sur {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos" "description": "Example: You currently have 12 unsubmitted segments on 5 videos"
@@ -1203,5 +1246,8 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Partager un URL" "message": "Partager un URL"
},
"segmentFetchFailureWarning": {
"message": "Attention : Le serveur n'a pas encore répondu avec les segments. Il se peut qu'il y ait des segments sur cette vidéo déjà soumise, mais vous ne les avez tout simplement pas reçus en raison de problèmes avec le serveur."
} }
} }

View File

@@ -31,6 +31,13 @@
"Chapters": { "Chapters": {
"message": "פרקים" "message": "פרקים"
}, },
"renderAsChapters": {
"message": "עיבוד מקטעים כפרקים",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "הצגת מקטע נוכחי לצד זמן וידאו"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "הצבע לדיווח הזה" "message": "הצבע לדיווח הזה"
}, },
@@ -95,7 +102,7 @@
"message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה." "message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה."
}, },
"refreshSegments": { "refreshSegments": {
"message": "רענן מקטעים" "message": יענון מקטעים"
}, },
"success": { "success": {
"message": "הצלחה!" "message": "הצלחה!"
@@ -109,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "התקבלה שגיאת חיבור. קוד השגיאה: " "message": "התקבלה שגיאת חיבור. קוד השגיאה: "
}, },
"segmentsStillLoading": {
"message": "מקטע עדיין נטען..."
},
"clearTimes": { "clearTimes": {
"message": "נקה מקטעים" "message": "נקה מקטעים"
}, },
@@ -118,9 +128,15 @@
"closePopup": { "closePopup": {
"message": "סגור חלון" "message": "סגור חלון"
}, },
"closeIcon": {
"message": "סגירת סמליל"
},
"SubmitTimes": { "SubmitTimes": {
"message": "הגש מקטעים" "message": "הגש מקטעים"
}, },
"sortSegments": {
"message": "מיון מקטעים"
},
"submitCheck": { "submitCheck": {
"message": "אתה בטוח שאתה רוצה להזין את זה?" "message": "אתה בטוח שאתה רוצה להזין את זה?"
}, },
@@ -153,43 +169,46 @@
"message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים" "message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים"
}, },
"clearTimesButton": { "clearTimesButton": {
"message": קה זמנים" "message": יקוי זמנים"
}, },
"submitTimesButton": { "submitTimesButton": {
"message": "הגש זמנים" "message": "הגשת זמנים"
}, },
"publicStats": { "publicStats": {
"message": "זה משומש בעמוד הסטטים הפומביים כדי להראות כמה תרמת. צפה בזה" "message": "זה משמש בדף הסטטיסטיקה הציבורי כדי להראות כמה תרמת. ניתן לצפות בזה"
}, },
"Username": { "Username": {
"message": "שם משתמש" "message": "שם משתמש"
}, },
"setUsername": { "setUsername": {
"message": "הגדר שם משתמש" "message": "הגדרת שם משתמש"
}, },
"copyPublicID": { "copyPublicID": {
"message": "העתק קוד משתמש פומבי" "message": "העתקת מזהה משתמש פומבי"
},
"copySegmentID": {
"message": "העתקת מזהה מקטע"
}, },
"discordAdvert": { "discordAdvert": {
"message": "הצטרף לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!" "message": "הצטרפות לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!"
}, },
"hideThis": { "hideThis": {
"message": "הסתר" "message": "להסתיר את זה"
}, },
"Options": { "Options": {
"message": "אפשרויות" "message": "אפשרויות"
}, },
"showButtons": { "showButtons": {
"message": ראה כפתורים על הנגן של יוטיוב" "message": צגת כפתורים על הנגן של יוטיוב"
}, },
"hideButtons": { "hideButtons": {
"message": "הסתר כפתורים על הנגן של יוטיוב" "message": "הסתרת כפתורים על הנגן של יוטיוב"
}, },
"hideButtonsDescription": { "hideButtonsDescription": {
"message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג." "message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג."
}, },
"showSkipButton": { "showSkipButton": {
"message": "השאר את כפתור הדילוג לשיא הסרטון על הנגן באופן קבוע" "message": "השארת כפתור הדילוג להדגשה על הנגן"
}, },
"showInfoButton": { "showInfoButton": {
"message": "הראה כפתור מידע בנגן YouTube" "message": "הראה כפתור מידע בנגן YouTube"
@@ -198,16 +217,16 @@
"message": "החבא כפתור מידע בנגן YouTube" "message": "החבא כפתור מידע בנגן YouTube"
}, },
"autoHideInfoButton": { "autoHideInfoButton": {
"message": "הסתר אוטומטית כפתורי אינפורמציה" "message": "הסתרה אוטומטית של כפתורי אינפורמציה"
}, },
"hideDeleteButton": { "hideDeleteButton": {
"message": "הסתר כפתור מחיקה על הנגן של יוטיוב" "message": "הסתרת כפתור מחיקה על הנגן של יוטיוב"
}, },
"showDeleteButton": { "showDeleteButton": {
"message": "הצג כפתור מחיקה על הנגן של יוטיוב" "message": "הצגת כפתור מחיקה על הנגן של יוטיוב"
}, },
"whatViewTracking": { "whatViewTracking": {
"message": "הפיצ'ר הזה עוקב אחרי מקטעים שדילגת עליהם בכדי ליידע משתמשים אחרים כמה ההגשות שלך עזרו לאחרים ושומשו כמטריקה יחד עם ההצבעות בעד בכדי להבטיח שלא ייכנס ספאם אל תוך המערכת. ההרחבה שולחת הודעה לשרת בכל פעם שאתה מדלג על מקטע. התקווה היא שרוב האנשים לא ישנו את ההגדרה הזו כדי שהמספרי צפייה יהיו מדוייקים :)" "message": "תכונה זו עוקבת אחר אילו מקטעים דילגת כדי לאפשר למשתמשים לדעת עד כמה ההגשה שלהם עזרה לאחרים והשתמשה כמדד יחד עם הצבעות בעד כדי להבטיח שספאם לא ייכנס למסד הנתונים. התוסף שולח הודעה לשרת בכל פעם שאתה מדלג על קטע. אני מקווה שרוב האנשים לא ישנו את ההגדרה הזו כדי שמספרי התצוגה יהיו מדויקים. :)"
}, },
"website": { "website": {
"message": "אתר", "message": "אתר",
@@ -221,22 +240,66 @@
"message": "הפרק הבא", "message": "הפרק הבא",
"description": "Keybind label" "description": "Keybind label"
}, },
"disableSkipping": {
"message": "דילוג מופעל"
},
"enableSkipping": {
"message": "דילוג מושבת"
},
"yourWork": { "yourWork": {
"message": "העבודה שלך", "message": "העבודה שלך",
"description": "Used to describe the section that will show you the statistics from your submissions." "description": "Used to describe the section that will show you the statistics from your submissions."
}, },
"502": {
"message": "נראה שהשרת עמוס יתר על המידה. יש לנסות שוב בעוד מספר שניות."
},
"errorCode": { "errorCode": {
"message": "קוד שגיאה: " "message": "קוד שגיאה: "
}, },
"skip": { "skip": {
"message": לג" "message": ילוג"
}, },
"mute": { "mute": {
"message": "השתק" "message": "השתקה"
},
"full": {
"message": "וידיאו מלא",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "דילוג {0}?"
}, },
"mute_category": { "mute_category": {
"message": "השתק {0}?" "message": "השתק {0}?"
}, },
"skip_to_category": {
"message": "דילוג אל {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} דולג",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} מושתק",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "דילוג אל {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "השבתת דילוג אוטומטי"
},
"enableAutoSkip": {
"message": "הפעלת דילוג אוטומטי"
},
"audioNotification": {
"message": "הודעת שמע בעת דילוג"
},
"youHaveSkipped": {
"message": "דילגת "
},
"minLower": { "minLower": {
"message": "דקה" "message": "דקה"
}, },
@@ -266,35 +329,38 @@
"add": { "add": {
"message": "הוסף" "message": "הוסף"
}, },
"showUploadButton": {
"message": "הצגת כפתור העלאה"
},
"save": { "save": {
"message": "שמור" "message": "שמירה"
}, },
"reset": { "reset": {
"message": "אתחל" "message": יתחול"
}, },
"exportOptionsCopy": { "exportOptionsCopy": {
"message": "ערוך/העתק" "message": "עריכה/העתקה"
}, },
"exportOptionsDownload": { "exportOptionsDownload": {
"message": "שמור לקובץ" "message": "שמירה לקובץ"
}, },
"exportOptionsUpload": { "exportOptionsUpload": {
"message": "טען מקובץ" "message": "טעינה מקובץ"
}, },
"setOptions": { "setOptions": {
"message": "הגדר אפשרויות" "message": "הגדרת אפשרויות"
}, },
"confirmNoticeTitle": { "confirmNoticeTitle": {
"message": "הגש מקטע" "message": "הגשת מקטע"
}, },
"submit": { "submit": {
"message": "הגש" "message": "הגשה"
}, },
"cancel": { "cancel": {
"message": "ביטול" "message": "ביטול"
}, },
"delete": { "delete": {
"message": "מחק" "message": "מחיקה"
}, },
"preview": { "preview": {
"message": "תצוגה מקדימה" "message": "תצוגה מקדימה"
@@ -303,7 +369,7 @@
"message": "לא מוגש" "message": "לא מוגש"
}, },
"inspect": { "inspect": {
"message": "סקור" "message": "סקירה"
}, },
"edit": { "edit": {
"message": "עריכה" "message": "עריכה"
@@ -312,12 +378,19 @@
"message": "עד ל", "message": "עד ל",
"description": "Used between segments. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
}, },
"CopiedExclamation": {
"message": "הועתק!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"category_sponsor": { "category_sponsor": {
"message": "נותן חסות" "message": "נותן חסות"
}, },
"category_exclusive_access": { "category_exclusive_access": {
"message": "גישה אקסקלוסיבית" "message": "גישה אקסקלוסיבית"
}, },
"category_filler_short": {
"message": "מסנן"
},
"category_music_offtopic": { "category_music_offtopic": {
"message": "מוזיקה: קטעים ללא מוזיקה" "message": "מוזיקה: קטעים ללא מוזיקה"
}, },
@@ -327,17 +400,29 @@
"category_poi_highlight": { "category_poi_highlight": {
"message": "קטע חשוב" "message": "קטע חשוב"
}, },
"category_chapter": {
"message": "פרק"
},
"autoSkip": { "autoSkip": {
"message": "דילוג אוטומטי" "message": "דילוג אוטומטי"
}, },
"manualSkip": { "manualSkip": {
"message": לג ידנית" "message": ילוג ידני"
}, },
"showOverlay": { "showOverlay": {
"message": "הראה בטיימליין" "message": "הראה בשורת חיפוש"
},
"disable": {
"message": "מושבת"
}, },
"showOverlay_POI": { "showOverlay_POI": {
"message": "הראה בטיימליין" "message": "הראה בשורת חיפוש"
},
"showOverlay_full": {
"message": "הצגת תוית"
},
"showOverlay_chapter": {
"message": "הצגת פרקים"
}, },
"category": { "category": {
"message": "קטגוריה" "message": "קטגוריה"
@@ -353,16 +438,23 @@
"message": "עוד קטגוריות" "message": "עוד קטגוריות"
}, },
"chooseACategory": { "chooseACategory": {
"message": "בחר קטגוריה" "message": "בחירת קטגוריה"
}, },
"bracketEnd": { "bracketEnd": {
"message": "(סוף)" "message": "(סוף)"
}, },
"End": {
"message": "סוף",
"description": "Button that skips to the end of a segment"
},
"downvoteDescription": { "downvoteDescription": {
"message": "זמן שגוי/לא נכון" "message": "זמן שגוי/לא נכון"
}, },
"incorrectVote": {
"message": "שגוי"
},
"incorrectCategory": { "incorrectCategory": {
"message": נה קטגוריה" "message": ינוי קטגוריה"
}, },
"multipleSegments": { "multipleSegments": {
"message": "מספר מקטעים" "message": "מספר מקטעים"
@@ -389,22 +481,34 @@
"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." "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": { "hideForever": {
"message": "הסתר לעד" "message": "הסתרה לעד"
},
"questionButton": {
"message": "יש לי שאלה נוספת"
},
"warningConfirmButton": {
"message": "הבנתי את הסיכונים"
},
"warningError": {
"message": "שגיאה בעת ניסיון לאשר אזהרה:"
}, },
"Donate": { "Donate": {
"message": "תרום" "message": "תרומה"
}, },
"considerDonating": { "considerDonating": {
"message": "עזרו לממן את הפיתוח" "message": "עזרו לממן את הפיתוח"
}, },
"hideDonationLink": { "hideDonationLink": {
"message": "הסתר כפתור תרומה" "message": "הסתרת כפתור תרומה"
},
"darkModeOptionsPage": {
"message": "מצב כהה בדף האפשרויות"
}, },
"helpPageThanksForInstalling": { "helpPageThanksForInstalling": {
"message": "תודה שהתקנת את ספונסרבלוק." "message": "תודה שהתקנת את ספונסרבלוק."
}, },
"helpPageReviewOptions": { "helpPageReviewOptions": {
"message": "אנא סקור את האפשרויות הבאות" "message": "נא לסקור את האפשרויות הבאות"
}, },
"helpPageHowSkippingWorks": { "helpPageHowSkippingWorks": {
"message": "כיצד דילוג עובד" "message": "כיצד דילוג עובד"
@@ -433,15 +537,39 @@
"LearnMore": { "LearnMore": {
"message": "למידע נוסף" "message": "למידע נוסף"
}, },
"FullDetails": {
"message": "פרטים מלאים"
},
"CopyDownvoteButtonInfo": {
"message": "הצבעה שלילית ויצירת עותק מקומי שניתן לשלוח מחדש"
},
"OpenCategoryWikiPage": {
"message": "פתיחת דף הוויקי של קטגוריה זו."
},
"CopyAndDownvote": { "CopyAndDownvote": {
"message": "העתק ועשה דיסלייק" "message": "העתקה ודירוג שלילי"
}, },
"ContinueVoting": { "ContinueVoting": {
"message": "המשך להצביע" "message": "המשך הצבעה"
}, },
"ChangeCategoryTooltip": { "ChangeCategoryTooltip": {
"message": "זה מיידית ישפיע על כל המקטעים שלך" "message": "זה מיידית ישפיע על כל המקטעים שלך"
}, },
"downvote": {
"message": "דירוג שלילי"
},
"upvote": {
"message": "דירוג חיובי"
},
"hideSegment": {
"message": "הסתרת מקטע"
},
"skipSegment": {
"message": "דילוכ מקטע"
},
"playChapter": {
"message": "הפעלת פרק"
},
"SponsorTimeEditScrollNewFeature": { "SponsorTimeEditScrollNewFeature": {
"message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי." "message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי."
}, },
@@ -449,11 +577,11 @@
"message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי" "message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי"
}, },
"dayAbbreviation": { "dayAbbreviation": {
"message": "ימים", "message": "י",
"description": "100d" "description": "100d"
}, },
"hourAbbreviation": { "hourAbbreviation": {
"message": עות", "message": '",
"description": "100h" "description": "100h"
}, },
"optionsTabBehavior": { "optionsTabBehavior": {
@@ -472,6 +600,18 @@
"message": "גיבוי/שחזור", "message": "גיבוי/שחזור",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." "description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
}, },
"optionsTabAdvanced": {
"message": "שונות",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "דילוג על הופעת הודעה",
"description": "Option label"
},
"unbind": {
"message": "ביטול איגוד",
"description": "Unbind keyboard shortcut"
},
"notSet": { "notSet": {
"message": "לא הוגדר" "message": "לא הוגדר"
}, },
@@ -480,5 +620,143 @@
}, },
"youtubeKeybindWarning": { "youtubeKeybindWarning": {
"message": "זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?" "message": "זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?"
},
"betaServerWarning": {
"message": "שרת ביטא מופעל!"
},
"openOptionsPage": {
"message": "פתיחת דף האפשרויות"
},
"resetToDefault": {
"message": "איפוס הגדרות לברירת המחדל"
},
"confirmResetToDefault": {
"message": "האם בוודאות ברצונך לאפס את כל ההגדרות לערכי ברירת המחדל שלהן? אי אפשר לבטל את זה."
},
"exportSegments": {
"message": "ייצוא מקטעים"
},
"importSegments": {
"message": "ייבוא מקטעים"
},
"Import": {
"message": "ייבוא",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"redeemSuccess": {
"message": "המימוש הצליח!"
},
"redeemFailed": {
"message": "רשיון מפתח שגוי"
},
"hideUpsells": {
"message": "הסתרת אפשרויות שאינן זמינות ללא תשלום נוסף"
},
"chooseACountry": {
"message": "בחירת מדינה"
},
"noDiscount": {
"message": "לא נמצאה זכאות להנחה"
},
"discountLink": {
"message": "קישור להנחה (ראה מחיר ורוד)"
},
"selectYourCountry": {
"message": "בחירת מדינתך"
},
"alreadyDonated": {
"message": "אם תרמת סכום כלשהו בעבר, ניתן לממש גישה בחינם באמצעות דואר אלקטרוני:",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "אם אינך יכול להרשות לעצמך לרכוש רישיון, יש ללחוץ {here} כדי לראות אם קיימת זכאות להנחה",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": {
"message": "כניסה באמצעות Patreon"
},
"redeem": {
"message": "מימוש"
},
"joinOnPatreon": {
"message": "מינוי באמצעות Patreon"
},
"oneTimePurchase": {
"message": "רכישה חד פעמית"
},
"enterLicenseKey": {
"message": "הזנת מפתח רישיון"
},
"chaptersPage1": {
"message": "התכונה חסימת פרקים במקור המונים זמינה רק לאנשים שרוכשים רישיון, או לאנשים שקיבלו גישה בחינם עקב תרומותיהם בעבר"
},
"chaptersPage2": {
"message": "הערה: ההרשאה להגשת פרקים עדיין מבוססת על מוניטין מחושב. רכישת רישיון מאפשרת לך לראות רק פרקים שהוגשו על ידי אחרים",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": {
"message": "תכונה חדשה: פרקים מותאמים אישית ממקור המונים. אלו הם מקטעים בעלי שמות מותאמים אישית בסרטונים שניתן לערום כדי לקבל יותר ויותר דיוק. רכישת רישיון לצפייה בפרקים שנשלחו בסרטון זה כגון: ",
"description": "After the comma, a list of chapters for this video will appear"
},
"chapterNewFeature2": {
"message": "תכונה חדשה: פרקים מותאמים אישית ממקור המונים. אלו הם קטעים בעלי שמות מותאמים אישית בסרטונים שניתן לערום כדי לקבל יותר ויותר דיוק. יש לך גישה בחינם, יש להפעיל באפשרויות."
},
"unsubmittedSegmentCounts": {
"message": "כרגע יש לך {0} ב-{1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"unsubmittedSegmentCountsZero": {
"message": "אין לך כרגע מקטעים שלא הוגשו",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
},
"unsubmittedSegmentsSingular": {
"message": "מקטע שלא הוגש",
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
},
"unsubmittedSegmentsPlural": {
"message": "מקטעים שלא הוגשו",
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
},
"videosSingular": {
"message": "סרטון",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "סרטונים",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "ניקוי כל המקטעים",
"description": "Label for a button in settings"
},
"clearUnsubmittedSegmentsConfirm": {
"message": "האם בוודאות ברצונך למחוק את כל המקטעים שלא הוגשוו?",
"description": "Confirmation message for the Clear unsubmitted segments button"
},
"showUnsubmittedSegments": {
"message": "הצגת מקטעים",
"description": "Show/hide button for the unsubmitted segments list"
},
"hideUnsubmittedSegments": {
"message": "הסתרת מקטעים",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "מזהה סרטון",
"description": "Header of the unsubmitted segments list"
},
"segmentCount": {
"message": "ספירת מקטעים",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "פעולות",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "שיתוף כקישור"
},
"segmentFetchFailureWarning": {
"message": "אזהרה: השרת עדיין לא הגיב עם מקטעים. ייתכן שלמעשה יש מקטעים בסרטון הזה שכבר נשלחו אבל פשוט לא קיבלת אותם בגלל בעיות בשרת."
} }
} }

View File

@@ -25,24 +25,143 @@
"Segments": { "Segments": {
"message": "खंडों" "message": "खंडों"
}, },
"SegmentsCap": {
"message": "खंड"
},
"Chapters": {
"message": "चैप्टर"
},
"renderAsChapters": {
"message": "खंडो को चैप्टर के रूप में दिखाएँ",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "वीडियो समय के अलावा वर्तमान खंड दिखाएँ"
},
"upvoteButtonInfo": {
"message": "इस प्रस्तुतीकरण को वॉट दें"
},
"reportButtonTitle": {
"message": "रिपोर्ट"
},
"reportButtonInfo": {
"message": "इस प्रस्तुतीकरण को गलत रिपोर्ट करें"
},
"Dismiss": { "Dismiss": {
"message": "रद्द करें" "message": "रद्द करें"
}, },
"Loading": { "Loading": {
"message": "लोड कर रहा है..." "message": "लोड कर रहा है..."
}, },
"Hide": {
"message": "कभी नही दिखाएँ"
},
"hitGoBack": {
"message": "जहाँ से आप आये थी वहां पर जाने के लिए अनस्किप दबाएं।"
},
"unskip": {
"message": "अनस्किप"
},
"reskip": {
"message": "रिस्किप"
},
"unmute": {
"message": "अनम्यूट"
},
"paused": { "paused": {
"message": "रुका हुआ" "message": "रुका हुआ"
}, },
"manualPaused": {
"message": "टाइम रुका"
},
"confirmMSG": {
"message": "अलग-अलग मानों को संपादित करने या हटाने के लिए, जानकारी बटन पर क्लिक करें या ऊपरी दाएं कोने में एक्सटेंशन आइकन पर क्लिक करके एक्सटेंशन पॉपअप खोलें।"
},
"clearThis": { "clearThis": {
"message": "क्या आप वाकई इसे साफ़ करना चाहते हैं?\n\n" "message": "क्या आप वाकई इसे साफ़ करना चाहते हैं?\n\n"
}, },
"Unknown": {
"message": "आपका प्रायोजक समय सबमिट करने में एक त्रुटि हुई, कृपया बाद में पुन: प्रयास करें।"
},
"sponsorFound": {
"message": "इस वीडियो के खंड डेटाबेस में हैं!"
},
"sponsor404": {
"message": "कोई खंड नहीं मिले"
},
"sponsorStart": {
"message": "खंड अभी शुरू करें"
},
"sponsorEnd": { "sponsorEnd": {
"message": "खंड अब समाप्त होता है" "message": "खंड अब समाप्त होता है"
}, },
"sponsorCancel": {
"message": "खंड बनाना रद्द करें"
},
"noVideoID": {
"message": "कोई YouTube वीडियो नही मिली।\nअगर यह गलत है, तो इस तब को रिफ्रेश कीजिये।"
},
"refreshSegments": {
"message": "खंड रिफ्रेश करें"
},
"success": { "success": {
"message": "सफल!" "message": "सफल!"
}, },
"voted": {
"message": "वॉट किया!"
},
"serverDown": {
"message": "ऐसा लगता है की सर्वर डाउन है। कृपया डेवलपर से तुरंत संपर्क करें।"
},
"connectionError": {
"message": "एक संपर्क गलती हो गयी है। गलती कूट: "
},
"clearTimes": {
"message": "खंड हटाएँ"
},
"openPopup": {
"message": "SponsorBlock पॉपअप खोलें"
},
"closePopup": {
"message": "पॉपअप बंद करें"
},
"closeIcon": {
"message": "आइकॉन बंद करें"
},
"SubmitTimes": {
"message": "खंड दर्ज करें"
},
"sortSegments": {
"message": "खंड छांटें"
},
"submitCheck": {
"message": "क्या आप वाकई इसे दर्ज करना चाहते हैं?"
},
"whitelistChannel": {
"message": "चैनल व्हाइटलिस्ट करें"
},
"removeFromWhitelist": {
"message": "चैनल को व्हाइटलिस्ट से हटाएँ"
},
"voteOnTime": {
"message": "एक खंड को वॉट करें"
},
"Submissions": {
"message": "प्रविष्टियां"
},
"savedPeopleFrom": {
"message": "आपने लोगो को बचाया है "
},
"viewLeaderboard": {
"message": "लीडरबोर्ड"
},
"recordTimesDescription": {
"message": "दर्ज करें"
},
"submissionEditHint": {
"message": "सबमिट पर क्लिक करने के बाद अनुभाग सम्पादन दिखाई देगा",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"Options": { "Options": {
"message": "विकल्प" "message": "विकल्प"
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Kapcsolódási probléma merült fel. Hibakód: " "message": "Kapcsolódási probléma merült fel. Hibakód: "
}, },
"segmentsStillLoading": {
"message": "Szegmensek betöltése folyamatban..."
},
"clearTimes": { "clearTimes": {
"message": "Szegmensek törlése" "message": "Szegmensek törlése"
}, },
@@ -1243,5 +1246,8 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Megosztás linkként" "message": "Megosztás linkként"
},
"segmentFetchFailureWarning": {
"message": "Figyelem: A szerver még nem válaszolt szegmensekkel. Elképzelhető, hogy már vannak beküldött szegmensek ezen a videón, csak még nem töltődtek be szerver-problémák miatt."
} }
} }

View File

@@ -25,6 +25,19 @@
"Segments": { "Segments": {
"message": "segmen" "message": "segmen"
}, },
"SegmentsCap": {
"message": "Segmen"
},
"Chapters": {
"message": "Bab"
},
"renderAsChapters": {
"message": "Jadikan segmen sebagai bab",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "Tampilkan Segmen Saat Ini di Samping Waktu Video"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Upvote submisi ini" "message": "Upvote submisi ini"
}, },
@@ -103,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Kesalahan koneksi terjadi. Kode kesalahan: " "message": "Kesalahan koneksi terjadi. Kode kesalahan: "
}, },
"segmentsStillLoading": {
"message": "Segmen masih dimuat..."
},
"clearTimes": { "clearTimes": {
"message": "Hapus Segmen" "message": "Hapus Segmen"
}, },
@@ -112,9 +128,15 @@
"closePopup": { "closePopup": {
"message": "Tutup Popup" "message": "Tutup Popup"
}, },
"closeIcon": {
"message": "Tutup Ikon"
},
"SubmitTimes": { "SubmitTimes": {
"message": "Kirim Segmen" "message": "Kirim Segmen"
}, },
"sortSegments": {
"message": "Urutkan Segmen"
},
"submitCheck": { "submitCheck": {
"message": "Apakah anda yakin ingin mengirim ini?" "message": "Apakah anda yakin ingin mengirim ini?"
}, },
@@ -233,6 +255,12 @@
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "Jika ini merupakan video baru, dan tidak ada segmen yang ditemukan, SponsorBlock akan terus merefetch setiap beberapa menit saat anda menonton." "message": "Jika ini merupakan video baru, dan tidak ada segmen yang ditemukan, SponsorBlock akan terus merefetch setiap beberapa menit saat anda menonton."
}, },
"enableShowCategoryWithoutPermission": {
"message": "Tampilkan kategori di dalam menu submisi bahkan tanpa izin submisi"
},
"whatShowCategoryWithoutPermission": {
"message": "Beberapa kategori memerlukan izin untuk mengirim karena persyaratan reputasi minimum"
},
"showNotice": { "showNotice": {
"message": "Tampilkan Pemberitahuan Lagi" "message": "Tampilkan Pemberitahuan Lagi"
}, },
@@ -243,19 +271,19 @@
"message": "Tampilkan Bantuan Kategori" "message": "Tampilkan Bantuan Kategori"
}, },
"noticeVisibilityMode0": { "noticeVisibilityMode0": {
"message": "Lewati maklumat ukuran penuh" "message": "Pemberitahuan Lewati Ukuran Penuh"
}, },
"noticeVisibilityMode1": { "noticeVisibilityMode1": {
"message": "Maklumat lewati kecil untuk lewati otomatis" "message": "Pemberitahuan Lewati Kecil untuk Lewati Otomatis"
}, },
"noticeVisibilityMode2": { "noticeVisibilityMode2": {
"message": "Lewati semua maklumat kecil" "message": "Semua Pemberitahuan Lewati Kecil"
}, },
"noticeVisibilityMode3": { "noticeVisibilityMode3": {
"message": "Pudar maklumat lewati untuk semua lewati otomatis" "message": "Pemberitahuan Lewati Pudar untuk Lewati Otomatis"
}, },
"noticeVisibilityMode4": { "noticeVisibilityMode4": {
"message": "Lewati semua maklumat pudar" "message": "Semua Pemberitahuan Lewati Pudar"
}, },
"longDescription": { "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.", "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.",
@@ -289,6 +317,14 @@
"message": "Kirim segmen", "message": "Kirim segmen",
"description": "Keybind label" "description": "Keybind label"
}, },
"nextChapterKeybind": {
"message": "Bab selanjutnya",
"description": "Keybind label"
},
"previousChapterKeybind": {
"message": "Bab sebelumnya",
"description": "Keybind label"
},
"keybindDescription": { "keybindDescription": {
"message": "Pilih sebuah tombol dengan mengetikkannya dan pilih tombol modifier apa saja yang Anda ingin gunakan." "message": "Pilih sebuah tombol dengan mengetikkannya dan pilih tombol modifier apa saja yang Anda ingin gunakan."
}, },
@@ -387,8 +423,17 @@
"statusReminder": { "statusReminder": {
"message": "Cek status.sponsor.ajay.app untuk status server." "message": "Cek status.sponsor.ajay.app untuk status server."
}, },
"changeUserID": {
"message": "Impor/Ekspor UserID Pribadi Anda"
},
"whatChangeUserID": { "whatChangeUserID": {
"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." "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 pribadi"
},
"userIDChangeWarning": {
"message": "Peringatan: Mengubah UserID Pribadi bersifat permanen. Apakah Anda yakin ingin melakukan ini? Pastikan Anda telah mencadangkan yang lama untuk berjaga-jaga."
}, },
"createdBy": { "createdBy": {
"message": "Dibuat Oleh" "message": "Dibuat Oleh"
@@ -397,7 +442,7 @@
"message": "Dukung Situs Youtube Pihak Ketiga" "message": "Dukung Situs Youtube Pihak Ketiga"
}, },
"supportOtherSitesDescription": { "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.", "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" "description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
}, },
"supportedSites": { "supportedSites": {
@@ -433,6 +478,9 @@
"minDurationDescription": { "minDurationDescription": {
"message": "Segmen yang lebih kecil dari nilai yang diatur tidak akan dilewati atau tampil di pemutar." "message": "Segmen yang lebih kecil dari nilai yang diatur tidak akan dilewati atau tampil di pemutar."
}, },
"enableManualSkipOnFullVideo": {
"message": "Gunakan lewati manual jika ada label seluruh video"
},
"whatManualSkipOnFullVideo": { "whatManualSkipOnFullVideo": {
"message": "Untuk yang ingin menonton video tanpa gangguan jika sepenuhnya disponsori atau promosi sendiri." "message": "Untuk yang ingin menonton video tanpa gangguan jika sepenuhnya disponsori atau promosi sendiri."
}, },
@@ -484,6 +532,9 @@
"exportOptionsUpload": { "exportOptionsUpload": {
"message": "Muat dari file" "message": "Muat dari file"
}, },
"whatExportOptions": {
"message": "Ini adalah seluruh konfigurasi Anda di JSON. Ini mencakup UserID Pribadi Anda, maka pastikan Anda membagikan ini dengan bijak."
},
"setOptions": { "setOptions": {
"message": "Atur Opsi" "message": "Atur Opsi"
}, },
@@ -536,6 +587,10 @@
"message": "sampai", "message": "sampai",
"description": "Used between segments. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
}, },
"CopiedExclamation": {
"message": "Tersalin!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"generic_guideline1": { "generic_guideline1": {
"message": "Tampilkan transisi segue" "message": "Tampilkan transisi segue"
}, },
@@ -681,6 +736,21 @@
"category_poi_highlight_guideline3": { "category_poi_highlight_guideline3": {
"message": "Dapat melewati ke judul atau thumbnail" "message": "Dapat melewati ke judul atau thumbnail"
}, },
"category_chapter": {
"message": "Bab"
},
"category_chapter_description": {
"message": "Bab bernama khusus yang menjelaskan bagian utama video."
},
"category_chapter_guideline1": {
"message": "Jangan menyebutkan nama merek sponsor"
},
"category_chapter_guideline2": {
"message": "Gunakan bab yang lebih besar untuk bagian umum"
},
"category_chapter_guideline3": {
"message": "Bab yang lebih kecil dapat ditempatkan di dalam yang lebih besar"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "Livestream: Baca Pesan/Donasi" "message": "Livestream: Baca Pesan/Donasi"
}, },
@@ -711,6 +781,9 @@
"showOverlay_full": { "showOverlay_full": {
"message": "Tampilkan Label" "message": "Tampilkan Label"
}, },
"showOverlay_chapter": {
"message": "Tampilkan Bab"
},
"autoSkipOnMusicVideos": { "autoSkipOnMusicVideos": {
"message": "Lewati semua segmen secara otomatis ketika ada segmen non-music" "message": "Lewati semua segmen secara otomatis ketika ada segmen non-music"
}, },
@@ -766,6 +839,10 @@
"bracketEnd": { "bracketEnd": {
"message": "(Selesai)" "message": "(Selesai)"
}, },
"End": {
"message": "Akhir",
"description": "Button that skips to the end of a segment"
},
"hiddenDueToDownvote": { "hiddenDueToDownvote": {
"message": "disembunyikan: voting rendah" "message": "disembunyikan: voting rendah"
}, },
@@ -779,6 +856,9 @@
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "ID Channel belum dimuat. Apabila anda menggunakan video yang tersematkan, coba menggunakan halaman utama YouTube. Hal ini juga dapat disebabkan oleh perubahan yang ada pada tampilan YouTUbe, apabila anda mengira seperti itu, buat komentar disini:" "message": "ID Channel belum dimuat. Apabila anda menggunakan video yang tersematkan, coba menggunakan halaman utama YouTube. Hal ini juga dapat disebabkan oleh perubahan yang ada pada tampilan YouTUbe, apabila anda mengira seperti itu, buat komentar disini:"
}, },
"invidiousPermissionRefresh": {
"message": "Peramban telah mencabut izin yang diperlukan untuk berfungsi di Invidious dan situs pihak ketiga lainnya. Klik tombol di bawah untuk mengaktifkan kembali izin ini."
},
"acceptPermission": { "acceptPermission": {
"message": "Terima permintaan izin" "message": "Terima permintaan izin"
}, },
@@ -803,6 +883,13 @@
"downvoteDescription": { "downvoteDescription": {
"message": "Salah, Waktu Tidak Tepat" "message": "Salah, Waktu Tidak Tepat"
}, },
"incorrectVote": {
"message": "Salah"
},
"harmfulVote": {
"message": "Berbahaya",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
},
"incorrectCategory": { "incorrectCategory": {
"message": "Ubah Kategori" "message": "Ubah Kategori"
}, },
@@ -838,6 +925,9 @@
"categoryPillTitleText": { "categoryPillTitleText": {
"message": "Seluruh video ini ditandai sebagai kategori ini dan terlalu terintegrasi untuk dapat dipisahkan" "message": "Seluruh video ini ditandai sebagai kategori ini dan terlalu terintegrasi untuk dapat dipisahkan"
}, },
"chapterNameTooltipWarning": {
"message": "Salah satu nama bab Anda mirip dengan sebuah kategori. Anda harus menggunakan kategori jika memungkinkan sebagai gantinya."
},
"experiementOptOut": { "experiementOptOut": {
"message": "Tidak ikut eksperimen masa depan", "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." "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."
@@ -845,6 +935,21 @@
"hideForever": { "hideForever": {
"message": "Sembunyikan selamanya" "message": "Sembunyikan selamanya"
}, },
"warningChatInfo": {
"message": "Kami melihat Anda membuat beberapa kesalahan umum yang tidak tersengaja"
},
"warningTitle": {
"message": "Anda mendapatkan peringatan"
},
"questionButton": {
"message": "Saya memiliki pertanyaan"
},
"warningConfirmButton": {
"message": "Saya mengerti alasannya"
},
"warningError": {
"message": "Terjadi kesalahan ketika mengakui peringatan:"
},
"Donate": { "Donate": {
"message": "Donasi" "message": "Donasi"
}, },
@@ -864,16 +969,16 @@
"message": "Haram ditinjau opsi di bawah ini" "message": "Haram ditinjau opsi di bawah ini"
}, },
"helpPageFeatureDisclaimer": { "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." "message": "Banyak fitur yang dinonaktifkan secara bawaan. Jika Anda ingin melewati intro, outro, mengunakan Invidious, dll, aktifkan mereka dibawah ini. Anda juga bisa menyembunyikan/menampilkan elemen UI."
}, },
"helpPageHowSkippingWorks": { "helpPageHowSkippingWorks": {
"message": "Cara kerja melewati segmen" "message": "Cara kerja melewati segmen"
}, },
"helpPageHowSkippingWorks1": { "helpPageHowSkippingWorks1": {
"message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya." "message": "Segmen video akan otomatis dilewati jika ditemukan di basis data. Anda bisa mumbuka popup dengan mengklik ikon ekstensi untuk mendapatkan pratinjau tersebut."
}, },
"helpPageHowSkippingWorks2": { "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." "message": "Kapanpun Anda melewati segmen, Anda akan mendapatkan pemberitahuan. Jika pengaturan waktu terlihat salah tolak dengan mengklik jempol bawah! Anda juga dapat memilih dalam popup."
}, },
"Submitting": { "Submitting": {
"message": "Mengirim" "message": "Mengirim"
@@ -944,6 +1049,12 @@
"hideSegment": { "hideSegment": {
"message": "Sembunyikan segmen" "message": "Sembunyikan segmen"
}, },
"skipSegment": {
"message": "Lewati segmen"
},
"playChapter": {
"message": "Mulai bab"
},
"SponsorTimeEditScrollNewFeature": { "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." "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."
}, },
@@ -1006,5 +1117,124 @@
}, },
"confirmResetToDefault": { "confirmResetToDefault": {
"message": "Apakah Anda yakin ingin mengatur ulang semua pengaturan ke nilai bawaan?\nTindakan ini tidak dapat diurungkan." "message": "Apakah Anda yakin ingin mengatur ulang semua pengaturan ke nilai bawaan?\nTindakan ini tidak dapat diurungkan."
},
"exportSegments": {
"message": "Ekspor segmen"
},
"importSegments": {
"message": "Impor segmen"
},
"Import": {
"message": "Impor",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"redeemSuccess": {
"message": "Penukaran Berhasil!"
},
"redeemFailed": {
"message": "Kunci lisensi tidak valid"
},
"hideUpsells": {
"message": "Sembunyikan opsi yang tidak tersedia tanpa pembayaran tambahan"
},
"chooseACountry": {
"message": "Pilih negara"
},
"noDiscount": {
"message": "Anda tidak memenuhi syarat untuk mendapatkan diskon"
},
"discountLink": {
"message": "Tautan Diskon (Lihat harga pink)"
},
"selectYourCountry": {
"message": "Pilih negaramu"
},
"alreadyDonated": {
"message": "Jika Anda pernah meyumbangkan jumlah berapapun, Anda dapat menebus akses gratis dengan menyurel:",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "Jika Anda tidak mampu membeli lisensi, klik {here} untuk melihat jika Anda memenuhi syarat untuk mendapatkan diskon",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": {
"message": "Masuk dengan Patreon"
},
"redeem": {
"message": "Tukar"
},
"joinOnPatreon": {
"message": "Gabung di Patreon"
},
"oneTimePurchase": {
"message": "Pembelian satu kali"
},
"enterLicenseKey": {
"message": "Masukkan Kode Lisensi"
},
"chaptersPage2": {
"message": "Catatan: Izin untuk mengirim bab tetap bedasarkan reputasi yang diperhitungkan. Membeli lisensi hanya memperbolehkan Anda untuk melihat bab yang dikirim oleh orang lain",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"unsubmittedSegmentCounts": {
"message": "Kamu mempunyai {0} dalam {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"unsubmittedSegmentCountsZero": {
"message": "Anda tidak mempunyai segmen yang belum dikirim",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
},
"unsubmittedSegmentsSingular": {
"message": "segmen yang belum dikirim",
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
},
"unsubmittedSegmentsPlural": {
"message": "segmen yang belum dikirim",
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
},
"videosSingular": {
"message": "video",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "video",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "Hapus semua segmen",
"description": "Label for a button in settings"
},
"clearUnsubmittedSegmentsConfirm": {
"message": "Yakin ingin menghapus semua segmen yang belum disubmit?",
"description": "Confirmation message for the Clear unsubmitted segments button"
},
"showUnsubmittedSegments": {
"message": "Tampilkan Segmen",
"description": "Show/hide button for the unsubmitted segments list"
},
"hideUnsubmittedSegments": {
"message": "Sembunyikan segmen",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "ID Video",
"description": "Header of the unsubmitted segments list"
},
"segmentCount": {
"message": "Jumlah Segmen",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "Tindakan",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "Bagikan sebagai Tautan"
},
"segmentFetchFailureWarning": {
"message": "Peringatan: Server belum merespon dengan segmen. Mungkin sebenarnya sudah ada segmen di video ini namun Anda belum menerimanya karena ada masalah dengan server."
},
"allowScrollingToEdit": {
"message": "Izinkan Menggulir Untuk Menyunting Waktu"
} }
} }

View File

@@ -36,7 +36,7 @@
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
}, },
"showSegmentNameInChapterBar": { "showSegmentNameInChapterBar": {
"message": "Mostra il Segmento Corrente Affianco al Tempo del Video" "message": "Mostra il Segmento Corrente Affianco alla Durata del Video"
}, },
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Vota questo contributo" "message": "Vota questo contributo"
@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Si è verificato un errore durante la connessione. Codice errore: " "message": "Si è verificato un errore durante la connessione. Codice errore: "
}, },
"segmentsStillLoading": {
"message": "Segmenti in caricamento..."
},
"clearTimes": { "clearTimes": {
"message": "Rimuovi i segmenti" "message": "Rimuovi i segmenti"
}, },
@@ -132,7 +135,7 @@
"message": "Invia i segmenti" "message": "Invia i segmenti"
}, },
"sortSegments": { "sortSegments": {
"message": "Ordina segmenti" "message": "Ordina Segmenti"
}, },
"submitCheck": { "submitCheck": {
"message": "Sei sicuro di volerlo inviare?" "message": "Sei sicuro di volerlo inviare?"
@@ -235,7 +238,7 @@
"message": "Memorizza i voti negativi del segmento" "message": "Memorizza i voti negativi del segmento"
}, },
"whatTrackDownvotes": { "whatTrackDownvotes": {
"message": "Segmenti votati negativamente rimarranno nascosti anche dopo aver ricaricato la pagina" "message": "I segmenti votati negativamente rimarranno nascosti anche dopo aver ricaricato la pagina"
}, },
"trackDownvotesWarning": { "trackDownvotesWarning": {
"message": "Attenzione: Disabilitarlo eliminerà tutti i voti negativi precedentemente memorizzati" "message": "Attenzione: Disabilitarlo eliminerà tutti i voti negativi precedentemente memorizzati"
@@ -256,7 +259,7 @@
"message": "Mostra le categorie nel menu d'invio anche senza l'autorizzazione all'invio" "message": "Mostra le categorie nel menu d'invio anche senza l'autorizzazione all'invio"
}, },
"whatShowCategoryWithoutPermission": { "whatShowCategoryWithoutPermission": {
"message": "Alcune categorie richiedono l'autorizzazione all'invio a causa dei requisiti di reputazione minimi" "message": "Alcune categorie richiedono l'autorizzazione all'invio a causa dei requisiti sulla reputazione minima"
}, },
"showNotice": { "showNotice": {
"message": "Mostra di nuovo l'avviso" "message": "Mostra di nuovo l'avviso"
@@ -307,11 +310,11 @@
"description": "Keybind label" "description": "Keybind label"
}, },
"setStartSponsorShortcut": { "setStartSponsorShortcut": {
"message": "Inizia/Finisci segmento", "message": "Inizio/Fine segmento",
"description": "Keybind label" "description": "Keybind label"
}, },
"setSubmitKeybind": { "setSubmitKeybind": {
"message": "Invia i segmenti", "message": "Invia segmenti",
"description": "Keybind label" "description": "Keybind label"
}, },
"nextChapterKeybind": { "nextChapterKeybind": {
@@ -323,7 +326,7 @@
"description": "Keybind label" "description": "Keybind label"
}, },
"keybindDescription": { "keybindDescription": {
"message": "Seleziona un tasto digitandolo e scegli qualsiasi tasto modificatore che desideri utilizzare." "message": "Seleziona un tasto digitandolo e spunta qualsiasi tasto modificatore che desideri utilizzare."
}, },
"0": { "0": {
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù." "message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
@@ -479,7 +482,7 @@
"message": "Usa il salto manuale quando esiste un'etichetta del video completo" "message": "Usa il salto manuale quando esiste un'etichetta del video completo"
}, },
"whatManualSkipOnFullVideo": { "whatManualSkipOnFullVideo": {
"message": "Per le persone che vogliono guardare il video senza interruzioni se contiene sponsorizzazioni o auto-promozioni." "message": "Per le persone che vogliono guardare il video senza interruzioni se contiene sponsorizzazioni o autopromozioni."
}, },
"skipNoticeDuration": { "skipNoticeDuration": {
"message": "Salta durata avviso (secondi):" "message": "Salta durata avviso (secondi):"
@@ -578,7 +581,7 @@
"message": "Le informazioni di debug sono state copiate nel clip board. Sentiti libero di rimuovere tutte le informazioni che preferisci non condividere. Salva in un file di testo o incollale nella segnalazione di bug." "message": "Le informazioni di debug sono state copiate nel clip board. Sentiti libero di rimuovere tutte le informazioni che preferisci non condividere. Salva in un file di testo o incollale nella segnalazione di bug."
}, },
"keyAlreadyUsed": { "keyAlreadyUsed": {
"message": "Questa scorciatoia è associata ad un'altra azione. Selezionane una diversa." "message": "Questa scorciatoia è associata a un'altra azione. Selezionane una diversa."
}, },
"to": { "to": {
"message": "a", "message": "a",
@@ -592,7 +595,7 @@
"message": "Includi transizioni" "message": "Includi transizioni"
}, },
"generic_guideline2": { "generic_guideline2": {
"message": "Riproduci come se nulla fosse stato saltato" "message": "Riprodotto come se non ci fossero salti"
}, },
"category_sponsor": { "category_sponsor": {
"message": "Sponsorizzazione" "message": "Sponsorizzazione"
@@ -613,22 +616,22 @@
"message": "Simile alle \"sponsorizzazioni\" tranne che per promozioni non pagate o autopromozioni. Ciò include sezioni riguardanti vendita di merce, donazioni o informazioni in merito a collaboratori." "message": "Simile alle \"sponsorizzazioni\" tranne che per promozioni non pagate o autopromozioni. Ciò include sezioni riguardanti vendita di merce, donazioni o informazioni in merito a collaboratori."
}, },
"category_selfpromo_guideline1": { "category_selfpromo_guideline1": {
"message": "Donazioni, abbonamenti e merce personalizzata" "message": "Donazioni, abbonamenti e merchandise personalizzato"
}, },
"category_selfpromo_guideline2": { "category_selfpromo_guideline2": {
"message": "Shoutout non pagati che non aggiungono nulla al video" "message": "Shoutout non pagati che non aggiungono nulla al video"
}, },
"category_selfpromo_guideline3": { "category_selfpromo_guideline3": {
"message": "Non per prodotti progettati da aziende e merce" "message": "Non per prodotti aziendali e merchandise"
}, },
"category_exclusive_access": { "category_exclusive_access": {
"message": "Accesso Esclusivo" "message": "Accesso Esclusivo"
}, },
"category_exclusive_access_description": { "category_exclusive_access_description": {
"message": "Solo per etichettare interi video. Usato quando un video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato." "message": "Solo per etichettare interi video. Usato quando un video mostra un prodotto, un servizio o un luogo che è stato ricevuto gratuitamente o a cui si ha avuto un accesso sovvenzionato."
}, },
"category_exclusive_access_pill": { "category_exclusive_access_pill": {
"message": "Questo video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato", "message": "Questo video mostra un prodotto, un servizio o un luogo che è stato ricevuto gratuitamente o a cui si ha avuto un accesso sovvenzionato",
"description": "Short description for this category" "description": "Short description for this category"
}, },
"category_exclusive_access_guideline1": { "category_exclusive_access_guideline1": {
@@ -641,13 +644,13 @@
"message": "Quando nel punto centrale del contenuto è presente un breve promemoria per like, iscrizione o follow. Se dovesse risultare esteso o riguardante qualcosa di specifico, potrebbe essere auto-promozione." "message": "Quando nel punto centrale del contenuto è presente un breve promemoria per like, iscrizione o follow. Se dovesse risultare esteso o riguardante qualcosa di specifico, potrebbe essere auto-promozione."
}, },
"category_interaction_guideline1": { "category_interaction_guideline1": {
"message": "Brevi promemoria per mi piace, iscrizioni o follow" "message": "Brevi inviti a mettere mi piace, follow o iscriversi"
}, },
"category_interaction_guideline2": { "category_interaction_guideline2": {
"message": "Include promemoria indiretti al commento" "message": "Include inviti indiretti a commentare"
}, },
"category_interaction_guideline3": { "category_interaction_guideline3": {
"message": "Non per promozione generale, solo chiamata all'azione" "message": "Non per promozione generale, solo inviti all'interazione"
}, },
"category_interaction_short": { "category_interaction_short": {
"message": "Promemoria d'Interazione" "message": "Promemoria d'Interazione"
@@ -662,7 +665,7 @@
"message": "Intermezzo" "message": "Intermezzo"
}, },
"category_intro_guideline1": { "category_intro_guideline1": {
"message": "Intervallo senza contenuto effettivo" "message": "Sezione senza contenuto effettivo"
}, },
"category_intro_guideline2": { "category_intro_guideline2": {
"message": "Non per transizioni con informazioni" "message": "Non per transizioni con informazioni"
@@ -680,13 +683,13 @@
"message": "Anteprima/Riepilogo" "message": "Anteprima/Riepilogo"
}, },
"category_preview_description": { "category_preview_description": {
"message": "Raccolta di clip che mostra cosa succederà in questo video o altri video in una serie, in cui tutte le informazioni sono ripetute in seguito nel video." "message": "Raccolta di clip che mostra cosa succederà in questo video o altri video in una serie, tutte le informazioni sono ripetute in seguito nel video."
}, },
"category_preview_guideline1": { "category_preview_guideline1": {
"message": "Clip che appaiono più tardi in questo video, oppure in un video futuro" "message": "Clip che appaiono in seguito in questo video, oppure in un video futuro"
}, },
"category_preview_guideline2": { "category_preview_guideline2": {
"message": "Riepilogo o riassunto di un video precedente" "message": "Riepilogo di un video precedente"
}, },
"category_preview_guideline3": { "category_preview_guideline3": {
"message": "Non per sezioni che aggiungono contenuti in più" "message": "Non per sezioni che aggiungono contenuti in più"
@@ -695,16 +698,16 @@
"message": "Riempitivi irrilevanti/Battute" "message": "Riempitivi irrilevanti/Battute"
}, },
"category_filler_description": { "category_filler_description": {
"message": "Scene tangenziali aggiunte solo come riempimento o per umorismo, non necessarie alla comprensione del contenuto principale del video. Questo non dovrebbe includere i segmenti che forniscono contesto o dettagli di background. Questa è una categoria molto aggressiva, pensata per quanto non hai voglia di \"divertirti\"." "message": "Scene tangenziali aggiunte solo come riempimento o per umorismo, non necessarie alla comprensione del contenuto principale del video. Non dovrebbe includere i segmenti che forniscono contesto o dettagli di background. Questa è una categoria molto aggressiva, pensata per quanto non si è in un mood \"divertente\"."
}, },
"category_filler_short": { "category_filler_short": {
"message": "Filler" "message": "Filler"
}, },
"category_filler_guideline1": { "category_filler_guideline1": {
"message": "Scene non correlate usate solo per filler o umorismo" "message": "Scene non correlate usate solo come filler o umorismo"
}, },
"category_filler_guideline2": { "category_filler_guideline2": {
"message": "Distrazioni, blooper, replay" "message": "Distrazioni, bloopers, replay"
}, },
"category_filler_guideline3": { "category_filler_guideline3": {
"message": "Non per scene necessarie a capire l'argomento" "message": "Non per scene necessarie a capire l'argomento"
@@ -737,7 +740,7 @@
"message": "Può ignorare il contesto" "message": "Può ignorare il contesto"
}, },
"category_poi_highlight_guideline3": { "category_poi_highlight_guideline3": {
"message": "Può portare al titolo o alla miniatura del video" "message": "Può saltare al contenuto del titolo o dell'anteprima"
}, },
"category_chapter": { "category_chapter": {
"message": "Capitolo" "message": "Capitolo"
@@ -752,7 +755,7 @@
"message": "Usa capitoli più grandi per le sezioni generali" "message": "Usa capitoli più grandi per le sezioni generali"
}, },
"category_chapter_guideline3": { "category_chapter_guideline3": {
"message": "I capitoli più piccoli possono essere collocati all'interno di quelli più grandi" "message": "Dei capitoli più piccoli possono essere collocati all'interno di quelli più grandi"
}, },
"category_livestream_messages": { "category_livestream_messages": {
"message": "Livestream: Donazione/Letture dei Messaggi" "message": "Livestream: Donazione/Letture dei Messaggi"
@@ -794,7 +797,7 @@
"message": "Silenzia i segmenti invece di saltarli, quando possibile" "message": "Silenzia i segmenti invece di saltarli, quando possibile"
}, },
"fullVideoSegments": { "fullVideoSegments": {
"message": "Mostra un'icona quando un video è interamente una pubblicità", "message": "Mostra un'icona quando un video è interamente promozionale",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
}, },
"previewColor": { "previewColor": {
@@ -853,7 +856,7 @@
"message": "nascosto: troppo corto" "message": "nascosto: troppo corto"
}, },
"manuallyHidden": { "manuallyHidden": {
"message": "nascosta manualmente" "message": "nascosto manualmente"
}, },
"channelDataNotFound": { "channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
@@ -878,7 +881,7 @@
"message": "Forza controllo canale prima di andare avanti" "message": "Forza controllo canale prima di andare avanti"
}, },
"whatForceChannelCheck": { "whatForceChannelCheck": {
"message": "Di default, verranno saltati i segmenti subito, anche prima che si sappia il canale. Di default, alcuni segmenti all'inizio del video potrebbero essere saltati sui canali nella whitelist. L'attivazione di questa opzione eviterà che ciò accada, ma ogni salto avrà un leggero ritardo in quanto ottenere l'ID del canale può richiedere un certo tempo. Questo ritardo potrebbe essere impercettibile se si dispone di una connessione internet veloce." "message": "Di default, verranno saltati i segmenti immediatamente, anche prima di verificare se il canale è in whitelist. Di default, alcuni segmenti all'inizio del video potrebbero essere saltati anche sui canali in whitelist. L'attivazione di questa opzione eviterà che ciò accada, ma ogni salto avrà un leggero ritardo in quanto ottenere l'ID del canale può richiedere un certo tempo. Questo ritardo potrebbe essere impercettibile con una connessione internet veloce."
}, },
"forceChannelCheckPopup": { "forceChannelCheckPopup": {
"message": "Considera l'Attivazione dell'opzione \"Forza la Verifica del Canale Prima del Salto\"" "message": "Considera l'Attivazione dell'opzione \"Forza la Verifica del Canale Prima del Salto\""
@@ -887,10 +890,10 @@
"message": "Tempo Non Corretto/Errato" "message": "Tempo Non Corretto/Errato"
}, },
"incorrectVote": { "incorrectVote": {
"message": "Non corretto" "message": "Errato"
}, },
"harmfulVote": { "harmfulVote": {
"message": "Dannoso", "message": "Offensivo",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster" "description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
}, },
"incorrectCategory": { "incorrectCategory": {
@@ -923,10 +926,10 @@
"description": "Used as the button to dismiss a tooltip" "description": "Used as the button to dismiss a tooltip"
}, },
"fullVideoTooltipWarning": { "fullVideoTooltipWarning": {
"message": "Questo segmento è grande. Se l'intero video è su un argomento, passa da \"Salta\" a \"Video Completo\". Vedi le linee guida per ulteriori informazioni." "message": "Questo segmento è grande. Se l'intero video è su un unico argomento, passa da \"Salta\" a \"Video Completo\". Vedi le linee guida per ulteriori informazioni."
}, },
"categoryPillTitleText": { "categoryPillTitleText": {
"message": "Questo intero video è etichettato come questa categoria ed è troppo integrato per poterlo separarare" "message": "Questo intero video è etichettato con questa categoria ed è troppo integrato per poterlo separare"
}, },
"chapterNameTooltipWarning": { "chapterNameTooltipWarning": {
"message": "Uno dei nomi dei tuoi capitoli è simile a una categoria. Quando possibile dovresti usare le categorie." "message": "Uno dei nomi dei tuoi capitoli è simile a una categoria. Quando possibile dovresti usare le categorie."
@@ -939,10 +942,10 @@
"message": "Nascondi per sempre" "message": "Nascondi per sempre"
}, },
"warningChatInfo": { "warningChatInfo": {
"message": "Abbiamo notato che stavi facendo alcuni errori comuni che non sono dannosi" "message": "Abbiamo notato che stavi facendo alcuni errori comuni che non sono intenzionali"
}, },
"warningTitle": { "warningTitle": {
"message": "Hai ricevuto un avviso" "message": "Hai ricevuto un avvertimento"
}, },
"questionButton": { "questionButton": {
"message": "Ho una domanda" "message": "Ho una domanda"
@@ -957,7 +960,7 @@
"message": "Dona" "message": "Dona"
}, },
"considerDonating": { "considerDonating": {
"message": "Contribuisci allo sviluppo del fondo" "message": "Aiuta a finanziare lo sviluppo"
}, },
"hideDonationLink": { "hideDonationLink": {
"message": "Nascondi Link di Donazione" "message": "Nascondi Link di Donazione"
@@ -1093,7 +1096,7 @@
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)." "description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
}, },
"noticeVisibilityLabel": { "noticeVisibilityLabel": {
"message": "Salta l'aspetto del preavviso", "message": "Aspetto dell'avviso di skip",
"description": "Option label" "description": "Option label"
}, },
"unbind": { "unbind": {
@@ -1119,13 +1122,13 @@
"message": "Ripristina le impostazioni predefinite" "message": "Ripristina le impostazioni predefinite"
}, },
"confirmResetToDefault": { "confirmResetToDefault": {
"message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questo non può essere annullato." "message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questa azione è irreversibile."
}, },
"exportSegments": { "exportSegments": {
"message": "Esporta segmenti" "message": "Esporta segmenti"
}, },
"importSegments": { "importSegments": {
"message": "Importa i segmenti" "message": "Importa segmenti"
}, },
"Import": { "Import": {
"message": "Importa", "message": "Importa",
@@ -1144,7 +1147,7 @@
"message": "Scegli un paese" "message": "Scegli un paese"
}, },
"noDiscount": { "noDiscount": {
"message": "Non ti qualifichi per uno sconto" "message": "Non hai diritto a uno sconto"
}, },
"discountLink": { "discountLink": {
"message": "Link Sconto (Vedi il prezzo rosa)" "message": "Link Sconto (Vedi il prezzo rosa)"
@@ -1153,11 +1156,11 @@
"message": "Seleziona il tuo paese" "message": "Seleziona il tuo paese"
}, },
"alreadyDonated": { "alreadyDonated": {
"message": "Se hai donato qualsiasi importo prima di ora, puoi riscattare l'accesso gratuito contattando:", "message": "Se hai donato qualsiasi importo in passato, puoi riscattare l'accesso gratuito mandando una mail a:",
"description": "After the colon is an email address" "description": "After the colon is an email address"
}, },
"cantAfford": { "cantAfford": {
"message": "Se non puoi permetterti di acquistare una licenza, premi {here} per vedere se hai diritto a uno sconto", "message": "Se non puoi permetterti di acquistare una licenza, premi {here} per verificare se hai diritto a uno sconto",
"description": "Keep the curly braces. The word 'here' should be translated as well." "description": "Keep the curly braces. The word 'here' should be translated as well."
}, },
"patreonSignIn": { "patreonSignIn": {
@@ -1176,18 +1179,18 @@
"message": "Inserisci chiave di licenza" "message": "Inserisci chiave di licenza"
}, },
"chaptersPage1": { "chaptersPage1": {
"message": "La funzionalità dei capitoli in crowd-sourcing di SponsorBlock è disponibile soltanto a coloro che acquistano una licenza o a coloro aventi l'accesso garantito gratuitamente grazie ai loro contributi passati" "message": "La funzionalità dei capitoli in crowd-sourcing di SponsorBlock è disponibile soltanto a chi acquista una licenza o a chi viene premiato con l'accesso gratuito grazie ai contributi passati"
}, },
"chaptersPage2": { "chaptersPage2": {
"message": "Nota: L'autorizzazione a inviare i capitoli si basa ancora sulla reputazione calcolata. Acquistare una licenza ti consente di visualizzare soltanto i capitoli inviati dagli altri", "message": "Nota: L'autorizzazione a inviare i capitoli si basa ancora sulla reputazione calcolata. Acquistare una licenza ti consente di visualizzare soltanto i capitoli inviati dagli altri",
"description": "On the chapters page for getting access to the paid chapters feature" "description": "On the chapters page for getting access to the paid chapters feature"
}, },
"chapterNewFeature": { "chapterNewFeature": {
"message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato nei video, che possono esser impilate per essere sempre più precise. Acquista una licenza per visualizzare i capitoli inviati in questo video come: ", "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato che possono esser sovrapposte per essere sempre più precise. Acquista una licenza per visualizzare i capitoli inviati in questo video come ad esempio: ",
"description": "After the comma, a list of chapters for this video will appear" "description": "After the comma, a list of chapters for this video will appear"
}, },
"chapterNewFeature2": { "chapterNewFeature2": {
"message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato nei video, che possono esser impilate per essere sempre più precise. Hai accesso gratuitamente, abilitalo nelle opzioni." "message": "Nuova Funzionalità: Capitoli personalizzati in crowdsourcing. Sono sezioni dal nome personalizzato, che possono esser sovrapposte per essere sempre più precise. Hai accesso gratuitamente, abilitalo nelle opzioni."
}, },
"unsubmittedSegmentCounts": { "unsubmittedSegmentCounts": {
"message": "Al momento hai {0} su {1}", "message": "Al momento hai {0} su {1}",
@@ -1214,7 +1217,7 @@
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*" "description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
}, },
"clearUnsubmittedSegments": { "clearUnsubmittedSegments": {
"message": "Elimina tutti i segmenti", "message": "Cancella tutti i segmenti",
"description": "Label for a button in settings" "description": "Label for a button in settings"
}, },
"clearUnsubmittedSegmentsConfirm": { "clearUnsubmittedSegmentsConfirm": {
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Condividi URL" "message": "Condividi URL"
},
"segmentFetchFailureWarning": {
"message": "Attenzione: il server non ha ancora fornito i segmenti. Questo video potrebbe avere dei segmenti inviati, ma forse non sono stati ricevuti a causa di problemi del server."
},
"allowScrollingToEdit": {
"message": "Usa la Rotella per Modificare i Tempi"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "接続エラーが発生しました。 エラーコード: " "message": "接続エラーが発生しました。 エラーコード: "
}, },
"segmentsStillLoading": {
"message": "セグメントがまだ読み込み中です..."
},
"clearTimes": { "clearTimes": {
"message": "セグメントを消去" "message": "セグメントを消去"
}, },
@@ -150,7 +153,7 @@
"message": "提案数" "message": "提案数"
}, },
"savedPeopleFrom": { "savedPeopleFrom": {
"message": "みんなの時間をこれだけ節約しました: " "message": "あなたが節約したみんなの時間: "
}, },
"viewLeaderboard": { "viewLeaderboard": {
"message": "リーダーボード" "message": "リーダーボード"
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "URLとして共有" "message": "URLとして共有"
},
"segmentFetchFailureWarning": {
"message": "警告: サーバーがまだセグメントで応答していません。この動画に対するセグメントはすでに提出されているものの、サーバーの問題によりそれが受信できていないだけという可能性があります。"
},
"allowScrollingToEdit": {
"message": "スクロールで時間を編集できるようにする"
} }
} }

View File

@@ -111,11 +111,14 @@
"message": "투표 완료!" "message": "투표 완료!"
}, },
"serverDown": { "serverDown": {
"message": "서버가 다운된 것 같아요. 개발자분께 연락해주세요." "message": "서버가 다운된 것 같아요. 개발자에게 연락해주세요."
}, },
"connectionError": { "connectionError": {
"message": "연결 오류가 발생했어요. 오류 코드: " "message": "연결 오류가 발생했어요. 오류 코드: "
}, },
"segmentsStillLoading": {
"message": "구간을 여전히 불러오는 중이에요..."
},
"clearTimes": { "clearTimes": {
"message": "구간 초기화" "message": "구간 초기화"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "URL로 공유" "message": "URL로 공유"
},
"segmentFetchFailureWarning": {
"message": "경고: 아직 서버로부터 구간 정보를 받지 못했습니다. 동영상에 이미 제출된 구간이 있지만 서버의 문제로 수신하지 못했을 수 있습니다."
},
"allowScrollingToEdit": {
"message": "스크롤하여 시간 수정"
} }
} }

View File

@@ -25,6 +25,19 @@
"Segments": { "Segments": {
"message": "segmen" "message": "segmen"
}, },
"SegmentsCap": {
"message": "Segmen"
},
"Chapters": {
"message": "Bab"
},
"renderAsChapters": {
"message": "Render segmen sebagai bab",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "Tunjukkan Segmen Semasa Di Sebelah Masa Video"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Sokong penyerahan ini" "message": "Sokong penyerahan ini"
}, },
@@ -52,6 +65,9 @@
"reskip": { "reskip": {
"message": "Reskip" "message": "Reskip"
}, },
"unmute": {
"message": "Nyahredam"
},
"paused": { "paused": {
"message": "Dijeda" "message": "Dijeda"
}, },
@@ -79,9 +95,15 @@
"sponsorEnd": { "sponsorEnd": {
"message": "Segmen Berakhir Sekarang" "message": "Segmen Berakhir Sekarang"
}, },
"sponsorCancel": {
"message": "Batalkan Membuat Segmen"
},
"noVideoID": { "noVideoID": {
"message": "Tiada video YouTube dijumpai.\nSekiranya ini tidak betul, muat semula tab." "message": "Tiada video YouTube dijumpai.\nSekiranya ini tidak betul, muat semula tab."
}, },
"refreshSegments": {
"message": "Muat semula segmen"
},
"success": { "success": {
"message": "Berjaya!" "message": "Berjaya!"
}, },
@@ -94,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Ralat sambungan telah berlaku. Kod salah: " "message": "Ralat sambungan telah berlaku. Kod salah: "
}, },
"segmentsStillLoading": {
"message": "Segmen masih dimuatkan..."
},
"clearTimes": { "clearTimes": {
"message": "Kosongkan Segmen" "message": "Kosongkan Segmen"
}, },
@@ -103,9 +128,15 @@
"closePopup": { "closePopup": {
"message": "Tutup Pop timbul" "message": "Tutup Pop timbul"
}, },
"closeIcon": {
"message": "Tutup Ikon"
},
"SubmitTimes": { "SubmitTimes": {
"message": "Hantar Segmen" "message": "Hantar Segmen"
}, },
"sortSegments": {
"message": "Susun Segmen"
},
"submitCheck": { "submitCheck": {
"message": "Adakah anda pasti mahu menghantarnya?" "message": "Adakah anda pasti mahu menghantarnya?"
}, },
@@ -152,6 +183,12 @@
"setUsername": { "setUsername": {
"message": "Tetapkan Nama Pengguna" "message": "Tetapkan Nama Pengguna"
}, },
"copyPublicID": {
"message": "Salin PenggunaID Awam"
},
"copySegmentID": {
"message": "Salin ID Segmen"
},
"discordAdvert": { "discordAdvert": {
"message": "Mari sertai pelayan perselisihan rasmi untuk memberi cadangan dan maklum balas!" "message": "Mari sertai pelayan perselisihan rasmi untuk memberi cadangan dan maklum balas!"
}, },
@@ -170,12 +207,18 @@
"hideButtonsDescription": { "hideButtonsDescription": {
"message": "Ini menyembunyikan butang yang muncul di pemain YouTube untuk menyerahkan segmen langkau." "message": "Ini menyembunyikan butang yang muncul di pemain YouTube untuk menyerahkan segmen langkau."
}, },
"showSkipButton": {
"message": "Simpan Butang Langkau Ke Sorotan Di Pemain"
},
"showInfoButton": { "showInfoButton": {
"message": "Tunjukkan Butang Maklumat Pada Pemain YouTube" "message": "Tunjukkan Butang Maklumat Pada Pemain YouTube"
}, },
"hideInfoButton": { "hideInfoButton": {
"message": "Sembunyikan Butang Maklumat Pada Pemain YouTube" "message": "Sembunyikan Butang Maklumat Pada Pemain YouTube"
}, },
"autoHideInfoButton": {
"message": "Auto-sembunyikan Butang Maklumat"
},
"hideDeleteButton": { "hideDeleteButton": {
"message": "Sembunyikan Butang Padam Pada Pemain YouTube" "message": "Sembunyikan Butang Padam Pada Pemain YouTube"
}, },
@@ -188,6 +231,18 @@
"whatViewTracking": { "whatViewTracking": {
"message": "Fungsi ini mengesan segmen mana yang telah anda lewati untuk memberi tahu pengguna seberapa banyak penyerahan mereka telah membantu orang lain dan digunakan sebagai metrik bersama dengan suara positif untuk memastikan bahawa spam tidak masuk ke dalam pangkalan data. Sambungan tersebut menghantar mesej ke pelayan setiap kali anda melewatkan segmen. Mudah-mudahan kebanyakan orang tidak mengubah tetapan ini supaya nombor paparan tepat. :)" "message": "Fungsi ini mengesan segmen mana yang telah anda lewati untuk memberi tahu pengguna seberapa banyak penyerahan mereka telah membantu orang lain dan digunakan sebagai metrik bersama dengan suara positif untuk memastikan bahawa spam tidak masuk ke dalam pangkalan data. Sambungan tersebut menghantar mesej ke pelayan setiap kali anda melewatkan segmen. Mudah-mudahan kebanyakan orang tidak mengubah tetapan ini supaya nombor paparan tepat. :)"
}, },
"enableViewTrackingInPrivate": {
"message": "Bolehkan Penjejakan kiraan Langkau Di Dalam Tab Persendirian/Inkognito"
},
"enableTrackDownvotes": {
"message": "Simpan segmen undi turun"
},
"whatTrackDownvotes": {
"message": "Segmen yang anda undi turun akan kekal tersembunyi walaupun selepas memuat semulakan"
},
"trackDownvotesWarning": {
"message": "Amaran: Melumpuhkan ini akan padam semua undi turun yang tersimpan sebelum ini"
},
"enableQueryByHashPrefix": { "enableQueryByHashPrefix": {
"message": "Pertanyaan Oleh Awalan Hash" "message": "Pertanyaan Oleh Awalan Hash"
}, },
@@ -200,12 +255,36 @@
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "Sekiranya videonya baru, dan tidak ada segmen yang dijumpai, video akan terus diambil setiap beberapa minit semasa anda menonton." "message": "Sekiranya videonya baru, dan tidak ada segmen yang dijumpai, video akan terus diambil setiap beberapa minit semasa anda menonton."
}, },
"enableShowCategoryWithoutPermission": {
"message": "Tunjuk kategori dalam menu penghantaran walaupun tanpa kebenaran penghantaran"
},
"whatShowCategoryWithoutPermission": {
"message": "Beberapa kategori memerlukan kebenaran untuk hantar disebabkan keperluan reputasi minimum"
},
"showNotice": { "showNotice": {
"message": "Tunjukkan Notis Lagi" "message": "Tunjukkan Notis Lagi"
}, },
"showSkipNotice": { "showSkipNotice": {
"message": "Tunjukkan Makluman Setelah Segmen Dilangkau" "message": "Tunjukkan Makluman Setelah Segmen Dilangkau"
}, },
"showCategoryGuidelines": {
"message": "Tunjukkan Bantuan Kategori"
},
"noticeVisibilityMode0": {
"message": "Saiz Penuh Langkau Notis"
},
"noticeVisibilityMode1": {
"message": "Notis Langkau Kecil untuk Auto Langkau"
},
"noticeVisibilityMode2": {
"message": "Semua Kecil Notis Langkau"
},
"noticeVisibilityMode3": {
"message": "Notis Langkau Pudar untuk Auto Langkau"
},
"noticeVisibilityMode4": {
"message": "Semua Pudar Notis Langkau"
},
"longDescription": { "longDescription": {
"message": "SponsorBlock membolehkan anda melewati penaja, intro, outro, peringatan langganan, dan bahagian lain dari video YouTube yang menjengkelkan. SponsorBlock adalah pelanjutan penyemak imbas yang banyak untuk membolehkan sesiapa sahaja menghantar segmen tajaan dan masa tayangan dari segmen video YouTube yang lain. Setelah satu orang menyerahkan maklumat ini, semua orang yang mempunyai pelanjutan ini akan melangkau segmen yang ditaja. Anda juga boleh melangkau bahagian muzik video muzik bukan.", "message": "SponsorBlock membolehkan anda melewati penaja, intro, outro, peringatan langganan, dan bahagian lain dari video YouTube yang menjengkelkan. SponsorBlock adalah pelanjutan penyemak imbas yang banyak untuk membolehkan sesiapa sahaja menghantar segmen tajaan dan masa tayangan dari segmen video YouTube yang lain. Setelah satu orang menyerahkan maklumat ini, semua orang yang mempunyai pelanjutan ini akan melangkau segmen yang ditaja. Anda juga boleh melangkau bahagian muzik video muzik bukan.",
"description": "Full description of the extension on the store pages." "description": "Full description of the extension on the store pages."
@@ -226,6 +305,29 @@
"message": "Sekiranya anda masih tidak menyukainya, tekan butang jangan tunjukkan.", "message": "Sekiranya anda masih tidak menyukainya, tekan butang jangan tunjukkan.",
"description": "The second line of the message displayed after the notice was upgraded." "description": "The second line of the message displayed after the notice was upgraded."
}, },
"setSkipShortcut": {
"message": "Langkau segmen",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "Mula/berhenti segmen",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Hantar segmen",
"description": "Keybind label"
},
"nextChapterKeybind": {
"message": "Bab seterusnya",
"description": "Keybind label"
},
"previousChapterKeybind": {
"message": "Bab sebelumnya",
"description": "Keybind label"
},
"keybindDescription": {
"message": "Pilih kekunci dengan menaipnya dan pilih mana-mana kekunci pengubah suai yang anda ingin gunakan."
},
"0": { "0": {
"message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi." "message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi."
}, },
@@ -248,9 +350,35 @@
"skip": { "skip": {
"message": "Langkau" "message": "Langkau"
}, },
"mute": {
"message": "Redam"
},
"full": {
"message": "Seluruh Video",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": { "skip_category": {
"message": "Langkau {0}?" "message": "Langkau {0}?"
}, },
"mute_category": {
"message": "Redam {0}?"
},
"skip_to_category": {
"message": "Langkau kepada {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} Melangkau",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} Diredam",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Melangkau kepada {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": { "disableAutoSkip": {
"message": "Lumpuhkan Langkau Auto" "message": "Lumpuhkan Langkau Auto"
}, },
@@ -295,12 +423,40 @@
"statusReminder": { "statusReminder": {
"message": "Periksa status.sponsor.ajay.app untuk status pelayan." "message": "Periksa status.sponsor.ajay.app untuk status pelayan."
}, },
"changeUserID": {
"message": "Import/Eksport PenggunaID Persendirian Anda"
},
"whatChangeUserID": {
"message": "Ini patut dirahsiakan. Ini seperti kata laluan dan tidak patut untuk dikongsi dengan sesiapa. Jika seseorang mempunyai ini, mereka boleh menyamar sebagai anda. Jika anda sedang mencari untuk penggunaID awam anda, tekan ikon papan keratan di dalam pop timbul."
},
"setUserID": {
"message": "Tetapkan PenggunaanID Peribadi"
},
"userIDChangeWarning": {
"message": "Amaran: Mengubah PenggunaanID Peribadi adalah kekal. Adakah anda pasti anda mahu melakukan ini? Pastikan untuk membuat sandaran anda yang lama untuk berjaga-jaga."
},
"createdBy": { "createdBy": {
"message": "Dicipta oleh" "message": "Dicipta oleh"
}, },
"supportOtherSites": {
"message": "Sokong Pihak Ke-3 Laman YouTube"
},
"supportOtherSitesDescription": {
"message": "Sokong klien pihak ketiga YouTube. Untuk membolehkan sokong, anda perlu menerima kebenaran tambahan. Ini TIDAK berfungsi dalam inkognito pada Chrome dan varian Chromium lain.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Laman Disokong: "
},
"optionsInfo": { "optionsInfo": {
"message": "Dayakan sokongan Invidious, lumpuhkan autoskip, sembunyikan butang dan banyak lagi." "message": "Dayakan sokongan Invidious, lumpuhkan autoskip, sembunyikan butang dan banyak lagi."
}, },
"addInvidiousInstance": {
"message": "Tambah Pihak Ke-3 Contoh Klien"
},
"addInvidiousInstanceDescription": {
"message": "Tambah contoh tersuai. Ini mesti diformat HANYA dengan domain. Contoh: invidious.ajay.app"
},
"add": { "add": {
"message": "Tambah" "message": "Tambah"
}, },
@@ -322,9 +478,24 @@
"minDurationDescription": { "minDurationDescription": {
"message": "Segmen yang lebih pendek daripada nilai yang ditetapkan tidak akan dilangkau atau ditunjukkan dalam pemain." "message": "Segmen yang lebih pendek daripada nilai yang ditetapkan tidak akan dilangkau atau ditunjukkan dalam pemain."
}, },
"enableManualSkipOnFullVideo": {
"message": "Gunakan langkau manual apabila label video penuh wujud"
},
"whatManualSkipOnFullVideo": {
"message": "Untuk orang yang ingin menonton video penuh tanpa gangguan jika ia adalah ditaja sepenuhnya atau promosi diri."
},
"skipNoticeDuration": {
"message": "Tenpoh masa notis langkau (saat):"
},
"skipNoticeDurationDescription": {
"message": "Notis langkau akan kekal di skrin untuk sekurang-kurangnya beberapa saat ini. Untuk melangkau secara manual, ia mungkin dilihat lebih lama."
},
"shortCheck": { "shortCheck": {
"message": "Penyerahan berikut lebih pendek daripada pilihan tempoh minimum anda. Ini mungkin bermaksud ini sudah dihantar, dan hanya diabaikan kerana pilihan ini. Adakah anda pasti mahu menghantar?" "message": "Penyerahan berikut lebih pendek daripada pilihan tempoh minimum anda. Ini mungkin bermaksud ini sudah dihantar, dan hanya diabaikan kerana pilihan ini. Adakah anda pasti mahu menghantar?"
}, },
"liveOrPremiere": {
"message": "Menghantar pada siaran langsung aktif atau tayangan perdana tidak dibenarkan. Sila tunggu sehingga ia selesai, kemudian muat semula halaman dan mengesahkan yang segmen masih sah."
},
"showUploadButton": { "showUploadButton": {
"message": "Tunjukkan Butang Muat Naik" "message": "Tunjukkan Butang Muat Naik"
}, },
@@ -352,6 +523,18 @@
"exportOptions": { "exportOptions": {
"message": "Import / Eksport Semua Pilihan" "message": "Import / Eksport Semua Pilihan"
}, },
"exportOptionsCopy": {
"message": "Sunting/salin"
},
"exportOptionsDownload": {
"message": "Simpan ke fail"
},
"exportOptionsUpload": {
"message": "Muatkan dari fail"
},
"whatExportOptions": {
"message": "Ini adalah keseluruhan konfigurasi anda dalam JSON. Ini termasuk PenggunaanID Persendirian anda, jadi pastikan untuk kongsi ini dengan bijak."
},
"setOptions": { "setOptions": {
"message": "Tetapkan Pilihan" "message": "Tetapkan Pilihan"
}, },
@@ -376,6 +559,9 @@
"preview": { "preview": {
"message": "Pratonton" "message": "Pratonton"
}, },
"unsubmitted": {
"message": "Belum Diserahkan"
},
"inspect": { "inspect": {
"message": "Periksa" "message": "Periksa"
}, },
@@ -394,28 +580,78 @@
"copyDebugInformationComplete": { "copyDebugInformationComplete": {
"message": "Maklumat debug telah disalin ke papan klip. Jangan ragu untuk membuang maklumat yang anda tidak mahu kongsi Simpan ini dalam fail teks atau tampal ke laporan pepijat." "message": "Maklumat debug telah disalin ke papan klip. Jangan ragu untuk membuang maklumat yang anda tidak mahu kongsi Simpan ini dalam fail teks atau tampal ke laporan pepijat."
}, },
"keyAlreadyUsed": {
"message": "Pintasan ini terikat kepada tindakan lain. Sila pilih yang lain."
},
"to": { "to": {
"message": "ke", "message": "ke",
"description": "Used between segments. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
}, },
"CopiedExclamation": {
"message": "Disalin!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"generic_guideline1": {
"message": "Termasuk peralihan segue"
},
"generic_guideline2": {
"message": "Main seperti seolah-olahnya tiada apa-apa yang melangkau"
},
"category_sponsor": { "category_sponsor": {
"message": "Penaja" "message": "Penaja"
}, },
"category_sponsor_description": { "category_sponsor_description": {
"message": "Promosi berbayar, rujukan berbayar dan iklan langsung. Bukan untuk promosi diri atau sapaan percuma kepada penyebab / pencipta / laman web / produk yang mereka suka." "message": "Promosi berbayar, rujukan berbayar dan iklan langsung. Bukan untuk promosi diri atau sapaan percuma kepada penyebab / pencipta / laman web / produk yang mereka suka."
}, },
"category_sponsor_guideline1": {
"message": "Promosi dibayar"
},
"category_sponsor_guideline2": {
"message": "Bukan untuk derma atau barangan tersuai"
},
"category_selfpromo": { "category_selfpromo": {
"message": "Promosi Tanpa Bayaran / Diri" "message": "Promosi Tanpa Bayaran / Diri"
}, },
"category_selfpromo_description": { "category_selfpromo_description": {
"message": "Sama dengan \"penaja\" kecuali untuk promosi tanpa gaji atau diri. Ini merangkumi bahagian mengenai barang dagangan, sumbangan, atau maklumat tentang siapa mereka bekerjasama." "message": "Sama dengan \"penaja\" kecuali untuk promosi tanpa gaji atau diri. Ini merangkumi bahagian mengenai barang dagangan, sumbangan, atau maklumat tentang siapa mereka bekerjasama."
}, },
"category_selfpromo_guideline1": {
"message": "Dermaan, keahlian dan barangan tersuai"
},
"category_selfpromo_guideline2": {
"message": "Shoutout percuma yang tidak menambah kepada video"
},
"category_selfpromo_guideline3": {
"message": "Bukan untuk produk reka bentuk korporat dan barang dagangan"
},
"category_exclusive_access": {
"message": "Akses Eksklusif"
},
"category_exclusive_access_description": {
"message": "Hanya untuk melabelkan keseluruhan video. Digunakan apabila video menunjukkan sesuatu produk, servis atau lokasi yang mereka menerima dengan percuma atau akses bersubsidi kepada."
},
"category_exclusive_access_pill": {
"message": "Video ini menunjukkan sesuatu produk, servis atau lokasi yang mereka menerima dengan percuma atau akses bersubsidi kepada",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Keseluruhan video menunjukkan benda yang percuma atau akses bersubsidi"
},
"category_interaction": { "category_interaction": {
"message": "Peringatan Interaksi (Langgan)" "message": "Peringatan Interaksi (Langgan)"
}, },
"category_interaction_description": { "category_interaction_description": {
"message": "Apabila ada peringatan pendek untuk menyukai, melanggan atau mengikutinya di tengah-tengah kandungan. Sekiranya ia panjang atau mengenai sesuatu yang spesifik, ia harus dipromosikan sendiri." "message": "Apabila ada peringatan pendek untuk menyukai, melanggan atau mengikutinya di tengah-tengah kandungan. Sekiranya ia panjang atau mengenai sesuatu yang spesifik, ia harus dipromosikan sendiri."
}, },
"category_interaction_guideline1": {
"message": "Peringatan pendek untuk suka, melanggan atau ikut"
},
"category_interaction_guideline2": {
"message": "Termasuk peringatan tidak langsung untuk komen"
},
"category_interaction_guideline3": {
"message": "Bukan untuk promosi umum, hanya seruan untuk bertindak"
},
"category_interaction_short": { "category_interaction_short": {
"message": "Peringatan Interaksi" "message": "Peringatan Interaksi"
}, },
@@ -428,12 +664,54 @@
"category_intro_short": { "category_intro_short": {
"message": "Selang" "message": "Selang"
}, },
"category_intro_guideline1": {
"message": "Selang waktu tanpa kandungan sebenar"
},
"category_intro_guideline2": {
"message": "Bukan untuk transisi dengan maklumat"
},
"category_outro": { "category_outro": {
"message": "Kad Akhir / Kredit" "message": "Kad Akhir / Kredit"
}, },
"category_outro_description": { "category_outro_description": {
"message": "Kredit atau ketika kad akhir YouTube muncul. Bukan untuk kesimpulan dengan maklumat." "message": "Kredit atau ketika kad akhir YouTube muncul. Bukan untuk kesimpulan dengan maklumat."
}, },
"category_outro_guideline1": {
"message": "Jangan termasuk kandungan, walaupun kad akhir pada skrin"
},
"category_preview": {
"message": "Pratonton/Imbas Kembali"
},
"category_preview_description": {
"message": "Koleksi klip yang menunjukkan apa yang akan datang di dalam video ini atau video lain di dalam siri di mana semua maklumat diulang kemudian di dalam video."
},
"category_preview_guideline1": {
"message": "Klip yang muncul kemudian, atau di dalam video masa depan"
},
"category_preview_guideline2": {
"message": "Imbas kembali video sebelum ini"
},
"category_preview_guideline3": {
"message": "Bukan untuk bahagian yang menambah kandungan tambahan"
},
"category_filler": {
"message": "Tangen Pengisi/Lawak"
},
"category_filler_description": {
"message": "Adegan tangensial ditambah hanya untuk pengisi atau jenaka yang tidak diperlukan untuk memahami kandungan utama daripada video tersebut. Ini tidak patutnya termasuk segmen yang menyediakan konteks atau butiran latar belakang. Ini kategori yang sangat aggresif dimaksudkan apabila kamu tiada mood untuk \"seronok\"."
},
"category_filler_short": {
"message": "Pengisi"
},
"category_filler_guideline1": {
"message": "Adegan tangensial hanya untuk pengisi atau humor"
},
"category_filler_guideline2": {
"message": "Gangguan, blooper, ulang tayang"
},
"category_filler_guideline3": {
"message": "Bukan untuk adegan diperlukan untuk memahami topik"
},
"category_music_offtopic": { "category_music_offtopic": {
"message": "Muzik: Bahagian Bukan Muzik" "message": "Muzik: Bahagian Bukan Muzik"
}, },
@@ -443,6 +721,42 @@
"category_music_offtopic_short": { "category_music_offtopic_short": {
"message": "Bukan Muzik" "message": "Bukan Muzik"
}, },
"category_music_offtopic_guideline1": {
"message": "Bahagian bukan dalam keluaran rasmi"
},
"category_music_offtopic_guideline2": {
"message": "Bukan muzik di dalam persembahan secara langsung"
},
"category_poi_highlight": {
"message": "Sorotan"
},
"category_poi_highlight_description": {
"message": "Bahagian video yang kebanyakan orang sedang mencari. Sama seperti komen \"Video bermula pada x\"."
},
"category_poi_highlight_guideline1": {
"message": "Bahagian kebanyakan orang sedang mencari"
},
"category_poi_highlight_guideline2": {
"message": "Boleh langkau konteks"
},
"category_poi_highlight_guideline3": {
"message": "Boleh langkau ke tajuk atau thumbnail"
},
"category_chapter": {
"message": "Bab"
},
"category_chapter_description": {
"message": "Nama bab tersuai menerangkan bahagian utama video."
},
"category_chapter_guideline1": {
"message": "Jangan menyebut nama jenama penaja"
},
"category_chapter_guideline2": {
"message": "Gunakan bab lebih besar untuk bahagian umum"
},
"category_chapter_guideline3": {
"message": "Kandungan yang lebih kecil boleh diletakkan di dalam yang lebih besar"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "Strim Langsung: Bacaan Derma / Mesej" "message": "Strim Langsung: Bacaan Derma / Mesej"
}, },
@@ -461,6 +775,35 @@
"disable": { "disable": {
"message": "Nyahaktifkan" "message": "Nyahaktifkan"
}, },
"autoSkip_POI": {
"message": "Langkau ke permulaan secara automatik"
},
"manualSkip_POI": {
"message": "Tanya apabila video dimuatkan"
},
"showOverlay_POI": {
"message": "Tunjuk Dalam Bar Mencari"
},
"showOverlay_full": {
"message": "Tunjuk Label"
},
"showOverlay_chapter": {
"message": "Tunjukkan bab"
},
"autoSkipOnMusicVideos": {
"message": "Auto langkau semua segmen apabila terdapat segmen bukan-muzik"
},
"muteSegments": {
"message": "Benarkan segmen yang meredamkan audio sebaliknya langkau"
},
"fullVideoSegments": {
"message": "Tunjukkan ikon apabila video ialah iklan sepenuhnya",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
},
"previewColor": {
"message": "Warna Belum Diserahkan",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": { "seekBarColor": {
"message": "Cari Warna Bar" "message": "Cari Warna Bar"
}, },
@@ -493,18 +836,47 @@
"message": "Untuk menghantar segmen dengan kategori \"{0}\", anda mesti mengaktifkannya dalam pilihan. Anda akan diarahkan ke pilihan sekarang.", "message": "Untuk menghantar segmen dengan kategori \"{0}\", anda mesti mengaktifkannya dalam pilihan. Anda akan diarahkan ke pilihan sekarang.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options." "description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
}, },
"poiOnlyOneSegment": {
"message": "Amaran: Segmen jenis ini hanya boleh mempunyai maksimum satu aktif pada satu masa. Menghantar pelbagai lagi akan menyebabkan satu ditunjukkan secara rawak."
},
"youMustSelectACategory": { "youMustSelectACategory": {
"message": "Anda mesti memilih kategori untuk semua segmen yang anda kirimkan!" "message": "Anda mesti memilih kategori untuk semua segmen yang anda kirimkan!"
}, },
"bracketEnd": { "bracketEnd": {
"message": "(Tamat)" "message": "(Tamat)"
}, },
"End": {
"message": "Tamat",
"description": "Button that skips to the end of a segment"
},
"hiddenDueToDownvote": { "hiddenDueToDownvote": {
"message": "tersembunyi: undi" "message": "tersembunyi: undi"
}, },
"hiddenDueToDuration": { "hiddenDueToDuration": {
"message": "tersembunyi: terlalu pendek" "message": "tersembunyi: terlalu pendek"
}, },
"manuallyHidden": {
"message": "disembunyikan secara manual"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "ID saluran tidak dimuatkan lagi. Jika anda menggunakan video terbenam, cuba gunakan laman utama YouTube sebaliknya. Ini juga boleh disebabkan perubahan di dalam susun atur YouTube, jika anda fikir begitu, buat komen di sini:"
},
"invidiousPermissionRefresh": {
"message": "Pelayar telah membatalkan kebenaran diperlukan untuk berfungsi di Invidious dan laman pihak ke-3 yang lain. Sila tekan butang di bawah untuk aktifkan semula kebenaran ini."
},
"acceptPermission": {
"message": "Terima kebenaran"
},
"permissionRequestSuccess": {
"message": "Permintaan kebenaran berjaya!"
},
"permissionRequestFailed": {
"message": "Permintaan kebenaran gagal, adakah anda menekan menafikan?"
},
"adblockerIssueWhitelist": {
"message": "Jika anda tidak dapat menyelesaikan perkara ini, kemudian lumpuhkan tetapan 'Paksa Semak Saluran Sebelum Langkau', kerana SponsorBlock tidak dapat mengambil semula maklumat saluran untuk video ini"
},
"forceChannelCheck": { "forceChannelCheck": {
"message": "Pakai Pemeriksaan Saluran Sebelum Melangkau" "message": "Pakai Pemeriksaan Saluran Sebelum Melangkau"
}, },
@@ -517,6 +889,16 @@
"downvoteDescription": { "downvoteDescription": {
"message": "Pemasaan Tidak Betul / Salah" "message": "Pemasaan Tidak Betul / Salah"
}, },
"incorrectVote": {
"message": "Salah"
},
"harmfulVote": {
"message": "Memudaratkan",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
},
"incorrectCategory": {
"message": "Tukar Kategori"
},
"nonMusicCategoryOnMusic": { "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." "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."
}, },
@@ -535,5 +917,337 @@
}, },
"categoryUpdate2": { "categoryUpdate2": {
"message": "Buka pilihan untuk melangkau perkenalan, pengeluaran luar, barang dagangan, dll." "message": "Buka pilihan untuk melangkau perkenalan, pengeluaran luar, barang dagangan, dll."
},
"help": {
"message": "Bantuan"
},
"GotIt": {
"message": "Dah dapat",
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "Segmen ini besar. Jika seluruh video adalah mengenai satu topik, kemudian tukar daripada \"Langkau\" ke \"Seluruh Video\". Lihat garis panduan untuk maklumat lanjut."
},
"categoryPillTitleText": {
"message": "Keseluruhan video ini dilabel sebagai kategori ini dan terlalu bersepadu erat untuk dapat dipisah"
},
"chapterNameTooltipWarning": {
"message": "Sebuah nama bab anda ialah serupa dengan kategori. Anda patut guna kategori apabila mungkin sebaliknya."
},
"experiementOptOut": {
"message": "Menarik diri daripada semua 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": "Kami perasaan yang anda telah membuat beberapa kesilapan biasa yang tidak berniat jahat"
},
"warningTitle": {
"message": "Anda mendapat amaran"
},
"questionButton": {
"message": "Saya ada soalan"
},
"warningConfirmButton": {
"message": "Saya memahami sebabnya"
},
"warningError": {
"message": "Kesilapan apabila mencuba untuk mengakui amaran:"
},
"Donate": {
"message": "Derma"
},
"considerDonating": {
"message": "Bantu pembangunan dana"
},
"hideDonationLink": {
"message": "Sembunyikan Pautan Derma"
},
"darkModeOptionsPage": {
"message": "Mod Gelap Di Halaman Pilihan"
},
"helpPageThanksForInstalling": {
"message": "Terima kasih kerana memasang SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Tolong semak pilihan di bawah"
},
"helpPageFeatureDisclaimer": {
"message": "Banyak ciri dilumpuhkan secara lalai. Jika anda ingin langkau intro, outro, gunakan Invidious, dll. Bolehkan mereka di bawah. Anda boleh juga sembunyi/tunjuk elemen UI."
},
"helpPageHowSkippingWorks": {
"message": "Bagaimana melangkau berfungsi"
},
"helpPageHowSkippingWorks1": {
"message": "Segmen video akan dilangkau secara automatik jika mereka dijumpa di dalam pangkalan data. Anda boleh membuka pop timbul dengan menekan ikon sambungan untuk mendapat pratonton daripada apa yang mereka ada."
},
"helpPageHowSkippingWorks2": {
"message": "Apabila anda melangkau sebuah segmen, anda akan dapat notis. Jika masa nampak salah mengundi turun dengan menekan undi turun! Anda boleh juga undi di dalam pop timbul."
},
"Submitting": {
"message": "Menghantar"
},
"helpPageSubmitting1": {
"message": "Menghantar boleh dilakukan sama ada di dalam pop timbul dengan menekan butang \"Segmen Bermula Sekarang\" atau di dalam pemain video dengan menggunakan butang di pemain."
},
"helpPageSubmitting2": {
"message": "Menekan butang main menunjukkan permulaan segmen dan menekan ikon berhenti menunjukkan tamat. Anda boleh sediakan berbilang sponsor sebelum menekan hantar. Menekan butang muat turun akan hantar. Menekan tong sampah akan padam."
},
"Editing": {
"message": "Menyunting"
},
"helpPageEditing1": {
"message": "Jika anda tersilap, anda boleh sunting atau padam segmen anda selepas menekan butang anak panah atas."
},
"helpPageTooSlow": {
"message": "Ini terlalu lambat"
},
"helpPageTooSlow1": {
"message": "Terdapat kekunci panas jika anda ingin menggunakannya. Tekan kekunci koma bertitik untuk menunjukkan mula/akhir daripada sesuatu segmen penaja. Ini boleh diubah di dalam pilihan. Jika anda tidak menggunakan QWERTY, anda mungkin patut ubah ikatan kekunci."
},
"helpPageCopyOfDatabase": {
"message": "Bolehkah saya mendapat salinan pangkalan data? Apakah akan terjadi jika anda hilang?"
},
"helpPageCopyOfDatabase1": {
"message": "Pangkalan data ialah awam dan boleh didapati di"
},
"helpPageCopyOfDatabase2": {
"message": "Kod sumber tersedia secara percuma. Jadi, walaupun sesuatu berlaku pada saya, penghantaran anda tidak hilang."
},
"helpPageNews": {
"message": "Berita dan bagaimana ia dibuat"
},
"helpPageSourceCode": {
"message": "Dimana saya boleh mendapat kod sumber?"
},
"Credits": {
"message": "Penghargaan"
},
"LearnMore": {
"message": "Ketahui Lebih Lanjut"
},
"FullDetails": {
"message": "Perincian Penuh"
},
"CopyDownvoteButtonInfo": {
"message": "Undi turun dan membuat salinan tempatan untuk anda hantar semula"
},
"OpenCategoryWikiPage": {
"message": "Buka halaman wiki kategori ini."
},
"CopyAndDownvote": {
"message": "Salin dan undi turun"
},
"ContinueVoting": {
"message": "Teruskan Undian"
},
"ChangeCategoryTooltip": {
"message": "Ini akan serta merta dikenakan pada segmen anda"
},
"downvote": {
"message": "Undi turun"
},
"upvote": {
"message": "Undi naik"
},
"hideSegment": {
"message": "Sembunyikan segmen"
},
"skipSegment": {
"message": "Langkau segmen"
},
"playChapter": {
"message": "Main bab"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Gunakan roda tetikus anda sambil di atas kotak edit untuk melaraskan masa dengan cepat. Gabungan kekunci ctrl atau shift boleh digunakan untuk membaiki perubahan."
},
"categoryPillNewFeature": {
"message": "Baharu! Tengok apabila video ialah penaja atau promosi diri sepenuhnya"
},
"dayAbbreviation": {
"message": "h",
"description": "100d"
},
"hourAbbreviation": {
"message": "j",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Tingkah Laku",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "Antaramuka",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "Pintasan papan kekunci",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "Sandaran/Memulihkan",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Lain-Lain",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Langkau notis penampilan",
"description": "Option label"
},
"unbind": {
"message": "Buka Ikatan",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Tidak ditetapkan"
},
"change": {
"message": "Tukar"
},
"youtubeKeybindWarning": {
"message": "Ini adalah dibina dalam pintasan YouTube. Adakah anda pasti anda mahu menggunakannya?"
},
"betaServerWarning": {
"message": "Pelayan BETA ialah didayakan!"
},
"openOptionsPage": {
"message": "Buka halaman pilihan"
},
"resetToDefault": {
"message": "Set semula tetapan kepada asal"
},
"confirmResetToDefault": {
"message": "Adakah anda pasti anda mahu menetapkan semula semua tetapan kepada nilai asalnya? Perkara ini tidak boleh diubah."
},
"exportSegments": {
"message": "Eksport segmen"
},
"importSegments": {
"message": "Import segmen"
},
"Import": {
"message": "Import",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"redeemSuccess": {
"message": "Tebusan Berjaya!"
},
"redeemFailed": {
"message": "Kunci lesen tidak sah"
},
"hideUpsells": {
"message": "Sembunyikan pilihan tidak tersedia tanpa pembayaran tambahan"
},
"chooseACountry": {
"message": "Pilih negara"
},
"noDiscount": {
"message": "Anda tidak layak untuk diskaun"
},
"discountLink": {
"message": "Pautan Diskaun (Lihat harga pink)"
},
"selectYourCountry": {
"message": "Pilih negara anda"
},
"alreadyDonated": {
"message": "Jika anda telah menderma apa-apa jumlah sebelum ini, anda boleh tebus akses percuma dengan menghantar emel:",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "Jika anda tidak mampu untuk membeli lesen, tekan {sini} untuk melihat sama ada anda layak untuk diskaun",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": {
"message": "Daftar masuk dengan Patreon"
},
"redeem": {
"message": "Tebus"
},
"joinOnPatreon": {
"message": "Langgan di Patreon"
},
"oneTimePurchase": {
"message": "Pembelian Sekali"
},
"enterLicenseKey": {
"message": "Masukkan Kunci Lesen"
},
"chaptersPage1": {
"message": "Fitur kandungan sumber awam SponsorBlock hanya tersedia untuk orang yang membeli lesen atau untuk orang yang diberikan akses secara percuma kerana sumbangan lepas"
},
"chaptersPage2": {
"message": "Nota: Kebenaran untuk hantar kandungan masih berdasarkan oleh reputasi yang dikira. Membeli lesen hanya membenarkan anda untuk melihat kandungan yang dihantar oleh orang lain",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": {
"message": "Fitur Baharu: Kandungan sumber awam tersuai. Ini adalah bahagian dinamakan tersuai dalam video yang boleh bertindan untuk mendapatkan lebih dan lebih tepat. Beli lesen untuk melihat kandungan dihantar pada video seperti ini: ",
"description": "After the comma, a list of chapters for this video will appear"
},
"chapterNewFeature2": {
"message": "Fitur Baharu: Kandungan sumber awam tersuai. Ini adalah bahagian dinamakan tersuai dalam video yang boleh bertindan untuk mendapatkan lebih dan lebih tepat. Anda mempunyai akses secara percuma, membolehkannya di pilihan."
},
"unsubmittedSegmentCounts": {
"message": "Anda pada masa ini mempunyai {0} di {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"unsubmittedSegmentCountsZero": {
"message": "Anda pada masa ini tiada segmen belum dihantar",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
},
"unsubmittedSegmentsSingular": {
"message": "segmen belum dihantar",
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
},
"unsubmittedSegmentsPlural": {
"message": "segmen belum dihantar",
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
},
"videosSingular": {
"message": "video",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "video",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "Kosongkan semua segmen",
"description": "Label for a button in settings"
},
"clearUnsubmittedSegmentsConfirm": {
"message": "Adakah anda pasti anda mahu kosongkan semua segmen belum dihantar anda?",
"description": "Confirmation message for the Clear unsubmitted segments button"
},
"showUnsubmittedSegments": {
"message": "Tunjuk segmen",
"description": "Show/hide button for the unsubmitted segments list"
},
"hideUnsubmittedSegments": {
"message": "Sembunyikan segmen",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "ID Video",
"description": "Header of the unsubmitted segments list"
},
"segmentCount": {
"message": "Kiraan Segmen",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "Tindakan",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "Kongsi sebagai URL"
},
"segmentFetchFailureWarning": {
"message": "Amaran: Pelayan belum membalas dengan segmen lagi. Mungkin sebenarnya ada segmen di video ini sudah dihantar tetapi anda hanya belum menerimanya kerana isu dengan pelayan."
} }
} }

View File

@@ -35,6 +35,9 @@
"message": "Segmenten weergeven als hoofdstukken", "message": "Segmenten weergeven als hoofdstukken",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
}, },
"showSegmentNameInChapterBar": {
"message": "Huidig segment weergeven naast videotijd"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Stemmen op deze inzending" "message": "Stemmen op deze inzending"
}, },
@@ -113,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Er is een verbindingsfout opgetreden. Foutcode: " "message": "Er is een verbindingsfout opgetreden. Foutcode: "
}, },
"segmentsStillLoading": {
"message": "Segmenten worden nog steeds geladen..."
},
"clearTimes": { "clearTimes": {
"message": "Segmenten verwijderen" "message": "Segmenten verwijderen"
}, },
@@ -122,6 +128,9 @@
"closePopup": { "closePopup": {
"message": "Pop-up sluiten" "message": "Pop-up sluiten"
}, },
"closeIcon": {
"message": "Pictogram voor sluiten"
},
"SubmitTimes": { "SubmitTimes": {
"message": "Segmenten indienen" "message": "Segmenten indienen"
}, },
@@ -1046,6 +1055,12 @@
"hideSegment": { "hideSegment": {
"message": "Segment verbergen" "message": "Segment verbergen"
}, },
"skipSegment": {
"message": "Segment overslaan"
},
"playChapter": {
"message": "Hoofdstuk afspelen"
},
"SponsorTimeEditScrollNewFeature": { "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." "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."
}, },
@@ -1231,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Delen als URL" "message": "Delen als URL"
},
"segmentFetchFailureWarning": {
"message": "Waarschuwing: de server heeft nog niet gereageerd met segmenten. Misschien zijn er al segmenten van deze video ingediend, maar heeft u ze nog niet ontvangen door problemen met de server."
},
"allowScrollingToEdit": {
"message": "Scrollen toestaan om tijdstippen te bewerken"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Wystąpił błąd połączenia. Kod błędu: " "message": "Wystąpił błąd połączenia. Kod błędu: "
}, },
"segmentsStillLoading": {
"message": "Segmenty nadal się ładują..."
},
"clearTimes": { "clearTimes": {
"message": "Wyczyść segmenty" "message": "Wyczyść segmenty"
}, },
@@ -255,6 +258,9 @@
"enableShowCategoryWithoutPermission": { "enableShowCategoryWithoutPermission": {
"message": "Pokaż kategorie w menu zgłoszeń, nawet bez uprawnień do zgłaszania" "message": "Pokaż kategorie w menu zgłoszeń, nawet bez uprawnień do zgłaszania"
}, },
"whatShowCategoryWithoutPermission": {
"message": "Niektóre kategorie wymagają specjalnych uprawnień, by przesłać segment ze względu na minimalne wymogi reputacji"
},
"showNotice": { "showNotice": {
"message": "Pokaż informacje ponownie" "message": "Pokaż informacje ponownie"
}, },
@@ -475,6 +481,9 @@
"enableManualSkipOnFullVideo": { "enableManualSkipOnFullVideo": {
"message": "Użyj ręcznego pomijania, gdy istnieje etykieta na całym filmie" "message": "Użyj ręcznego pomijania, gdy istnieje etykieta na całym filmie"
}, },
"whatManualSkipOnFullVideo": {
"message": "Dla osób, które chcą oglądać film nieprzerwanie, jeśli film jest w pełni sponsorowany lub autopromocyjny."
},
"skipNoticeDuration": { "skipNoticeDuration": {
"message": "Czas trwania powiadomienia pominięcia (sekundy):" "message": "Czas trwania powiadomienia pominięcia (sekundy):"
}, },
@@ -688,6 +697,9 @@
"category_filler": { "category_filler": {
"message": "Wypełniacz nietematyczny/żart" "message": "Wypełniacz nietematyczny/żart"
}, },
"category_filler_description": {
"message": "To jest bardzo agresywna kategoria, której możesz użyć, jeżeli nie masz ochoty, by widzieć scenki humorystyczne/wypełniacze."
},
"category_filler_short": { "category_filler_short": {
"message": "Wypełniacz" "message": "Wypełniacz"
}, },
@@ -1234,5 +1246,8 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Udostępnij jako adres URL" "message": "Udostępnij jako adres URL"
},
"segmentFetchFailureWarning": {
"message": "Ostrzeżenie: Serwer nie odpowiedział jeszcze na segmenty. Być może segmenty na tym filmie są już wysłane, ale po prostu nie otrzymałeś ich z powodu problemów z serwerem."
} }
} }

View File

@@ -25,6 +25,19 @@
"Segments": { "Segments": {
"message": "segmentos" "message": "segmentos"
}, },
"SegmentsCap": {
"message": "Segmentos"
},
"Chapters": {
"message": "Capítulos"
},
"renderAsChapters": {
"message": "Renderizar segmentos como capítulos",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "Mostrar segmento atual ao lado do tempo do vídeo"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Votar positivamente esta submissão" "message": "Votar positivamente esta submissão"
}, },
@@ -103,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Deu-se um erro de conecção: Código: " "message": "Deu-se um erro de conecção: Código: "
}, },
"segmentsStillLoading": {
"message": "Segmentos ainda a carregar..."
},
"clearTimes": { "clearTimes": {
"message": "Limpar Segmentos" "message": "Limpar Segmentos"
}, },
@@ -115,6 +131,9 @@
"SubmitTimes": { "SubmitTimes": {
"message": "Submeter Segmentos" "message": "Submeter Segmentos"
}, },
"sortSegments": {
"message": "Ordenar Segmentos"
},
"submitCheck": { "submitCheck": {
"message": "Tem a certeza que pretende submeter?" "message": "Tem a certeza que pretende submeter?"
}, },
@@ -256,6 +275,21 @@
"message": "Código-fonte", "message": "Código-fonte",
"description": "Used on Firefox Store Page" "description": "Used on Firefox Store Page"
}, },
"setStartSponsorShortcut": {
"message": "Iniciar/parar segmento",
"description": "Keybind label"
},
"nextChapterKeybind": {
"message": "Próximo capítulo",
"description": "Keybind label"
},
"previousChapterKeybind": {
"message": "Capítulo anterior",
"description": "Keybind label"
},
"502": {
"message": "O servidor parece estar sobrecarregado. Tente novamente em alguns segundos."
},
"errorCode": { "errorCode": {
"message": "Código de erro: " "message": "Código de erro: "
}, },
@@ -307,6 +341,21 @@
"message": " das suas vidas", "message": " das suas vidas",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)." "description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
}, },
"setUserID": {
"message": "Definir UserID Privado"
},
"createdBy": {
"message": "Criado por"
},
"supportedSites": {
"message": "Sites suportados: "
},
"addInvidiousInstanceDescription": {
"message": "Adicione uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app"
},
"addInvidiousInstanceError": {
"message": "Este é um domínio inválido. Isto deve APENAS incluir a parte do domínio. Exemplo: invidious.ajay.app"
},
"areYouSureReset": { "areYouSureReset": {
"message": "Tem certeza que deseja redefinir?" "message": "Tem certeza que deseja redefinir?"
}, },

View File

@@ -25,6 +25,19 @@
"Segments": { "Segments": {
"message": "segmente" "message": "segmente"
}, },
"SegmentsCap": {
"message": "Segmente"
},
"Chapters": {
"message": "Capitolele"
},
"renderAsChapters": {
"message": "Randarea segmentelor ca, capitole",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "Arată ora video din segmentul curent"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Votează această înregistrare" "message": "Votează această înregistrare"
}, },
@@ -112,9 +125,15 @@
"closePopup": { "closePopup": {
"message": "Închide pop-up" "message": "Închide pop-up"
}, },
"closeIcon": {
"message": "Închide pictograma"
},
"SubmitTimes": { "SubmitTimes": {
"message": "Trimite segmente" "message": "Trimite segmente"
}, },
"sortSegments": {
"message": "Sortare Segmente"
},
"submitCheck": { "submitCheck": {
"message": "Sunteți sigur că doriți să trimiteți asta?" "message": "Sunteți sigur că doriți să trimiteți asta?"
}, },
@@ -233,6 +252,12 @@
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "Dacă videoclipul este nou și nu sunt segmente găsite, va continua să se refeteze la fiecare câteva minute în timp ce vizionați." "message": "Dacă videoclipul este nou și nu sunt segmente găsite, va continua să se refeteze la fiecare câteva minute în timp ce vizionați."
}, },
"enableShowCategoryWithoutPermission": {
"message": "Arată categoriile în meniul de adăugare chiar fără permisiunea de adăugare"
},
"whatShowCategoryWithoutPermission": {
"message": "Unele categorii necesită permisiunea de a depune din cauza cerințelor minime de reputație"
},
"showNotice": { "showNotice": {
"message": "Arată Notificarea Din Nou" "message": "Arată Notificarea Din Nou"
}, },
@@ -289,6 +314,14 @@
"message": "Predă segmentele", "message": "Predă segmentele",
"description": "Keybind label" "description": "Keybind label"
}, },
"nextChapterKeybind": {
"message": "Capitolul următor",
"description": "Keybind label"
},
"previousChapterKeybind": {
"message": "Capitolul anterior",
"description": "Keybind label"
},
"keybindDescription": { "keybindDescription": {
"message": "Selectează o tastă prin a o tasta, și alege orice taste modificatoare pe care dorești să o folosești." "message": "Selectează o tastă prin a o tasta, și alege orice taste modificatoare pe care dorești să o folosești."
}, },
@@ -318,7 +351,7 @@
"message": "Mut" "message": "Mut"
}, },
"full": { "full": {
"message": "Întregul Videoclip", "message": "Video complet",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion." "description": "Used for the name of the option to label an entire video as sponsor or self promotion."
}, },
"skip_category": { "skip_category": {
@@ -387,9 +420,18 @@
"statusReminder": { "statusReminder": {
"message": "Verificați status.sponsor.ajay.app pentru starea serverului." "message": "Verificați status.sponsor.ajay.app pentru starea serverului."
}, },
"changeUserID": {
"message": "Importă/Exportă UserID-ul tău Privat"
},
"whatChangeUserID": { "whatChangeUserID": {
"message": "Aceste informații sunt private și nu ar trebui să fie dezvăluite nimănui. Dacă cineva are aceste informații, pot fi folosite pentru a vă imita. În cazul în care vă căutați ID-ul public de utilizator, dați click pe icoana de clipboard din popup." "message": "Aceste informații sunt private și nu ar trebui să fie dezvăluite nimănui. Dacă cineva are aceste informații, pot fi folosite pentru a vă imita. În cazul în care vă căutați ID-ul public de utilizator, dați click pe icoana de clipboard din popup."
}, },
"setUserID": {
"message": "Setare UserID privat"
},
"userIDChangeWarning": {
"message": "Avertisment: Modificarea Id-ului de utilizator privat este permanentă. Sunteți sigur că doriți să faceți acest lucru? Asigurați-vă că ați făcut o copie de rezervă pe cea veche, pentru orice eventualitate."
},
"createdBy": { "createdBy": {
"message": "Creat De" "message": "Creat De"
}, },
@@ -409,6 +451,9 @@
"addInvidiousInstance": { "addInvidiousInstance": {
"message": "Adaugă Instanță pentru clienți 3rd-party" "message": "Adaugă Instanță pentru clienți 3rd-party"
}, },
"addInvidiousInstanceDescription": {
"message": "Adăugați o instanță personalizată. Aceasta trebuie să fie formatată DOAR cu domeniul. Exemplu: invidious.ajay.app"
},
"add": { "add": {
"message": "Adaugă" "message": "Adaugă"
}, },
@@ -430,12 +475,24 @@
"minDurationDescription": { "minDurationDescription": {
"message": "Segmentele mai scurte decât valoarea setată nu vor fi omise sau afișate în player." "message": "Segmentele mai scurte decât valoarea setată nu vor fi omise sau afișate în player."
}, },
"enableManualSkipOnFullVideo": {
"message": "Utilizați omiterea manuală atunci când există o etichetă video completă"
},
"whatManualSkipOnFullVideo": {
"message": "Pentru persoanele care doresc să vizioneze videoclipul neîntrerupt dacă acesta este sponsorizat în totalitate sau dacă este autopromovat."
},
"skipNoticeDuration": { "skipNoticeDuration": {
"message": "Durata notificărilor de omitere (secunde):" "message": "Durata notificărilor de omitere (secunde):"
}, },
"skipNoticeDurationDescription": {
"message": "Notificarea sări peste va rămâne pe ecran cel puțin atâtea secunde. Pentru omiterea manuală, este posibil să fie vizibilă pentru mai mult timp."
},
"shortCheck": { "shortCheck": {
"message": "Următoarea înregistrare este mai mică decât opțiunea voastră de durată minimă. Acest lucru ar putea însemna că a fost deja trimisă și a fost ignorat datorită acestei opțiuni. Sunteți sigur că doriți să trimiteți?" "message": "Următoarea înregistrare este mai mică decât opțiunea voastră de durată minimă. Acest lucru ar putea însemna că a fost deja trimisă și a fost ignorat datorită acestei opțiuni. Sunteți sigur că doriți să trimiteți?"
}, },
"liveOrPremiere": {
"message": "Nu este permisă adăugarea pe un live stream sau pe o primă. Vă rugăm să așteptați până se termină, apoi reîmprospătați pagina și verificați dacă segmentele sunt încă valide."
},
"showUploadButton": { "showUploadButton": {
"message": "Arată Butonul De Încărcare" "message": "Arată Butonul De Încărcare"
}, },
@@ -472,6 +529,9 @@
"exportOptionsUpload": { "exportOptionsUpload": {
"message": "Încarcă din fișier" "message": "Încarcă din fișier"
}, },
"whatExportOptions": {
"message": "Aceasta este întreaga configurație în format JSON. Asta include si ID-ul tău privat de utilizator, așa că fi sigur să împărtășești asta cu înțelepciune."
},
"setOptions": { "setOptions": {
"message": "Setează Opțiuni" "message": "Setează Opțiuni"
}, },
@@ -517,10 +577,23 @@
"copyDebugInformationComplete": { "copyDebugInformationComplete": {
"message": "Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori." "message": "Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori."
}, },
"keyAlreadyUsed": {
"message": "Această scurtătură este legată de o altă acțiune. Vă rugăm să selectați una diferită."
},
"to": { "to": {
"message": "până la", "message": "până la",
"description": "Used between segments. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
}, },
"CopiedExclamation": {
"message": "Copiat!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"generic_guideline1": {
"message": "Include tranzițiile segmentului"
},
"generic_guideline2": {
"message": "Reda ca și cum nimic nu a fost omis"
},
"category_sponsor": { "category_sponsor": {
"message": "Sponsor" "message": "Sponsor"
}, },
@@ -545,15 +618,37 @@
"category_selfpromo_guideline2": { "category_selfpromo_guideline2": {
"message": "Mențiuni neplătite care nu ajută videoclipul" "message": "Mențiuni neplătite care nu ajută videoclipul"
}, },
"category_selfpromo_guideline3": {
"message": "Nu pentru produsele proiectate și merch"
},
"category_exclusive_access": { "category_exclusive_access": {
"message": "Acces Exclusiv" "message": "Acces Exclusiv"
}, },
"category_exclusive_access_description": {
"message": "Doar pentru etichetarea videoclipurilor întregi. Folosit atunci când un video prezintă un produs, serviciu sau o locație la care au primit acces gratuit sau subvenționat."
},
"category_exclusive_access_pill": {
"message": "Acest videoclip prezintă un produs, serviciu sau o locație la care au primit acces gratuit sau subvenționat",
"description": "Short description for this category"
},
"category_exclusive_access_guideline1": {
"message": "Întreaga înregistrare video prezintă ceva cu acces liber sau subvenționat"
},
"category_interaction": { "category_interaction": {
"message": "Reamintire de Interactiune (Abonare)" "message": "Reamintire de Interactiune (Abonare)"
}, },
"category_interaction_description": { "category_interaction_description": {
"message": "Când există o scurtă remintire pentru like, abonare sau urmărire în mijlocul conținutului. Daca este mai lung sau despre ceva specific, folosiți autopromovarea." "message": "Când există o scurtă remintire pentru like, abonare sau urmărire în mijlocul conținutului. Daca este mai lung sau despre ceva specific, folosiți autopromovarea."
}, },
"category_interaction_guideline1": {
"message": "Scurte memento-uri pentru a vă abona sau urmări"
},
"category_interaction_guideline2": {
"message": "Include memento-uri indirecte de comentat"
},
"category_interaction_guideline3": {
"message": "Nu pentru promovare generală, se face apel doar la acțiune"
},
"category_interaction_short": { "category_interaction_short": {
"message": "Reamintire de Interacțiune" "message": "Reamintire de Interacțiune"
}, },
@@ -566,21 +661,99 @@
"category_intro_short": { "category_intro_short": {
"message": "Pauză" "message": "Pauză"
}, },
"category_intro_guideline1": {
"message": "Interval fără conținut real"
},
"category_intro_guideline2": {
"message": "Nu se efectuează tranziții cu informații"
},
"category_outro": { "category_outro": {
"message": "Ecran De Final/Credite" "message": "Ecran De Final/Credite"
}, },
"category_outro_description": { "category_outro_description": {
"message": "Credite sau atunci când apare ecranul de final YouTube. Nu pentru concluzii cu informații." "message": "Credite sau atunci când apare ecranul de final YouTube. Nu pentru concluzii cu informații."
}, },
"category_outro_guideline1": {
"message": "Nu include conținutul, chiar dacă end card-urile sunt pe ecran"
},
"category_preview": {
"message": "Previzualizare/Recapitulare"
},
"category_preview_description": {
"message": "Colecția de clipuri care arată ce se află în acest videoclip sau alte videoclipuri într-o serie în care toate informațiile sunt repetate mai târziu în videoclip."
},
"category_preview_guideline1": {
"message": "Clipuri care apar mai târziu sau într-un video viitor"
},
"category_preview_guideline2": {
"message": "Recapitularea unui videoclip anterior"
},
"category_preview_guideline3": {
"message": "Nu pentru secțiunile care adaugă conținut suplimentar"
},
"category_filler": {
"message": "Glume de Umplutură/Tangențiale"
},
"category_filler_description": {
"message": "Scenele tactil adăugate numai pentru umplutură sau umor care nu sunt necesare pentru a înțelege conținutul principal al videoclipului. Aceasta nu ar trebui să includă segmente care să ofere detalii de context sau de fundal. Aceasta este o categorie foarte agresivă, pentru care nu ești în starea de spirit pentru \"distracție\"."
},
"category_filler_short": { "category_filler_short": {
"message": "Materiale de umplutură" "message": "Materiale de umplutură"
}, },
"category_filler_guideline1": {
"message": "Scenele tactil numai pentru umplere sau umor"
},
"category_filler_guideline2": {
"message": "Distracții, blooper, reluări"
},
"category_filler_guideline3": {
"message": "Nu sunt necesare scene pentru a înțelege subiectul"
},
"category_music_offtopic": { "category_music_offtopic": {
"message": "Muzică: Secţiune Non-Muzicală" "message": "Muzică: Secţiune Non-Muzicală"
}, },
"category_music_offtopic_description": {
"message": "Doar pentru a fi folosit în videoclipuri muzicale. Acesta ar trebui să fie folosit doar pentru secțiunile de videoclipuri muzicale care nu sunt deja acoperite de o altă categorie."
},
"category_music_offtopic_short": { "category_music_offtopic_short": {
"message": "Non-Muzical" "message": "Non-Muzical"
}, },
"category_music_offtopic_guideline1": {
"message": "Secțiuni care nu sunt în lansări oficiale"
},
"category_music_offtopic_guideline2": {
"message": "Fără muzica într-un spectacol in direct"
},
"category_poi_highlight": {
"message": "Momente importante"
},
"category_poi_highlight_description": {
"message": "Partea din videoclip pe care majoritatea oamenilor o caută. Similar cu \"Videoclipul începe de la x\"."
},
"category_poi_highlight_guideline1": {
"message": "Secțiunea pe care majoritatea persoanelor o caută"
},
"category_poi_highlight_guideline2": {
"message": "Poate sări peste context"
},
"category_poi_highlight_guideline3": {
"message": "Poți sări la titlu sau miniatură"
},
"category_chapter": {
"message": "Capitol"
},
"category_chapter_description": {
"message": "Capitolele cu nume personalizate care descriu secțiuni majore ale unui videoclip."
},
"category_chapter_guideline1": {
"message": "Nu menţiona numele de marcă sponsor"
},
"category_chapter_guideline2": {
"message": "Folosește capitole mai mari pentru secțiunile generale"
},
"category_chapter_guideline3": {
"message": "Capitolele mai mici pot fi plasate în interiorul capitolelor mai mari"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "Transmisiune În Direct: Donație/Citirea Mesajelor" "message": "Transmisiune În Direct: Donație/Citirea Mesajelor"
}, },
@@ -599,6 +772,27 @@
"disable": { "disable": {
"message": "Dezactivare" "message": "Dezactivare"
}, },
"autoSkip_POI": {
"message": "Omitere automată la început"
},
"manualSkip_POI": {
"message": "Întreabă când se încarcă videoclipul"
},
"showOverlay_POI": {
"message": "Arată În Bara de Derulare"
},
"showOverlay_full": {
"message": "Arată eticheta"
},
"showOverlay_chapter": {
"message": "Afișează Capitolele"
},
"autoSkipOnMusicVideos": {
"message": "Omiteți automat toate segmentele atunci când există un segment non-muzical"
},
"muteSegments": {
"message": "Permite segmente care blochează sunetul în loc de a sări peste"
},
"fullVideoSegments": { "fullVideoSegments": {
"message": "Arată o icoană atunci când un videoclip este în întregime o reclamă", "message": "Arată o icoană atunci când un videoclip este în întregime o reclamă",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo" "description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
@@ -648,6 +842,10 @@
"bracketEnd": { "bracketEnd": {
"message": "(Sfârșit)" "message": "(Sfârșit)"
}, },
"End": {
"message": "Sfârșit",
"description": "Button that skips to the end of a segment"
},
"hiddenDueToDownvote": { "hiddenDueToDownvote": {
"message": "ascuns: downvote" "message": "ascuns: downvote"
}, },
@@ -657,9 +855,25 @@
"manuallyHidden": { "manuallyHidden": {
"message": "ascuns manual" "message": "ascuns manual"
}, },
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "ID-ul canalului nu este încă încărcat. Dacă utilizați un videoclip încorporat, încercați în schimb să utilizați pagina de pornire YouTube. Acest lucru ar putea fi cauzat și de modificările aduse aspectului YouTube, dacă credeți că faceți un comentariu aici:"
},
"invidiousPermissionRefresh": {
"message": "Browserul a revocat permisiunea necesară pentru a funcționa pe site-urile Invidioase și pe alte site-uri de 3 părți. Vă rugăm să faceți clic pe butonul de mai jos pentru a reactiva această permisiune."
},
"acceptPermission": { "acceptPermission": {
"message": "Acceptă permisiunea" "message": "Acceptă permisiunea"
}, },
"permissionRequestSuccess": {
"message": "Solicitarea permisiunii reușită!"
},
"permissionRequestFailed": {
"message": "Solicitarea permisiunii a eșuat, ai dat clic pe refuz?"
},
"adblockerIssueWhitelist": {
"message": "Dacă nu puteți rezolva acest lucru, apoi dezactivați setarea 'Forțați verificarea canalului înainte de sărit', deoarece SponsorBlock nu poate prelua informațiile canalului pentru acest videoclip"
},
"forceChannelCheck": { "forceChannelCheck": {
"message": "Forțează verificarea canalului înainte de a sări" "message": "Forțează verificarea canalului înainte de a sări"
}, },
@@ -672,6 +886,16 @@
"downvoteDescription": { "downvoteDescription": {
"message": "Timpi Incorecți/Greșiți" "message": "Timpi Incorecți/Greșiți"
}, },
"incorrectVote": {
"message": "Incorect"
},
"harmfulVote": {
"message": "Periculos",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
},
"incorrectCategory": {
"message": "Schimbare categorie"
},
"nonMusicCategoryOnMusic": { "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." "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."
}, },
@@ -691,6 +915,110 @@
"categoryUpdate2": { "categoryUpdate2": {
"message": "Deschide opțiunile pentru a sări peste intro-uri, outro-uri, merch, etc." "message": "Deschide opțiunile pentru a sări peste intro-uri, outro-uri, merch, etc."
}, },
"help": {
"message": "Ajutor"
},
"GotIt": {
"message": "Am înțeles",
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "Acest segment este mare. Dacă întregul videoclip este aproximativ un subiect, atunci schimbați de la \"Săriți\" la \"Videoclip întreg\". Vedeți instrucțiunile pentru mai multe informații."
},
"categoryPillTitleText": {
"message": "Acest întreg videoclip este etichetat ca această categorie și este prea strâns integrat pentru a putea separa"
},
"chapterNameTooltipWarning": {
"message": "Unul dintre numele capitolelor tale este similar cu o categorie. Ar trebui să folosești categorii atunci când este posibil."
},
"experiementOptOut": {
"message": "Renunțarea tuturor experimentelor viitoare",
"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": "Ascunde pentru totdeauna"
},
"warningChatInfo": {
"message": "Am observat că făceați niște greșeli comune care nu sunt răuvoitoare"
},
"warningTitle": {
"message": "Ai primit o avertizare"
},
"questionButton": {
"message": "Am o întrebare"
},
"warningConfirmButton": {
"message": "Înțeleg motivul"
},
"warningError": {
"message": "Eroare la încercarea de a confirma avertismentul:"
},
"Donate": {
"message": "Donează"
},
"considerDonating": {
"message": "Ajută la dezvoltarea fondului"
},
"hideDonationLink": {
"message": "Ascunde linkul de donare"
},
"darkModeOptionsPage": {
"message": "Modul întunecat pe pagina de opțiuni"
},
"helpPageThanksForInstalling": {
"message": "Vă mulțumim pentru instalarea SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Vă rugăm să analizați opțiunile de mai jos"
},
"helpPageFeatureDisclaimer": {
"message": "Multe caracteristici sunt dezactivate în mod implicit. Dacă doriți să săriți peste introduceri, outros, utilizați Invidios, etc., activați-le mai jos. De asemenea, puteți ascunde/afișa elemente UI."
},
"helpPageHowSkippingWorks": {
"message": "Cum funcționează omiterea"
},
"helpPageHowSkippingWorks1": {
"message": "Segmentele video vor fi omise automat dacă sunt găsite în baza de date. Poți deschide fereastra pop-up făcând clic pe pictograma extensiei pentru a obține o previzualizare a ceea ce sunt."
},
"helpPageHowSkippingWorks2": {
"message": "Ori de câte ori săriți peste un segment, veți primi observație. Dacă sincronizarea pare greșită votând în jos făcând clic pe vot! De asemenea, poți vota în pop-up."
},
"Submitting": {
"message": "Se transmite"
},
"helpPageSubmitting1": {
"message": "Trimiterea poate fi făcută fie în fereastra pop-up prin apăsarea butonului \"Segmentul Incepe Acum\", fie în video player-ul cu butoanele playerului."
},
"helpPageSubmitting2": {
"message": "Făcând clic pe butonul de redare indică începutul unui segment și apăsând pe pictograma de stop indică sfârșitul. Poți pregăti mai mulți sponsori înainte de a apasă pe butonul de încărcare va fi trimis. Click-ul pe gunoi se va șterge."
},
"Editing": {
"message": "Editează"
},
"helpPageEditing1": {
"message": "Dacă ai greșit, poți edita sau șterge segmentele după ce dai click pe butonul săgeată în sus."
},
"helpPageTooSlow": {
"message": "Acest lucru este prea lent"
},
"helpPageTooSlow1": {
"message": "Exista scurtături daca dorești sa le folosești. Apăsați tasta cu punct și virgulă pentru a indica începutul/sfârșitul unui segment de sponsor și faceți clic pe apostrof pentru a trimite. Acestea pot fi schimbate în opțiuni. Dacă nu utilizați QWERTY, probabil ar trebui să schimbați scurtăturile."
},
"helpPageCopyOfDatabase": {
"message": "Pot obține o copie a bazei de date? Ce se întâmplă dacă dispari?"
},
"helpPageCopyOfDatabase1": {
"message": "Baza de date este publică și disponibilă la adresa"
},
"helpPageCopyOfDatabase2": {
"message": "Codul sursă este disponibil gratuit. Deci, chiar dacă ceva mi se întâmplă mie, trimiterile tale nu sunt pierdute."
},
"helpPageNews": {
"message": "Știri și modul în care este făcut"
},
"helpPageSourceCode": {
"message": "Unde pot obține codul sursă?"
},
"Credits": { "Credits": {
"message": "Contribuții" "message": "Contribuții"
}, },
@@ -700,15 +1028,42 @@
"FullDetails": { "FullDetails": {
"message": "Detalii Complete" "message": "Detalii Complete"
}, },
"CopyDownvoteButtonInfo": {
"message": "Voturi negative și creați o copie locală pentru a retrimite"
},
"OpenCategoryWikiPage": {
"message": "Deschide pagina wiki a acestei categorii."
},
"CopyAndDownvote": { "CopyAndDownvote": {
"message": "Copiază și dă downvote" "message": "Copiază și dă downvote"
}, },
"ContinueVoting": {
"message": "Continuă votarea"
},
"ChangeCategoryTooltip": {
"message": "Acest lucru se va aplica instantaneu segmentelor dvs"
},
"downvote": { "downvote": {
"message": "Downvote" "message": "Downvote"
}, },
"upvote": { "upvote": {
"message": "Upvote" "message": "Upvote"
}, },
"hideSegment": {
"message": "Ascunde segmentul"
},
"skipSegment": {
"message": "Sari peste segment"
},
"playChapter": {
"message": "Reda capitolul"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Folosește rotița mouse-ului în timp ce ești deasupra casetei de editare pentru a ajusta rapid timpul. Combinațiile dintre ctrl sau Shift pot fi folosite pentru a ajusta modificările."
},
"categoryPillNewFeature": {
"message": "Nou! Vezi când un videoclip este sponsorizat în întregime sau auto-promovat"
},
"dayAbbreviation": { "dayAbbreviation": {
"message": "zile", "message": "zile",
"description": "100d" "description": "100d"
@@ -741,10 +1096,152 @@
"message": "Aspectul notificării de omiteri", "message": "Aspectul notificării de omiteri",
"description": "Option label" "description": "Option label"
}, },
"unbind": {
"message": "Unbind",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Nesetat"
},
"change": {
"message": "Schimbă"
},
"youtubeKeybindWarning": {
"message": "Aceasta este o scurtătură YouTube integrată. Ești sigur că vrei să o folosești?"
},
"betaServerWarning": {
"message": "Serverul BETA este activat!"
},
"openOptionsPage": {
"message": "Deschide pagina de opțiuni"
},
"resetToDefault": { "resetToDefault": {
"message": "Resetați setările la valori implicite" "message": "Resetați setările la valori implicite"
}, },
"confirmResetToDefault": { "confirmResetToDefault": {
"message": "Ești sigur că vrei sa resetezi toate setările la valorile lor implicite? Această acțiune nu poate fi anulată." "message": "Ești sigur că vrei sa resetezi toate setările la valorile lor implicite? Această acțiune nu poate fi anulată."
},
"exportSegments": {
"message": "Exportare segmente"
},
"importSegments": {
"message": "Importare segmente"
},
"Import": {
"message": "Importă",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"redeemSuccess": {
"message": "Revendicare cu succes!"
},
"redeemFailed": {
"message": "Cheia de licență nu este validă"
},
"hideUpsells": {
"message": "Ascunde opțiunile indisponibile fără o plată suplimentara"
},
"chooseACountry": {
"message": "Selectați țara"
},
"noDiscount": {
"message": "Nu te califici pentru o reducere"
},
"discountLink": {
"message": "Link de reducere (Vezi prețul roz)"
},
"selectYourCountry": {
"message": "Selectaţi ţara"
},
"alreadyDonated": {
"message": "Dacă ai donat orice sumă înainte, poți revendica acces gratuit prin e-mail:",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "Dacă nu vă puteți permite să achiziționați o licență, faceți clic pe {aici} pentru a vedea dacă sunteți eligibil pentru o reducere",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": {
"message": "Conectează-te cu Patreon"
},
"redeem": {
"message": "Folosește"
},
"joinOnPatreon": {
"message": "Abonează-te pe Patreon"
},
"oneTimePurchase": {
"message": "Achiziție unică"
},
"enterLicenseKey": {
"message": "Introdu cheia de licență"
},
"chaptersPage1": {
"message": "Funcția SponsorBlock crowd-sourted capitol este disponibilă doar pentru persoanele care achiziționează o licență, fie persoanelor cărora li se acordă acces gratuit la contribuţiile lor anterioare"
},
"chaptersPage2": {
"message": "Notă: Permisiunea de a trimite capitole este încă bazată pe reputația calculată. Achiziționarea unei licențe vă permite doar să vizualizați capitolele prezentate de alții",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": {
"message": "Funcție nouă: Capitole personalizate din surse colective. Acestea sunt secțiuni personalizate în videoclipuri care pot fi stivuite pentru a deveni din ce în ce mai precise. Cumpără o licență pentru a vizualiza capitolele trimise pe acest videoclip, cum ar fi: ",
"description": "After the comma, a list of chapters for this video will appear"
},
"chapterNewFeature2": {
"message": "Funcție nouă: Capitole personalizate din surse colective. Acestea sunt secțiuni personalizate în videoclipuri care pot fi stivuite pentru a deveni din ce în ce mai precise. Ai acces gratuit, activeaz-o in opțiuni."
},
"unsubmittedSegmentCounts": {
"message": "Ai în prezent {0} pe {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"unsubmittedSegmentCountsZero": {
"message": "În prezent nu aveți segmente netrimise",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
},
"unsubmittedSegmentsSingular": {
"message": "segment netransmis",
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
},
"unsubmittedSegmentsPlural": {
"message": "segmente netransmise",
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
},
"videosSingular": {
"message": "videoclip",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "videoclipuri",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "Curăță toate segmentele",
"description": "Label for a button in settings"
},
"clearUnsubmittedSegmentsConfirm": {
"message": "Sigur doriți ștergerea tuturor segmentelor netransmise?",
"description": "Confirmation message for the Clear unsubmitted segments button"
},
"showUnsubmittedSegments": {
"message": "Arată segmentele",
"description": "Show/hide button for the unsubmitted segments list"
},
"hideUnsubmittedSegments": {
"message": "Ascunde segmentele",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "ID videoclip",
"description": "Header of the unsubmitted segments list"
},
"segmentCount": {
"message": "Numărul de segmente",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "Acțiuni",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "Distribuie ca URL"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Ошибка соединения. Код ошибки: " "message": "Ошибка соединения. Код ошибки: "
}, },
"segmentsStillLoading": {
"message": "Сегменты все еще загружаются..."
},
"clearTimes": { "clearTimes": {
"message": "Очистить сегменты" "message": "Очистить сегменты"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Поделиться ссылкой" "message": "Поделиться ссылкой"
},
"segmentFetchFailureWarning": {
"message": "Внимание: Сервер еще не прислал существующие сегменты. В этом видео уже могут быть отправленные сегменты, но вы их ещё не получили из-за проблем с сервером."
},
"allowScrollingToEdit": {
"message": "Разрешить прокрутку для редактирования времени"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Nastala chyba pripojenia. Kód chyby: " "message": "Nastala chyba pripojenia. Kód chyby: "
}, },
"segmentsStillLoading": {
"message": "Segmenty sa ešte nahrávajú..."
},
"clearTimes": { "clearTimes": {
"message": "Zmazať segmenty" "message": "Zmazať segmenty"
}, },
@@ -131,6 +134,9 @@
"SubmitTimes": { "SubmitTimes": {
"message": "Odoslať segmenty" "message": "Odoslať segmenty"
}, },
"sortSegments": {
"message": "Triedenie segmentov"
},
"submitCheck": { "submitCheck": {
"message": "Naozaj to chcete odoslať?" "message": "Naozaj to chcete odoslať?"
}, },
@@ -228,6 +234,15 @@
"enableViewTrackingInPrivate": { "enableViewTrackingInPrivate": {
"message": "Zapnúť počítanie preskočení v inkognito oknách" "message": "Zapnúť počítanie preskočení v inkognito oknách"
}, },
"enableTrackDownvotes": {
"message": "Uložiť segmenty, ktoré boli downvotované"
},
"whatTrackDownvotes": {
"message": "Všetky segmenty, ktoré znížite, zostanú skryté aj po obnovení"
},
"trackDownvotesWarning": {
"message": "Varovanie: Vypnutím tejto funkcie sa vymažú všetky predtým uložené downvoty"
},
"enableQueryByHashPrefix": { "enableQueryByHashPrefix": {
"message": "Dopyt podľa hash prefixu" "message": "Dopyt podľa hash prefixu"
}, },
@@ -290,6 +305,18 @@
"message": "Ak sa vám to stále nepáčí, stlačte tlačidlo Nikdy nezobrazovať.", "message": "Ak sa vám to stále nepáčí, stlačte tlačidlo Nikdy nezobrazovať.",
"description": "The second line of the message displayed after the notice was upgraded." "description": "The second line of the message displayed after the notice was upgraded."
}, },
"setSkipShortcut": {
"message": "Preskočiť segment",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "Segment štart/stop",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Odoslať segmenty",
"description": "Keybind label"
},
"nextChapterKeybind": { "nextChapterKeybind": {
"message": "Ďalšia kapitola", "message": "Ďalšia kapitola",
"description": "Keybind label" "description": "Keybind label"
@@ -298,6 +325,9 @@
"message": "Predošlá kapitola", "message": "Predošlá kapitola",
"description": "Keybind label" "description": "Keybind label"
}, },
"keybindDescription": {
"message": "Vyberte kláves jeho zadaním a vyberte všetky modifikačné klávesy, ktoré chcete použiť."
},
"0": { "0": {
"message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak vám internet funguje, server je pravdepodobne preťažený alebo nefunkčný." "message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak vám internet funguje, server je pravdepodobne preťažený alebo nefunkčný."
}, },
@@ -393,9 +423,18 @@
"statusReminder": { "statusReminder": {
"message": "Stav servera skontrolujete na status.sponsor.ajay.app." "message": "Stav servera skontrolujete na status.sponsor.ajay.app."
}, },
"changeUserID": {
"message": "Import/export vášho súkromného ID používateľa"
},
"whatChangeUserID": { "whatChangeUserID": {
"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 by vám uškodiť. Ak hľadáte vaše verejné ID používateľa, stlačte ikonu schránky v podokne." "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 by vám uškodiť. Ak hľadáte vaše verejné ID používateľa, stlačte ikonu schránky v podokne."
}, },
"setUserID": {
"message": "Nastavenie súkromného identifikátora používateľa"
},
"userIDChangeWarning": {
"message": "Varovanie: Zmena súkromného ID používateľa je trvalá. Ste si istí, že to chcete urobiť? Pre istotu si zálohujte svoje staré."
},
"createdBy": { "createdBy": {
"message": "Vytvoril" "message": "Vytvoril"
}, },
@@ -439,6 +478,12 @@
"minDurationDescription": { "minDurationDescription": {
"message": "Segmenty kratšie ako nastavená hodnota nebudú preskočené ani zobrazené v prehrávači." "message": "Segmenty kratšie ako nastavená hodnota nebudú preskočené ani zobrazené v prehrávači."
}, },
"enableManualSkipOnFullVideo": {
"message": "Používanie manuálneho preskočenia, ak existuje úplný štítok videa"
},
"whatManualSkipOnFullVideo": {
"message": "Pre ľudí, ktorí chcú sledovať video bez prerušenia, ak je plne sponzorované alebo ide o vlastnú propagáciu."
},
"skipNoticeDuration": { "skipNoticeDuration": {
"message": "Trvanie oznámenia o preskočení (v sekundách):" "message": "Trvanie oznámenia o preskočení (v sekundách):"
}, },
@@ -478,6 +523,18 @@
"exportOptions": { "exportOptions": {
"message": "Import/export všetkých nastavení" "message": "Import/export všetkých nastavení"
}, },
"exportOptionsCopy": {
"message": "Upraviť/kopírovať"
},
"exportOptionsDownload": {
"message": "Uložiť do súboru"
},
"exportOptionsUpload": {
"message": "Načítanie do súboru"
},
"whatExportOptions": {
"message": "Toto je celá vaša konfigurácia vo formáte JSON. Zahŕňa vaše súkromné ID používateľa, preto ho nezabudnite rozumne zdieľať."
},
"setOptions": { "setOptions": {
"message": "Nastaviť Nastavenia" "message": "Nastaviť Nastavenia"
}, },
@@ -523,6 +580,9 @@
"copyDebugInformationComplete": { "copyDebugInformationComplete": {
"message": "Debug informácie boli skopírované do schránky. Ak chcete, môžete odstrániť akékoľvek informácie, ktoré nechcete zdieľať. Uložte si ich do textového súboru alebo ich vložte do nahlásenia chyby." "message": "Debug informácie boli skopírované do schránky. Ak chcete, môžete odstrániť akékoľvek informácie, ktoré nechcete zdieľať. Uložte si ich do textového súboru alebo ich vložte do nahlásenia chyby."
}, },
"keyAlreadyUsed": {
"message": "Táto skratka je viazaná na inú akciu. Vyberte inú."
},
"to": { "to": {
"message": "do", "message": "do",
"description": "Used between segments. Example: 1:20 to 1:30" "description": "Used between segments. Example: 1:20 to 1:30"
@@ -634,6 +694,12 @@
"category_preview_guideline3": { "category_preview_guideline3": {
"message": "Nie pre sekcie, ktoré majú dodatočný obsah" "message": "Nie pre sekcie, ktoré majú dodatočný obsah"
}, },
"category_filler": {
"message": "Výplň Tangent / Vtipy"
},
"category_filler_description": {
"message": "Vedľajšie scény pridané len ako výplň alebo humor, ktoré nie sú potrebné na pochopenie hlavného obsahu videa. Nemali by sem patriť segmenty poskytujúce kontext alebo detaily pozadia. Toto je veľmi agresívna kategória určená na to, keď nemáte náladu na \"zábavu\"."
},
"category_filler_short": { "category_filler_short": {
"message": "Odbočka" "message": "Odbočka"
}, },
@@ -789,6 +855,9 @@
"hiddenDueToDuration": { "hiddenDueToDuration": {
"message": "skryté: príliš krátke" "message": "skryté: príliš krátke"
}, },
"manuallyHidden": {
"message": "ručne skryté"
},
"channelDataNotFound": { "channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.", "description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "ID kanála sa ešte nenačítalo. Ak pozeráte video vložené na stránke, skúste ísť radšej priamo na YouTube. Problém mohli spôsobiť zmeny na YouTube. Ak je tomu tak, zanechajte komentár:" "message": "ID kanála sa ešte nenačítalo. Ak pozeráte video vložené na stránke, skúste ísť radšej priamo na YouTube. Problém mohli spôsobiť zmeny na YouTube. Ak je tomu tak, zanechajte komentár:"
@@ -890,9 +959,15 @@
"Donate": { "Donate": {
"message": "Prispieť" "message": "Prispieť"
}, },
"considerDonating": {
"message": "Zvážte darovanie"
},
"hideDonationLink": { "hideDonationLink": {
"message": "Skryť možnosti prispenia" "message": "Skryť možnosti prispenia"
}, },
"darkModeOptionsPage": {
"message": "Tmavý režim na stránke s možnosťami"
},
"helpPageThanksForInstalling": { "helpPageThanksForInstalling": {
"message": "Ďakujeme za inštaláciu SponsorBlock-u." "message": "Ďakujeme za inštaláciu SponsorBlock-u."
}, },
@@ -1000,19 +1075,68 @@
"message": "h", "message": "h",
"description": "100h" "description": "100h"
}, },
"optionsTabBehavior": {
"message": "Správanie",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "Rozhranie",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "Klávesové skratky",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "Zálohovanie/obnova",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Rôzne",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Preskočiť vzhľad oznámenia",
"description": "Option label"
},
"unbind": {
"message": "Zrušenie väzby",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Nie je nastavené"
},
"change": {
"message": "Zmena"
},
"youtubeKeybindWarning": {
"message": "Toto je zabudovaná skratka YouTube. Ste si istí, že ju chcete použiť?"
},
"betaServerWarning": { "betaServerWarning": {
"message": "Je zapnutý BETA server!" "message": "Je zapnutý BETA server!"
}, },
"openOptionsPage": { "openOptionsPage": {
"message": "Otvoriť stránku s nastaveniami" "message": "Otvoriť stránku s nastaveniami"
}, },
"resetToDefault": {
"message": "Obnovenie predvolených nastavení"
},
"confirmResetToDefault": {
"message": "Ste si istí, že chcete obnoviť všetky nastavenia na predvolené hodnoty? To sa nedá vrátiť späť."
},
"exportSegments": { "exportSegments": {
"message": "Exportovať segmenty" "message": "Exportovať segmenty"
}, },
"importSegments": {
"message": "Import segmentov"
},
"Import": { "Import": {
"message": "Import", "message": "Import",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
}, },
"redeemSuccess": {
"message": "Úspešne vykúpiť!"
},
"redeemFailed": { "redeemFailed": {
"message": "Licenčný kľúč nie je platný" "message": "Licenčný kľúč nie je platný"
}, },
@@ -1057,8 +1181,62 @@
"chaptersPage1": { "chaptersPage1": {
"message": "Crowd-sourcované kapitovly v SponsorBlock-u sú dostupné len po zakúpení licencie alebo zadarmo pre ľudí, ktorí už v minulosti prispeli" "message": "Crowd-sourcované kapitovly v SponsorBlock-u sú dostupné len po zakúpení licencie alebo zadarmo pre ľudí, ktorí už v minulosti prispeli"
}, },
"chaptersPage2": {
"message": "Poznámka: Povolenie na predkladanie kapitol je stále založené na vypočítanej reputácii. Zakúpenie licencie vám umožní iba prezerať kapitoly, ktoré odoslali iní",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": { "chapterNewFeature": {
"message": "Nová funkcia: Crowd-sourcované vlastné kapitoly. Toto sú sekcie videa s vlastnými názvami, ktoré môžu byť pre väčšiu presnosť vyskladané. Ak si kúpite licenciu, uvidíte kapitoly v tomto videu, ako napr.: ", "message": "Nová funkcia: Crowd-sourcované vlastné kapitoly. Toto sú sekcie videa s vlastnými názvami, ktoré môžu byť pre väčšiu presnosť vyskladané. Ak si kúpite licenciu, uvidíte kapitoly v tomto videu, ako napr.: ",
"description": "After the comma, a list of chapters for this video will appear" "description": "After the comma, a list of chapters for this video will appear"
},
"chapterNewFeature2": {
"message": "Nová funkcia: Vlastné kapitoly z verejných zdrojov. Ide o vlastnoručne pomenované časti vo videách, ktoré sa dajú ukladať na seba a spresňovať. Prístup máte zadarmo, povoľte v možnostiach."
},
"unsubmittedSegmentCounts": {
"message": "V súčasnosti máte {0} na {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"unsubmittedSegmentCountsZero": {
"message": "V súčasnosti nemáte žiadne neodoslané segmenty",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
},
"unsubmittedSegmentsSingular": {
"message": "neodoslaný segment",
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
},
"unsubmittedSegmentsPlural": {
"message": "nezaslané segmenty",
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
},
"videosSingular": {
"message": "video",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "v",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "Vymazať všetky segmenty",
"description": "Label for a button in settings"
},
"clearUnsubmittedSegmentsConfirm": {
"message": "Ste si istí, že chcete vymazať všetky neodoslané segmenty?",
"description": "Confirmation message for the Clear unsubmitted segments button"
},
"showUnsubmittedSegments": {
"message": "Zobraziť segmenty",
"description": "Show/hide button for the unsubmitted segments list"
},
"hideUnsubmittedSegments": {
"message": "Skryť segmenty",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "ID videa",
"description": "Header of the unsubmitted segments list"
},
"segmentFetchFailureWarning": {
"message": "Varovanie: Zo servera sa ešte nenahrali segmenty. V tomto videu už môžu byť vytvorené segmenty, ale vzhľadom na problémy so serverom ešte nemuseli byť nahraté."
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Anslutningsfel. Felkod: " "message": "Anslutningsfel. Felkod: "
}, },
"segmentsStillLoading": {
"message": "Segmenten laddas fortfarande..."
},
"clearTimes": { "clearTimes": {
"message": "Rensa segmenten" "message": "Rensa segmenten"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Dela som webbadress" "message": "Dela som webbadress"
},
"segmentFetchFailureWarning": {
"message": "Varning: Servern har inte skickat ut några segment. Det kan faktiskt finnas segment på den här videon som redan skickats in, men du har inte mottagit dem ännu på grund av problem med servern."
},
"allowScrollingToEdit": {
"message": "Tillåt rullning för att redigera tiden"
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Bağlantı hatası oluştu. Hata kodu: " "message": "Bağlantı hatası oluştu. Hata kodu: "
}, },
"segmentsStillLoading": {
"message": "Bölümler hala yükleniyor..."
},
"clearTimes": { "clearTimes": {
"message": "Kısımları temizle" "message": "Kısımları temizle"
}, },
@@ -1243,5 +1246,11 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "URL olarak paylaş" "message": "URL olarak paylaş"
},
"segmentFetchFailureWarning": {
"message": "Uyarı: Sunucu henüz bölümlerle yanıt vermedi. Aslında bu videoda zaten gönderilmiş bölümler olabilir, ancak sunucudaki sorunlar nedeniyle bunları almadınız."
},
"allowScrollingToEdit": {
"message": "Zamanları Düzenlemek İçin Kaydırmaya İzin Ver"
} }
} }

View File

@@ -35,6 +35,9 @@
"message": "Показувати сегменти як розділи", "message": "Показувати сегменти як розділи",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system" "description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
}, },
"showSegmentNameInChapterBar": {
"message": "Показати поточний сегмент поруч із часом відео"
},
"upvoteButtonInfo": { "upvoteButtonInfo": {
"message": "Проголосувати за цей сегмент" "message": "Проголосувати за цей сегмент"
}, },
@@ -113,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "Помилка з'єднання. Код помилки: " "message": "Помилка з'єднання. Код помилки: "
}, },
"segmentsStillLoading": {
"message": "Сегмент все ще завантажується..."
},
"clearTimes": { "clearTimes": {
"message": "Очистити сегменти" "message": "Очистити сегменти"
}, },
@@ -122,6 +128,9 @@
"closePopup": { "closePopup": {
"message": "Закрити вікно" "message": "Закрити вікно"
}, },
"closeIcon": {
"message": "Закрити іконку"
},
"SubmitTimes": { "SubmitTimes": {
"message": "Надіслати сегменти" "message": "Надіслати сегменти"
}, },
@@ -246,6 +255,12 @@
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "Якщо відео нове і для нього не знайдено сегментів, то інформація про них буде оновлюватися кожні пару хвилин, поки ви дивитеся відео." "message": "Якщо відео нове і для нього не знайдено сегментів, то інформація про них буде оновлюватися кожні пару хвилин, поки ви дивитеся відео."
}, },
"enableShowCategoryWithoutPermission": {
"message": "Показувати категорії в меню подання навіть без дозволу на подання"
},
"whatShowCategoryWithoutPermission": {
"message": "Деякі категорії потребують дозволу на подання через мінімальні вимоги до репутації"
},
"showNotice": { "showNotice": {
"message": "Показувати сповіщення знову" "message": "Показувати сповіщення знову"
}, },
@@ -408,9 +423,18 @@
"statusReminder": { "statusReminder": {
"message": "Дивіться стан сервера на status.sponsor.ajay.app." "message": "Дивіться стан сервера на status.sponsor.ajay.app."
}, },
"changeUserID": {
"message": "Імпорт/експорт вашого приватного UserID"
},
"whatChangeUserID": { "whatChangeUserID": {
"message": "Тримайте його в таємниці. Ставтеся до нього як до паролю і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний ID користувача, натисніть значок буфера обміну у спливаючому вікні." "message": "Тримайте його в таємниці. Ставтеся до нього як до паролю і не передавайте нікому. Якщо хтось їм заволодіє, то зможе видати себе за вас. Якщо ви шукаєте публічний ID користувача, натисніть значок буфера обміну у спливаючому вікні."
}, },
"setUserID": {
"message": "Встан. приватний UserID"
},
"userIDChangeWarning": {
"message": "Попередження: зміна приватного UserID є постійною. Ви впевнені, що хочете це зробити? Про всяк випадок обов’язково зробіть резервну копію свого старого."
},
"createdBy": { "createdBy": {
"message": "Створено" "message": "Створено"
}, },
@@ -454,6 +478,12 @@
"minDurationDescription": { "minDurationDescription": {
"message": "Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі." "message": "Сегменти коротше цього значення не будуть пропускатися і не будуть показані в плеєрі."
}, },
"enableManualSkipOnFullVideo": {
"message": "Використовуйте ручний пропуск, якщо існує повна мітка відео"
},
"whatManualSkipOnFullVideo": {
"message": "Для людей, які хочуть дивитися відео без перерв, якщо воно повністю спонсороване або самореклама."
},
"skipNoticeDuration": { "skipNoticeDuration": {
"message": "Тривалість повідомлення пропуску (в секундах):" "message": "Тривалість повідомлення пропуску (в секундах):"
}, },
@@ -502,6 +532,9 @@
"exportOptionsUpload": { "exportOptionsUpload": {
"message": "Завантажити з файлу" "message": "Завантажити з файлу"
}, },
"whatExportOptions": {
"message": "Вся ваша конфігурація в JSON. Це включає ваш приватний UserID, тому використовуйте з розумом."
},
"setOptions": { "setOptions": {
"message": "Встановити параметри" "message": "Встановити параметри"
}, },
@@ -573,12 +606,24 @@
"category_sponsor_guideline1": { "category_sponsor_guideline1": {
"message": "Платні акції" "message": "Платні акції"
}, },
"category_sponsor_guideline2": {
"message": "Не для пожертвувань чи товарів на замовлення"
},
"category_selfpromo": { "category_selfpromo": {
"message": "Самореклама/рекомендація" "message": "Самореклама/рекомендація"
}, },
"category_selfpromo_description": { "category_selfpromo_description": {
"message": "Схоже на \"Спонсора\", але для безкоштовної реклами і самореклами. Включає себе вставки про мерчендайз, пожертвування або інформацію про тих, разом з ким було зроблено відео." "message": "Схоже на \"Спонсора\", але для безкоштовної реклами і самореклами. Включає себе вставки про мерчендайз, пожертвування або інформацію про тих, разом з ким було зроблено відео."
}, },
"category_selfpromo_guideline1": {
"message": "Пожертвування, членства та мерч"
},
"category_selfpromo_guideline2": {
"message": "Безкоштовні вітання, які не додають до відео"
},
"category_selfpromo_guideline3": {
"message": "Не для корпоративних продуктів і мерча"
},
"category_exclusive_access": { "category_exclusive_access": {
"message": "Ексклюзивний доступ" "message": "Ексклюзивний доступ"
}, },
@@ -589,12 +634,24 @@
"message": "Це відео демонструє продукт, послугу або місцеположення, до яких автори отримали безоплатний або субсидований доступ", "message": "Це відео демонструє продукт, послугу або місцеположення, до яких автори отримали безоплатний або субсидований доступ",
"description": "Short description for this category" "description": "Short description for this category"
}, },
"category_exclusive_access_guideline1": {
"message": "У відео демонструють щось із безкоштовним або субсидованим доступом"
},
"category_interaction": { "category_interaction": {
"message": "Нагадування про взаємодію (підписка)" "message": "Нагадування про взаємодію (підписка)"
}, },
"category_interaction_description": { "category_interaction_description": {
"message": "Коли є коротке нагадування поставити лайк, підписатися на канал або в соцмережах в середині вмісту. Якщо ця вставка тривала або про щось конкретне, вона повинна класифікуватися як самореклама." "message": "Коли є коротке нагадування поставити лайк, підписатися на канал або в соцмережах в середині вмісту. Якщо ця вставка тривала або про щось конкретне, вона повинна класифікуватися як самореклама."
}, },
"category_interaction_guideline1": {
"message": "Короткі нагадування поставити лайк, підписатися"
},
"category_interaction_guideline2": {
"message": "Включає в себе непрямі нагадування про коментарі"
},
"category_interaction_guideline3": {
"message": "Не для загального просування, лише для закликів до дії"
},
"category_interaction_short": { "category_interaction_short": {
"message": "Нагадування про взаємодію" "message": "Нагадування про взаємодію"
}, },
@@ -607,24 +664,54 @@
"category_intro_short": { "category_intro_short": {
"message": "Заставка" "message": "Заставка"
}, },
"category_intro_guideline1": {
"message": "Інтервал без реального змісту"
},
"category_intro_guideline2": {
"message": "Не для переходів з інформацією"
},
"category_outro": { "category_outro": {
"message": "Кінцева заставка/титри" "message": "Кінцева заставка/титри"
}, },
"category_outro_description": { "category_outro_description": {
"message": "Титри або час появи кінцевих заставок YouTube. Не для підведення підсумків сказаного у відео." "message": "Титри або час появи кінцевих заставок YouTube. Не для підведення підсумків сказаного у відео."
}, },
"category_outro_guideline1": {
"message": "Не включайте вміст, навіть якщо на екрані є кінцеві картки"
},
"category_preview": { "category_preview": {
"message": "Попередній перегляд/короткий зміст" "message": "Попередній перегляд/короткий зміст"
}, },
"category_preview_description": { "category_preview_description": {
"message": "Колекція кліпів, які показують, що відбувається в цьому відео або інших відео в серії, де вся інформація повторюється пізніше у відео." "message": "Колекція кліпів, які показують, що відбувається в цьому відео або інших відео в серії, де вся інформація повторюється пізніше у відео."
}, },
"category_preview_guideline1": {
"message": "Кліпи, які з’являться пізніше або в майбутньому відео"
},
"category_preview_guideline2": {
"message": "Повторення попереднього відео"
},
"category_preview_guideline3": {
"message": "Не для розділів, які додають додатковий вміст"
},
"category_filler": { "category_filler": {
"message": "Дотичне наповнення/Жарти" "message": "Дотичне наповнення/Жарти"
}, },
"category_filler_description": {
"message": "Дотичні сцени додані лише для наповнення або гумору, які не потрібні для розуміння основного вмісту відео. Це не повинно включати сегменти, що надають контекст або передісторію\". Це дуже агресивна категорія, призначена для випадків, коли ви не в настрої «розважатися»."
},
"category_filler_short": { "category_filler_short": {
"message": "Наповнення" "message": "Наповнення"
}, },
"category_filler_guideline1": {
"message": "Дотичні сцени лише для наповнення чи гумору"
},
"category_filler_guideline2": {
"message": "Відволікання, ляпи, повтори"
},
"category_filler_guideline3": {
"message": "Не для сцен, які потрібні для розуміння теми"
},
"category_music_offtopic": { "category_music_offtopic": {
"message": "Музика: Сегмент без музики" "message": "Музика: Сегмент без музики"
}, },
@@ -634,6 +721,9 @@
"category_music_offtopic_short": { "category_music_offtopic_short": {
"message": "Без музики" "message": "Без музики"
}, },
"category_music_offtopic_guideline1": {
"message": "Розділів немає в офіційних випусках"
},
"category_music_offtopic_guideline2": { "category_music_offtopic_guideline2": {
"message": "Не музика під час виступу наживо" "message": "Не музика під час виступу наживо"
}, },
@@ -643,6 +733,9 @@
"category_poi_highlight_description": { "category_poi_highlight_description": {
"message": "Частина відео яку шукає більшість людей (Аналогічно коментарю \"Відео починається з Х:ХХ\")." "message": "Частина відео яку шукає більшість людей (Аналогічно коментарю \"Відео починається з Х:ХХ\")."
}, },
"category_poi_highlight_guideline1": {
"message": "Розділ, який шукають більшість людей"
},
"category_poi_highlight_guideline2": { "category_poi_highlight_guideline2": {
"message": "Може пропустити контекст" "message": "Може пропустити контекст"
}, },
@@ -652,6 +745,18 @@
"category_chapter": { "category_chapter": {
"message": "Розділ" "message": "Розділ"
}, },
"category_chapter_description": {
"message": "Розділи з іменами користувача, що описують основні розділи відео."
},
"category_chapter_guideline1": {
"message": "Не згадуйте про торгові марки спонсорів"
},
"category_chapter_guideline2": {
"message": "Використовуйте більші розділи для загальних розділів"
},
"category_chapter_guideline3": {
"message": "Менші розділи можна розмістити всередині великих"
},
"category_livestream_messages": { "category_livestream_messages": {
"message": "Прямі трансляції: пожертвування/читання повідомлення" "message": "Прямі трансляції: пожертвування/читання повідомлення"
}, },
@@ -826,6 +931,9 @@
"categoryPillTitleText": { "categoryPillTitleText": {
"message": "Все відео позначене цією категорією, воно є її уособленням, тож категорію неможливо виокремити." "message": "Все відео позначене цією категорією, воно є її уособленням, тож категорію неможливо виокремити."
}, },
"chapterNameTooltipWarning": {
"message": "Одна з назв ваших розділів схожа на категорію. Ви повинні використовувати категорії, коли це можливо."
},
"experiementOptOut": { "experiementOptOut": {
"message": "Відмова від усіх майбутніх експериментів", "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." "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."
@@ -947,6 +1055,12 @@
"hideSegment": { "hideSegment": {
"message": "Приховати сегмент" "message": "Приховати сегмент"
}, },
"skipSegment": {
"message": "Пропустити сегмент"
},
"playChapter": {
"message": "Відтворити розділ"
},
"SponsorTimeEditScrollNewFeature": { "SponsorTimeEditScrollNewFeature": {
"message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін." "message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін."
}, },
@@ -1013,22 +1127,48 @@
"exportSegments": { "exportSegments": {
"message": "Експортувати сегменти" "message": "Експортувати сегменти"
}, },
"importSegments": {
"message": "Імпорт сегмента"
},
"Import": { "Import": {
"message": "Імпорт", "message": "Імпорт",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data" "description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
}, },
"redeemSuccess": {
"message": "Купон успішно!"
},
"redeemFailed": { "redeemFailed": {
"message": "Ліцензійний ключ недійсний" "message": "Ліцензійний ключ недійсний"
}, },
"hideUpsells": {
"message": "Опції приховування недоступні без додаткової оплати"
},
"chooseACountry": { "chooseACountry": {
"message": "Виберіть країну" "message": "Виберіть країну"
}, },
"noDiscount": {
"message": "Ви не відповідаєте вимогам на знижку"
},
"discountLink": {
"message": "Посилання на знижку (див. рожеву ціну)"
},
"selectYourCountry": { "selectYourCountry": {
"message": "Виберіть вашу країну" "message": "Виберіть вашу країну"
}, },
"alreadyDonated": {
"message": "Якщо ви вже пожертвували будь-яку суму, ви можете отримати безкоштовний доступ, надіславши електронний лист:\nВажливо:Після двокрапки вказується адреса електронної пошти",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "Якщо ви не можете дозволити собі придбати ліцензію, натисніть {тут}, щоб дізнатися, чи маєте ви право на знижку",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": { "patreonSignIn": {
"message": "Вхід через Patreon" "message": "Вхід через Patreon"
}, },
"redeem": {
"message": "Купон"
},
"joinOnPatreon": { "joinOnPatreon": {
"message": "Підписатися на Patreon" "message": "Підписатися на Patreon"
}, },
@@ -1038,6 +1178,20 @@
"enterLicenseKey": { "enterLicenseKey": {
"message": "Введіть ліцензійний ключ" "message": "Введіть ліцензійний ключ"
}, },
"chaptersPage1": {
"message": "SponsorBlock функція краудсорсингу розділів доступна лише для людей, які придбали ліцензію, або для людей, яким надано безкоштовний доступ через їхні попередні внески"
},
"chaptersPage2": {
"message": "Примітка: Дозвіл надсилати глави все ще базується на обчисленій репутації. Придбання ліцензії дозволяє лише переглядати розділи, надіслані іншими",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": {
"message": "Нова функція: краудсорсингові користувацькі розділи. Це розділи у відео зі спеціальними назвами, які можна складати, щоб отримати точніші результати. Придбайте ліцензію, щоб переглядати розділи цього відео, наприклад: ",
"description": "After the comma, a list of chapters for this video will appear"
},
"chapterNewFeature2": {
"message": "Нова функція: краудсорсингові користувацькі розділи. Це розділи у відео зі спеціальними назвами, які можна складати, щоб отримати точніші результати. Ви маєте безкоштовний доступ, увімкніть параметр."
},
"unsubmittedSegmentCounts": { "unsubmittedSegmentCounts": {
"message": "Наразі у вас є {0} на {1}", "message": "Наразі у вас є {0} на {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos" "description": "Example: You currently have 12 unsubmitted segments on 5 videos"
@@ -1092,5 +1246,8 @@
}, },
"exportSegmentsAsURL": { "exportSegmentsAsURL": {
"message": "Поділитися посиланням" "message": "Поділитися посиланням"
},
"segmentFetchFailureWarning": {
"message": "Попередження: сервер ще не завантажив сегменти. Можливо, у цьому відео вже є сегменти, але ви просто не отримали їх через проблеми з сервером."
} }
} }

View File

@@ -116,6 +116,9 @@
"connectionError": { "connectionError": {
"message": "连接错误。错误代码: " "message": "连接错误。错误代码: "
}, },
"segmentsStillLoading": {
"message": "片段仍在加载中..."
},
"clearTimes": { "clearTimes": {
"message": "清除片段" "message": "清除片段"
}, },
@@ -131,6 +134,9 @@
"SubmitTimes": { "SubmitTimes": {
"message": "提交片段" "message": "提交片段"
}, },
"sortSegments": {
"message": "分类段"
},
"submitCheck": { "submitCheck": {
"message": "您确定要提交它吗?" "message": "您确定要提交它吗?"
}, },
@@ -177,6 +183,9 @@
"setUsername": { "setUsername": {
"message": "设定用户名" "message": "设定用户名"
}, },
"copyPublicID": {
"message": "复制公共用户ID"
},
"copySegmentID": { "copySegmentID": {
"message": "复制片段 ID" "message": "复制片段 ID"
}, },
@@ -198,6 +207,9 @@
"hideButtonsDescription": { "hideButtonsDescription": {
"message": "这将隐藏在 YouTube 播放器上提交赞助商广告的按钮。我了解这个东西打扰到了某些人。除了使用那个按钮,这个弹窗也可以用来提交赞助商广告。 要隐藏出现的通知,请使用通知中显示的写着 ”不再显示“ 的按钮。您可以在以后再次启用这些设置。" "message": "这将隐藏在 YouTube 播放器上提交赞助商广告的按钮。我了解这个东西打扰到了某些人。除了使用那个按钮,这个弹窗也可以用来提交赞助商广告。 要隐藏出现的通知,请使用通知中显示的写着 ”不再显示“ 的按钮。您可以在以后再次启用这些设置。"
}, },
"showSkipButton": {
"message": "保持播放器上的跳过高亮按钮"
},
"showInfoButton": { "showInfoButton": {
"message": "在 Youtube 播放器上显示信息按钮" "message": "在 Youtube 播放器上显示信息按钮"
}, },
@@ -219,6 +231,18 @@
"whatViewTracking": { "whatViewTracking": {
"message": "此功能追踪您跳过了哪些片段,以让用户知道他们提交的信息帮助了多少人,并与点赞一同作为依据,来确保垃圾信息不会进入数据库。在您每次跳过片段时,此扩展都会向服务器发送一条消息。希望大部分人不要改变此设置,以使观看数字准确。:)" "message": "此功能追踪您跳过了哪些片段,以让用户知道他们提交的信息帮助了多少人,并与点赞一同作为依据,来确保垃圾信息不会进入数据库。在您每次跳过片段时,此扩展都会向服务器发送一条消息。希望大部分人不要改变此设置,以使观看数字准确。:)"
}, },
"enableViewTrackingInPrivate": {
"message": "在私人/隐身标签中启用跳过计数跟踪"
},
"enableTrackDownvotes": {
"message": "商店部分的下线"
},
"whatTrackDownvotes": {
"message": "任何被你降权的片段,即使在刷新后也会保持隐藏状态"
},
"trackDownvotesWarning": {
"message": "警告。禁用此功能将删除所有先前存储的降级投票"
},
"enableQueryByHashPrefix": { "enableQueryByHashPrefix": {
"message": "按哈希前缀查询" "message": "按哈希前缀查询"
}, },
@@ -231,12 +255,36 @@
"whatRefetchWhenNotFound": { "whatRefetchWhenNotFound": {
"message": "如果视频是新的且没有发现可跳片段,将在您观看时每隔几分钟再次获取信息。" "message": "如果视频是新的且没有发现可跳片段,将在您观看时每隔几分钟再次获取信息。"
}, },
"enableShowCategoryWithoutPermission": {
"message": "在提交菜单中显示类别,即使没有提交权限"
},
"whatShowCategoryWithoutPermission": {
"message": "一些类别由于有最低信誉要求,需要得到许可才能提交"
},
"showNotice": { "showNotice": {
"message": "重新显示通知" "message": "重新显示通知"
}, },
"showSkipNotice": { "showSkipNotice": {
"message": "在跳过片段后显示通知" "message": "在跳过片段后显示通知"
}, },
"showCategoryGuidelines": {
"message": "显示类别帮助"
},
"noticeVisibilityMode0": {
"message": "全尺寸的跳过通知"
},
"noticeVisibilityMode1": {
"message": "自动跳车的小跳车通知"
},
"noticeVisibilityMode2": {
"message": "所有的小跳槽通知"
},
"noticeVisibilityMode3": {
"message": "褪色的自动跳车通知书"
},
"noticeVisibilityMode4": {
"message": "所有褪色的跳过通知"
},
"longDescription": { "longDescription": {
"message": "SponsorBlock 可帮您跳过 YouTube 视频中的赞助商广告、开场、结尾、订阅提醒和其他烦人片段。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 YouTube 视频的赞助商广告和其他片段的开始和结束时间。若有一人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。您也可以跳过音乐视频中的非音乐部分。", "message": "SponsorBlock 可帮您跳过 YouTube 视频中的赞助商广告、开场、结尾、订阅提醒和其他烦人片段。SponsorBlock 是一个众包的浏览器扩展,可以让任何人提交 YouTube 视频的赞助商广告和其他片段的开始和结束时间。若有一人提交了信息,其他所有使用此扩展的人都能直接跳过赞助商广告片段。您也可以跳过音乐视频中的非音乐部分。",
"description": "Full description of the extension on the store pages." "description": "Full description of the extension on the store pages."
@@ -257,6 +305,18 @@
"message": "如果您依然不喜欢它,请按下不再显示按钮。", "message": "如果您依然不喜欢它,请按下不再显示按钮。",
"description": "The second line of the message displayed after the notice was upgraded." "description": "The second line of the message displayed after the notice was upgraded."
}, },
"setSkipShortcut": {
"message": "跳过部分",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "启动/停止部分",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "提交片段",
"description": "Keybind label"
},
"0": { "0": {
"message": "连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。" "message": "连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。"
}, },

View File

@@ -66,6 +66,11 @@ div:hover > #previewbar.sbNotInvidious {
transform: translateY(-1em) !important; transform: translateY(-1em) !important;
} }
/* Pull up for precise seeking */
.ytp-tooltip.sponsorCategoryTooltipVisible .ytp-tooltip-edu {
transform: translateY(-1em) !important;
}
.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips { .ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips {
transform: translateY(-2em) !important; transform: translateY(-2em) !important;
} }
@@ -86,6 +91,11 @@ div:hover > #previewbar.sbNotInvidious {
transform: translateY(2em) !important; transform: translateY(2em) !important;
} }
/* Pull up for precise seeking */
.ytp-tooltip.sponsorCategoryTooltipVisible.sponsorTwoTooltips .ytp-tooltip-edu {
transform: translateY(-2em) !important;
}
.ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible > .ytp-tooltip-text-wrapper { .ytp-big-mode .ytp-tooltip.sponsorCategoryTooltipVisible > .ytp-tooltip-text-wrapper {
transform: translateY(0.5em) !important; transform: translateY(0.5em) !important;
} }

View File

@@ -278,6 +278,18 @@
</div> </div>
</div> </div>
<div data-type="toggle" data-sync="allowScrollingToEdit">
<div class="switch-container">
<label class="switch">
<input id="allowScrollingToEdit" type="checkbox" checked>
<span class="slider round"></span>
</label>
<label class="switch-label" for="allowScrollingToEdit">
__MSG_allowScrollingToEdit__
</label>
</div>
</div>
<div data-type="toggle" data-sync="audioNotificationOnSkip"> <div data-type="toggle" data-sync="audioNotificationOnSkip">
<div class="switch-container"> <div class="switch-container">
<label class="switch"> <label class="switch">

View File

@@ -59,16 +59,16 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
switch(request.message) { switch(request.message) {
case "openConfig": case "openConfig":
chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))}); chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))});
return; return false;
case "openHelp": case "openHelp":
chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')}); chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')});
return; return false;
case "openUpsell": case "openUpsell":
chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')}); chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')});
return; return false;
case "openPage": case "openPage":
chrome.tabs.create({url: chrome.runtime.getURL(request.url)}); chrome.tabs.create({url: chrome.runtime.getURL(request.url)});
return; return false;
case "sendRequest": case "sendRequest":
sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => { sendRequestToCustomServer(request.type, request.url, request.data).then(async (response) => {
callback({ callback({
@@ -112,6 +112,8 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
popupPort[sender.tab.id]?.postMessage(request); popupPort[sender.tab.id]?.postMessage(request);
} }
return false; return false;
default:
return false;
} }
}); });

View File

@@ -140,16 +140,17 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
} }
private openTooltip(): void { private openTooltip(): void {
const tooltipMount = document.querySelector("ytd-video-primary-info-renderer > #container") as HTMLElement; const tooltipMount = document.querySelector("#above-the-fold") as HTMLElement;
if (tooltipMount) { if (tooltipMount) {
this.tooltip = new Tooltip({ this.tooltip = new Tooltip({
text: this.getTitleText(), text: this.getTitleText(),
referenceNode: tooltipMount, referenceNode: tooltipMount,
bottomOffset: "70px", bottomOffset: "0px",
opacity: 0.95, opacity: 0.95,
displayTriangle: false, displayTriangle: false,
showLogo: false, showLogo: false,
showGotIt: false showGotIt: false,
prependElement: tooltipMount.firstElementChild as HTMLElement
}); });
} }
} }

View File

@@ -373,6 +373,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
</span> </span>
); );
} }
return null;
} }
getSubmissionChooser(): JSX.Element[] { getSubmissionChooser(): JSX.Element[] {

View File

@@ -320,6 +320,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
} }
changeTimesWhenScrolling(index: number, e: React.WheelEvent, sponsorTime: SponsorTime): void { changeTimesWhenScrolling(index: number, e: React.WheelEvent, sponsorTime: SponsorTime): void {
if (!Config.config.allowScrollingToEdit) return;
let step = 0; let step = 0;
// shift + ctrl = 1 // shift + ctrl = 1
// ctrl = 0.1 // ctrl = 0.1
@@ -595,7 +596,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
this.props.contentContainer().updateEditButtonsOnPlayer(); this.props.contentContainer().updateEditButtonsOnPlayer();
} }
} }
} else if (this.state.sponsorTimeEdits[1] === null && category === "outro") { } else if (this.state.sponsorTimeEdits[1] === null && category === "outro" && !sponsorTimesSubmitting[this.props.index].segment[1]) {
sponsorTimesSubmitting[this.props.index].segment[1] = this.props.contentContainer().v.duration; sponsorTimesSubmitting[this.props.index].segment[1] = this.props.contentContainer().v.duration;
this.props.contentContainer().updateEditButtonsOnPlayer(); this.props.contentContainer().updateEditButtonsOnPlayer();
} }

View File

@@ -68,6 +68,8 @@ interface SBConfig {
showCategoryWithoutPermission: boolean; showCategoryWithoutPermission: boolean;
showSegmentNameInChapterBar: boolean; showSegmentNameInChapterBar: boolean;
useVirtualTime: boolean; useVirtualTime: boolean;
showSegmentFailedToFetchWarning: boolean;
allowScrollingToEdit: boolean;
// Used to cache calculated text color info // Used to cache calculated text color info
categoryPillColors: { categoryPillColors: {
@@ -202,6 +204,8 @@ const Config: SBObject = {
showCategoryWithoutPermission: false, showCategoryWithoutPermission: false,
showSegmentNameInChapterBar: true, showSegmentNameInChapterBar: true,
useVirtualTime: true, useVirtualTime: true,
showSegmentFailedToFetchWarning: true,
allowScrollingToEdit: true,
categoryPillColors: {}, categoryPillColors: {},

View File

@@ -45,6 +45,8 @@ const utils = new Utils();
// Hack to get the CSS loaded on permission-based sites (Invidious) // Hack to get the CSS loaded on permission-based sites (Invidious)
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS); utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
const skipBuffer = 0.003;
//was sponsor data found when doing SponsorsLookup //was sponsor data found when doing SponsorsLookup
let sponsorDataFound = false; let sponsorDataFound = false;
//the actual sponsorTimes if loaded and UUIDs associated with them //the actual sponsorTimes if loaded and UUIDs associated with them
@@ -56,6 +58,7 @@ let sponsorVideoID: VideoID = null;
const skipNotices: SkipNotice[] = []; const skipNotices: SkipNotice[] = [];
let activeSkipKeybindElement: ToggleSkippable = null; let activeSkipKeybindElement: ToggleSkippable = null;
let retryFetchTimeout: NodeJS.Timeout = null; let retryFetchTimeout: NodeJS.Timeout = null;
let shownSegmentFailedToFetchWarning = false;
// JSON video info // JSON video info
let videoInfo: VideoInfo = null; let videoInfo: VideoInfo = null;
@@ -68,12 +71,14 @@ let channelIDInfo: ChannelIDInfo;
// Locked Categories in this tab, like: ["sponsor","intro","outro"] // Locked Categories in this tab, like: ["sponsor","intro","outro"]
let lockedCategories: Category[] = []; let lockedCategories: Category[] = [];
// Used to calculate a more precise "virtual" video time // Used to calculate a more precise "virtual" video time
let lastKnownVideoTime: { videoTime: number; preciseTime: number } = { const lastKnownVideoTime: { videoTime: number; preciseTime: number; fromPause: boolean; approximateDelay: number } = {
videoTime: null, videoTime: null,
preciseTime: null preciseTime: null,
fromPause: false,
approximateDelay: null,
}; };
// It resumes with a slightly later time on chromium // It resumes with a slightly later time on chromium
let lastTimeFromWaitingEvent = null; let lastTimeFromWaitingEvent: number = null;
const lastNextChapterKeybind = { const lastNextChapterKeybind = {
time: 0, time: 0,
date: 0 date: 0
@@ -84,6 +89,7 @@ const lastNextChapterKeybind = {
// Skips are canceled every seeking event // Skips are canceled every seeking event
let currentSkipSchedule: NodeJS.Timeout = null; let currentSkipSchedule: NodeJS.Timeout = null;
let currentSkipInterval: NodeJS.Timeout = null; let currentSkipInterval: NodeJS.Timeout = null;
let currentVirtualTimeInterval: NodeJS.Timeout = null;
/** Has the sponsor been skipped */ /** Has the sponsor been skipped */
let sponsorSkipped: boolean[] = []; let sponsorSkipped: boolean[] = [];
@@ -114,6 +120,7 @@ let lastCheckVideoTime = -1;
//is this channel whitelised from getting sponsors skipped //is this channel whitelised from getting sponsors skipped
let channelWhitelisted = false; let channelWhitelisted = false;
let waitingForChannelID = false;
let previewBar: PreviewBar = null; let previewBar: PreviewBar = null;
// Skip to highlight button // Skip to highlight button
@@ -151,6 +158,7 @@ let isAdPlaying = false;
let lastResponseStatus: number; let lastResponseStatus: number;
let retryCount = 0; let retryCount = 0;
let lookupWaiting = false;
// Contains all of the functions and variables needed by the skip notice // Contains all of the functions and variables needed by the skip notice
const skipNoticeContentContainer: ContentContainer = () => ({ const skipNoticeContentContainer: ContentContainer = () => ({
@@ -258,6 +266,11 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
utils.getSponsorTimeFromUUID(sponsorTimes, request.UUID).hidden = request.type; utils.getSponsorTimeFromUUID(sponsorTimes, request.UUID).hidden = request.type;
utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type); utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type);
updatePreviewBar(); updatePreviewBar();
if (skipButtonControlBar?.isEnabled()
&& sponsorTimesSubmitting.every((s) => s.hidden !== SponsorHideType.Visible || s.actionType !== ActionType.Poi)) {
skipButtonControlBar.disable();
}
break; break;
case "closePopup": case "closePopup":
closeInfoMenu(); closeInfoMenu();
@@ -271,8 +284,13 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
for (const segment of importedSegments) { for (const segment of importedSegments) {
if (!sponsorTimesSubmitting.some( if (!sponsorTimesSubmitting.some(
(s) => Math.abs(s.segment[0] - segment.segment[0]) < 1 (s) => Math.abs(s.segment[0] - segment.segment[0]) < 1
&& Math.abs(s.segment[1] - segment.segment[1]) < 1) && Math.abs(s.segment[1] - segment.segment[1]) < 1)) {
&& (segment.category !== "chapter" || utils.getCategorySelection("chapter"))) { if (segment.category === "chapter" && !utils.getCategorySelection("chapter")) {
segment.category = "chooseACategory" as Category;
segment.actionType = ActionType.Skip;
segment.description = "";
}
sponsorTimesSubmitting.push(segment); sponsorTimesSubmitting.push(segment);
addedSegments = true; addedSegments = true;
} }
@@ -284,6 +302,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
updateEditButtonsOnPlayer(); updateEditButtonsOnPlayer();
updateSponsorTimesSubmitting(false); updateSponsorTimesSubmitting(false);
submitSponsorTimes();
} }
sendResponse({ sendResponse({
@@ -338,6 +357,8 @@ function resetValues() {
sponsorTimes = []; sponsorTimes = [];
existingChaptersImported = false; existingChaptersImported = false;
sponsorSkipped = []; sponsorSkipped = [];
lastResponseStatus = 0;
shownSegmentFailedToFetchWarning = false;
sponsorVideoID = null; sponsorVideoID = null;
videoInfo = null; videoInfo = null;
@@ -369,12 +390,12 @@ function resetValues() {
// Reset advert playing flag // Reset advert playing flag
isAdPlaying = false; isAdPlaying = false;
skipButtonControlBar?.disable();
categoryPill?.setVisibility(false);
for (let i = 0; i < skipNotices.length; i++) { for (let i = 0; i < skipNotices.length; i++) {
skipNotices.pop()?.close(); skipNotices.pop()?.close();
} }
skipButtonControlBar?.disable();
categoryPill?.setVisibility(false);
} }
async function videoIDChange(id: string): Promise<void> { async function videoIDChange(id: string): Promise<void> {
@@ -499,6 +520,11 @@ function createPreviewBar(): void {
// For Invidious/VideoJS // For Invidious/VideoJS
selector: ".vjs-progress-holder", selector: ".vjs-progress-holder",
isVisibleCheck: false isVisibleCheck: false
}, {
// For Youtube Music
// there are two sliders, one for volume and one for progress - both called #progressContainer
selector: "#progress-bar>#sliderContainer>div>#sliderBar>#progressContainer",
isVisibleCheck: false
} }
]; ];
@@ -578,6 +604,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
if (currentTime === undefined || currentTime === null) { if (currentTime === undefined || currentTime === null) {
currentTime = getVirtualTime(); currentTime = getVirtualTime();
} }
clearWaitingTime();
lastTimeFromWaitingEvent = null; lastTimeFromWaitingEvent = null;
updateActiveSegment(currentTime); updateActiveSegment(currentTime);
@@ -589,7 +616,6 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
const skipTime: number[] = [currentSkip?.scheduledTime, skipInfo.array[skipInfo.endIndex]?.segment[1]]; const skipTime: number[] = [currentSkip?.scheduledTime, skipInfo.array[skipInfo.endIndex]?.segment[1]];
const timeUntilSponsor = skipTime?.[0] - currentTime; const timeUntilSponsor = skipTime?.[0] - currentTime;
const videoID = sponsorVideoID; const videoID = sponsorVideoID;
const skipBuffer = 0.003;
if (videoMuted && !inMuteSegment(currentTime, skipInfo.index !== -1 if (videoMuted && !inMuteSegment(currentTime, skipInfo.index !== -1
&& timeUntilSponsor < skipBuffer && shouldAutoSkip(currentSkip))) { && timeUntilSponsor < skipBuffer && shouldAutoSkip(currentSkip))) {
@@ -683,11 +709,23 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
// Use interval instead of timeout near the end to combat imprecise video time // Use interval instead of timeout near the end to combat imprecise video time
const startIntervalTime = performance.now(); const startIntervalTime = performance.now();
const startVideoTime = Math.max(currentTime, video.currentTime); const startVideoTime = Math.max(currentTime, video.currentTime);
let startWaitingForReportedTimeToChange = true;
const reportedVideoTimeAtStart = video.currentTime;
logDebug(`Starting setInterval skipping ${video.currentTime} to skip at ${skipTime[0]}`); logDebug(`Starting setInterval skipping ${video.currentTime} to skip at ${skipTime[0]}`);
currentSkipInterval = setInterval(() => { currentSkipInterval = setInterval(() => {
// Estimate delay, but only take the current time right after a change
// Current time remains the same for many "frames" on Firefox
if (utils.isFirefox() && !lastKnownVideoTime.fromPause && startWaitingForReportedTimeToChange
&& reportedVideoTimeAtStart !== video.currentTime) {
startWaitingForReportedTimeToChange = false;
const delay = getVirtualTime() - video.currentTime;
if (delay > 0) lastKnownVideoTime.approximateDelay = delay;
}
const intervalDuration = performance.now() - startIntervalTime; const intervalDuration = performance.now() - startIntervalTime;
if (intervalDuration >= delayTime || video.currentTime >= skipTime[0]) { if (intervalDuration + skipBuffer * 1000 >= delayTime || video.currentTime >= skipTime[0]) {
clearInterval(currentSkipInterval); clearInterval(currentSkipInterval);
if (!utils.isFirefox() && !video.muted) { if (!utils.isFirefox() && !video.muted) {
// Workaround for more accurate skipping on Chromium // Workaround for more accurate skipping on Chromium
@@ -695,7 +733,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
video.muted = false; video.muted = false;
} }
skippingFunction(Math.max(video.currentTime, startVideoTime + video.playbackRate * intervalDuration / 1000)); skippingFunction(Math.max(video.currentTime, startVideoTime + video.playbackRate * Math.max(delayTime, intervalDuration) / 1000));
} }
}, 1); }, 1);
} else { } else {
@@ -708,11 +746,11 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
} }
function getVirtualTime(): number { function getVirtualTime(): number {
const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime ? const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime !== null ?
(performance.now() - lastKnownVideoTime.preciseTime) * video.playbackRate / 1000 + lastKnownVideoTime.videoTime : null); (performance.now() - lastKnownVideoTime.preciseTime) * video.playbackRate / 1000 + lastKnownVideoTime.videoTime : null);
if (Config.config.useVirtualTime && !isSafari() && virtualTime if (Config.config.useVirtualTime && !isSafari() && virtualTime
&& Math.abs(virtualTime - video.currentTime) < 0.6 && video.currentTime !== 0) { && Math.abs(virtualTime - video.currentTime) < 0.2 && video.currentTime !== 0) {
return virtualTime; return virtualTime;
} else { } else {
return video.currentTime; return video.currentTime;
@@ -857,13 +895,15 @@ function setupVideoListeners() {
} }
}); });
video.addEventListener('seeking', () => { video.addEventListener('seeking', () => {
lastKnownVideoTime.fromPause = false;
if (!video.paused){ if (!video.paused){
// Reset lastCheckVideoTime // Reset lastCheckVideoTime
lastCheckTime = Date.now(); lastCheckTime = Date.now();
lastCheckVideoTime = video.currentTime; lastCheckVideoTime = video.currentTime;
updateVirtualTime(); updateVirtualTime();
lastTimeFromWaitingEvent = null; clearWaitingTime();
startSponsorSchedule(); startSponsorSchedule();
} else { } else {
@@ -876,36 +916,38 @@ function setupVideoListeners() {
}); });
video.addEventListener('ratechange', () => { video.addEventListener('ratechange', () => {
updateVirtualTime(); updateVirtualTime();
lastTimeFromWaitingEvent = null; clearWaitingTime();
startSponsorSchedule(); startSponsorSchedule();
}); });
// Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740) // Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740)
video.addEventListener('videoSpeed_ratechange', () => { video.addEventListener('videoSpeed_ratechange', () => {
updateVirtualTime(); updateVirtualTime();
lastTimeFromWaitingEvent = null; clearWaitingTime();
startSponsorSchedule(); startSponsorSchedule();
}); });
const paused = () => { const stoppedPlayback = () => {
// Reset lastCheckVideoTime // Reset lastCheckVideoTime
lastCheckVideoTime = -1; lastCheckVideoTime = -1;
lastCheckTime = 0; lastCheckTime = 0;
lastKnownVideoTime = { lastKnownVideoTime.videoTime = null;
videoTime: null, lastKnownVideoTime.preciseTime = null;
preciseTime: null updateWaitingTime();
}
lastTimeFromWaitingEvent = video.currentTime;
cancelSponsorSchedule(); cancelSponsorSchedule();
}; };
video.addEventListener('pause', () => paused()); video.addEventListener('pause', () => {
lastKnownVideoTime.fromPause = true;
stoppedPlayback();
});
video.addEventListener('waiting', () => { video.addEventListener('waiting', () => {
logDebug("[SB] Not skipping due to buffering"); logDebug("[SB] Not skipping due to buffering");
startedWaiting = true; startedWaiting = true;
paused(); stoppedPlayback();
}); });
startSponsorSchedule(); startSponsorSchedule();
@@ -913,10 +955,43 @@ function setupVideoListeners() {
} }
function updateVirtualTime() { function updateVirtualTime() {
lastKnownVideoTime = { if (currentVirtualTimeInterval) clearInterval(currentVirtualTimeInterval);
videoTime: video.currentTime,
preciseTime: performance.now() lastKnownVideoTime.videoTime = video.currentTime;
}; lastKnownVideoTime.preciseTime = performance.now();
// If on Firefox, wait for the second time change (time remains fixed for many "frames" for privacy reasons)
if (utils.isFirefox()) {
let count = 0;
let lastTime = lastKnownVideoTime.videoTime;
if (lastKnownVideoTime.fromPause) {
currentVirtualTimeInterval = setInterval(() => {
if (lastTime !== video.currentTime) {
count++;
lastTime = video.currentTime;
}
if (count > 1) {
const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ?
lastKnownVideoTime.approximateDelay : 0;
lastKnownVideoTime.videoTime = video.currentTime + delay;
lastKnownVideoTime.preciseTime = performance.now();
clearInterval(currentVirtualTimeInterval);
currentVirtualTimeInterval = null;
}
}, 1);
}
}
}
function updateWaitingTime(): void {
lastTimeFromWaitingEvent = video.currentTime;
}
function clearWaitingTime(): void {
lastTimeFromWaitingEvent = null;
} }
function setupSkipButtonControlBar() { function setupSkipButtonControlBar() {
@@ -945,10 +1020,15 @@ function setupCategoryPill() {
} }
async function sponsorsLookup(keepOldSubmissions = true) { async function sponsorsLookup(keepOldSubmissions = true) {
if (lookupWaiting) return;
if (!video || !isVisible(video)) refreshVideoAttachments(); if (!video || !isVisible(video)) refreshVideoAttachments();
//there is still no video here //there is still no video here
if (!video) { if (!video) {
setTimeout(() => sponsorsLookup(), 100); lookupWaiting = true;
setTimeout(() => {
lookupWaiting = false;
sponsorsLookup()
}, 100);
return; return;
} }
@@ -1178,7 +1258,7 @@ function retryFetch(errorCode: number): void {
retryFetchTimeout = setTimeout(() => { retryFetchTimeout = setTimeout(() => {
if (sponsorVideoID && sponsorTimes?.length === 0 if (sponsorVideoID && sponsorTimes?.length === 0
|| sponsorTimes.every((segment) => segment.source !== SponsorSourceType.Server)) { || sponsorTimes.every((segment) => segment.source !== SponsorSourceType.Server)) {
sponsorsLookup(); // sponsorsLookup();
} }
}, delay); }, delay);
} }
@@ -1215,7 +1295,8 @@ function startSkipScheduleCheckingForStartSponsors() {
// For highlight category // For highlight category
const poiSegments = sponsorTimes const poiSegments = sponsorTimes
.filter((time) => time.segment[1] > video.currentTime && time.actionType === ActionType.Poi) .filter((time) => time.segment[1] > video.currentTime
&& time.actionType === ActionType.Poi && time.hidden === SponsorHideType.Visible)
.sort((a, b) => b.segment[0] - a.segment[0]); .sort((a, b) => b.segment[0] - a.segment[0]);
for (const time of poiSegments) { for (const time of poiSegments) {
const skipOption = utils.getCategorySelection(time.category)?.option; const skipOption = utils.getCategorySelection(time.category)?.option;
@@ -1375,7 +1456,7 @@ function updatePreviewBar(): void {
if (Config.config.showTimeWithSkips) { if (Config.config.showTimeWithSkips) {
const skippedDuration = utils.getTimestampsDuration(previewBarSegments const skippedDuration = utils.getTimestampsDuration(previewBarSegments
.filter(({actionType}) => actionType !== ActionType.Chapter) .filter(({actionType}) => ![ActionType.Mute, ActionType.Chapter].includes(actionType))
.map(({segment}) => segment)); .map(({segment}) => segment));
showTimeWithoutSkips(skippedDuration); showTimeWithoutSkips(skippedDuration);
@@ -1390,6 +1471,7 @@ async function whitelistCheck() {
const whitelistedChannels = Config.config.whitelistedChannels; const whitelistedChannels = Config.config.whitelistedChannels;
try { try {
waitingForChannelID = true;
await utils.wait(() => channelIDInfo.status === ChannelIDStatus.Found, 6000, 20); await utils.wait(() => channelIDInfo.status === ChannelIDStatus.Found, 6000, 20);
// If found, continue on, it was set by the listener // If found, continue on, it was set by the listener
@@ -1414,6 +1496,8 @@ async function whitelistCheck() {
} }
} }
waitingForChannelID = false;
//see if this is a whitelisted channel //see if this is a whitelisted channel
if (whitelistedChannels != undefined && if (whitelistedChannels != undefined &&
channelIDInfo.status === ChannelIDStatus.Found && whitelistedChannels.includes(channelIDInfo.id)) { channelIDInfo.status === ChannelIDStatus.Found && whitelistedChannels.includes(channelIDInfo.id)) {
@@ -1512,7 +1596,7 @@ function getLatestEndTimeIndex(sponsorTimes: SponsorTime[], index: number, hideH
const currentSegment = sponsorTimes[i].segment; const currentSegment = sponsorTimes[i].segment;
const latestEndTime = sponsorTimes[latestEndTimeIndex].segment[1]; const latestEndTime = sponsorTimes[latestEndTimeIndex].segment[1];
if (currentSegment[0] <= latestEndTime && currentSegment[1] > latestEndTime if (currentSegment[0] - skipBuffer <= latestEndTime && currentSegment[1] > latestEndTime
&& (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible) && (!hideHiddenSponsors || sponsorTimes[i].hidden === SponsorHideType.Visible)
&& shouldAutoSkip(sponsorTimes[i]) && shouldAutoSkip(sponsorTimes[i])
&& sponsorTimes[i].actionType === ActionType.Skip) { && sponsorTimes[i].actionType === ActionType.Skip) {
@@ -1546,6 +1630,13 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments:
const includedTimes: ScheduledTime[] = []; const includedTimes: ScheduledTime[] = [];
const scheduledTimes: number[] = []; const scheduledTimes: number[] = [];
const shouldIncludeTime = (segment: ScheduledTime ) => (minimum === undefined
|| ((includeNonIntersectingSegments && segment.scheduledTime >= minimum)
|| (includeIntersectingSegments && segment.scheduledTime < minimum && segment.segment[1] > minimum)))
&& (!hideHiddenSponsors || segment.hidden === SponsorHideType.Visible)
&& segment.segment.length === 2
&& segment.actionType !== ActionType.Poi;
const possibleTimes = sponsorTimes.map((sponsorTime) => ({ const possibleTimes = sponsorTimes.map((sponsorTime) => ({
...sponsorTime, ...sponsorTime,
scheduledTime: sponsorTime.segment[0] scheduledTime: sponsorTime.segment[0]
@@ -1553,7 +1644,8 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments:
// Schedule at the end time to know when to unmute and remove title from seek bar // Schedule at the end time to know when to unmute and remove title from seek bar
sponsorTimes.forEach(sponsorTime => { sponsorTimes.forEach(sponsorTime => {
if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime)) { if (!possibleTimes.some((time) => sponsorTime.segment[1] === time.scheduledTime && shouldIncludeTime(time))
&& (minimum === undefined || sponsorTime.segment[1] > minimum)) {
possibleTimes.push({ possibleTimes.push({
...sponsorTime, ...sponsorTime,
scheduledTime: sponsorTime.segment[1] scheduledTime: sponsorTime.segment[1]
@@ -1562,13 +1654,7 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments:
}); });
for (let i = 0; i < possibleTimes.length; i++) { for (let i = 0; i < possibleTimes.length; i++) {
if ((minimum === undefined if (shouldIncludeTime(possibleTimes[i])) {
|| ((includeNonIntersectingSegments && possibleTimes[i].scheduledTime >= minimum)
|| (includeIntersectingSegments && possibleTimes[i].scheduledTime < minimum && possibleTimes[i].segment[1] > minimum)))
&& (!hideHiddenSponsors || possibleTimes[i].hidden === SponsorHideType.Visible)
&& possibleTimes[i].segment.length === 2
&& possibleTimes[i].actionType !== ActionType.Poi) {
scheduledTimes.push(possibleTimes[i].scheduledTime); scheduledTimes.push(possibleTimes[i].scheduledTime);
includedTimes.push(possibleTimes[i]); includedTimes.push(possibleTimes[i]);
} }
@@ -1916,6 +2002,13 @@ function startOrEndTimingNewSegment() {
updateSponsorTimesSubmitting(false); updateSponsorTimesSubmitting(false);
importExistingChapters(false); importExistingChapters(false);
if (lastResponseStatus !== 200 && lastResponseStatus !== 404
&& !shownSegmentFailedToFetchWarning && Config.config.showSegmentFailedToFetchWarning) {
alert(chrome.i18n.getMessage("segmentFetchFailureWarning"));
shownSegmentFailedToFetchWarning = true;
}
} }
function getIncompleteSegment(): SponsorTime { function getIncompleteSegment(): SponsorTime {
@@ -2083,11 +2176,11 @@ async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNo
return response; return response;
} }
async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise<VoteResponse> { async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise<VoteResponse | undefined> {
const sponsorIndex = utils.getSponsorIndexFromUUID(sponsorTimes, UUID); const sponsorIndex = utils.getSponsorIndexFromUUID(sponsorTimes, UUID);
// Don't vote for preview sponsors // Don't vote for preview sponsors
if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) return; if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source !== SponsorSourceType.Server) return Promise.resolve(undefined);
// See if the local time saved count and skip count should be saved // See if the local time saved count and skip count should be saved
if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) { if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) {
@@ -2173,8 +2266,10 @@ function submitSponsorTimes() {
//send the message to the background js //send the message to the background js
//called after all the checks have been made that it's okay to do so //called after all the checks have been made that it's okay to do so
async function sendSubmitMessage() { async function sendSubmitMessage() {
// check if all segments are full video
const onlyFullVideo = sponsorTimesSubmitting.every((segment) => segment.actionType === ActionType.Full);
// Block if submitting on a running livestream or premiere // Block if submitting on a running livestream or premiere
if (isLivePremiere || isVisible(document.querySelector(".ytp-live-badge"))) { if (!onlyFullVideo && (isLivePremiere || isVisible(document.querySelector(".ytp-live-badge")))) {
alert(chrome.i18n.getMessage("liveOrPremiere")); alert(chrome.i18n.getMessage("liveOrPremiere"));
return; return;
} }
@@ -2301,6 +2396,10 @@ function windowListenerHandler(event: MessageEvent): void {
id: data.channelID, id: data.channelID,
status: ChannelIDStatus.Found status: ChannelIDStatus.Found
}; };
if (!waitingForChannelID) {
whitelistCheck();
}
} }
videoIDChange(data.videoID); videoIDChange(data.videoID);

View File

@@ -33,6 +33,7 @@ type WindowMessage = StartMessage | FinishMessage | AdMessage | VideoData;
// global playerClient - too difficult to type // global playerClient - too difficult to type
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
let playerClient: any; let playerClient: any;
let lastVideo = "";
const sendMessage = (message: WindowMessage): void => { const sendMessage = (message: WindowMessage): void => {
window.postMessage({ source: "sponsorblock", ...message }, "/"); window.postMessage({ source: "sponsorblock", ...message }, "/");
@@ -87,7 +88,8 @@ function navigateFinishSend(event: CustomEvent): void {
function sendVideoData(): void { function sendVideoData(): void {
if (!playerClient) return; if (!playerClient) return;
const videoData = playerClient.getVideoData(); const videoData = playerClient.getVideoData();
if (videoData) { if (videoData && videoData.video_id !== lastVideo) {
lastVideo = videoData.video_id;
sendMessage({ type: "data", videoID: videoData.video_id, isLive: videoData.isLive, isPremiere: videoData.isPremiere } as VideoData); sendMessage({ type: "data", videoID: videoData.video_id, isLive: videoData.isLive, isPremiere: videoData.isPremiere } as VideoData);
} }
} }

View File

@@ -10,6 +10,7 @@ import { ChapterVote } from "../render/ChapterVote";
import { ActionType, Category, SegmentContainer, SponsorHideType, SponsorSourceType, SponsorTime } from "../types"; import { ActionType, Category, SegmentContainer, SponsorHideType, SponsorSourceType, SponsorTime } from "../types";
import { partition } from "../utils/arrayUtils"; import { partition } from "../utils/arrayUtils";
import { DEFAULT_CATEGORY, shortCategoryName } from "../utils/categoryUtils"; import { DEFAULT_CATEGORY, shortCategoryName } from "../utils/categoryUtils";
import { normalizeChapterName } from "../utils/exporter";
import { GenericUtils } from "../utils/genericUtils"; import { GenericUtils } from "../utils/genericUtils";
import { findValidElement } from "../utils/pageUtils"; import { findValidElement } from "../utils/pageUtils";
@@ -37,6 +38,10 @@ class PreviewBar {
categoryTooltip?: HTMLDivElement; categoryTooltip?: HTMLDivElement;
categoryTooltipContainer?: HTMLElement; categoryTooltipContainer?: HTMLElement;
chapterTooltip?: HTMLDivElement; chapterTooltip?: HTMLDivElement;
lastSmallestSegment: Record<string, {
index: number;
segment: PreviewBarSegment;
}> = {};
parent: HTMLElement; parent: HTMLElement;
onMobileYouTube: boolean; onMobileYouTube: boolean;
@@ -57,6 +62,7 @@ class PreviewBar {
originalChapterBar: HTMLElement; originalChapterBar: HTMLElement;
originalChapterBarBlocks: NodeListOf<HTMLElement>; originalChapterBarBlocks: NodeListOf<HTMLElement>;
chapterMargin: number; chapterMargin: number;
lastRenderedSegments: PreviewBarSegment[];
unfilteredChapterGroups: ChapterGroup[]; unfilteredChapterGroups: ChapterGroup[];
chapterGroups: ChapterGroup[]; chapterGroups: ChapterGroup[];
@@ -92,6 +98,7 @@ class PreviewBar {
this.chapterTooltip.className = "ytp-tooltip-title sponsorCategoryTooltip"; this.chapterTooltip.className = "ytp-tooltip-title sponsorCategoryTooltip";
const tooltipTextWrapper = document.querySelector(".ytp-tooltip-text-wrapper"); const tooltipTextWrapper = document.querySelector(".ytp-tooltip-text-wrapper");
const originalTooltip = tooltipTextWrapper.querySelector(".ytp-tooltip-title:not(.sponsorCategoryTooltip)") as HTMLElement;
if (!tooltipTextWrapper || !tooltipTextWrapper.parentElement) return; if (!tooltipTextWrapper || !tooltipTextWrapper.parentElement) return;
// Grab the tooltip from the text wrapper as the tooltip doesn't have its classes on init // Grab the tooltip from the text wrapper as the tooltip doesn't have its classes on init
@@ -118,8 +125,8 @@ class PreviewBar {
const observer = new MutationObserver((mutations) => { const observer = new MutationObserver((mutations) => {
if (!mouseOnSeekBar || !this.categoryTooltip || !this.categoryTooltipContainer) return; if (!mouseOnSeekBar || !this.categoryTooltip || !this.categoryTooltipContainer) return;
// If the mutation observed is only for our tooltip text, ignore // Only care about mutations to time tooltip
if (mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("sponsorCategoryTooltip"))) { if (!mutations.some((mutation) => (mutation.target as HTMLElement).classList.contains("ytp-tooltip-text"))) {
return; return;
} }
@@ -138,14 +145,18 @@ class PreviewBar {
if (timeInSeconds !== null) break; if (timeInSeconds !== null) break;
} }
if (timeInSeconds === null) return; if (timeInSeconds === null) {
originalTooltip.style.removeProperty("display");
return;
}
// Find the segment at that location, using the shortest if multiple found // Find the segment at that location, using the shortest if multiple found
const [normalSegments, chapterSegments] = const [normalSegments, chapterSegments] =
partition(this.segments.filter((s) => s.source !== SponsorSourceType.YouTube), partition(this.segments.filter((s) => s.source !== SponsorSourceType.YouTube),
(segment) => segment.actionType !== ActionType.Chapter); (segment) => segment.actionType !== ActionType.Chapter);
let mainSegment = this.getSmallestSegment(timeInSeconds, normalSegments); let mainSegment = this.getSmallestSegment(timeInSeconds, normalSegments, "normal");
let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments); let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments, "chapter");
if (mainSegment === null && secondarySegment !== null) { if (mainSegment === null && secondarySegment !== null) {
mainSegment = secondarySegment; mainSegment = secondarySegment;
secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments.filter((s) => s !== secondarySegment)); secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments.filter((s) => s !== secondarySegment));
@@ -153,6 +164,7 @@ class PreviewBar {
if (mainSegment === null && secondarySegment === null) { if (mainSegment === null && secondarySegment === null) {
this.categoryTooltipContainer.classList.remove(TOOLTIP_VISIBLE_CLASS); this.categoryTooltipContainer.classList.remove(TOOLTIP_VISIBLE_CLASS);
originalTooltip.style.removeProperty("display");
} else { } else {
this.categoryTooltipContainer.classList.add(TOOLTIP_VISIBLE_CLASS); this.categoryTooltipContainer.classList.add(TOOLTIP_VISIBLE_CLASS);
if (mainSegment !== null && secondarySegment !== null) { if (mainSegment !== null && secondarySegment !== null) {
@@ -164,6 +176,14 @@ class PreviewBar {
this.setTooltipTitle(mainSegment, this.categoryTooltip); this.setTooltipTitle(mainSegment, this.categoryTooltip);
this.setTooltipTitle(secondarySegment, this.chapterTooltip); this.setTooltipTitle(secondarySegment, this.chapterTooltip);
if (normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.categoryTooltip.textContent)
|| normalizeChapterName(originalTooltip.textContent) === normalizeChapterName(this.chapterTooltip.textContent)) {
if (originalTooltip.style.display !== "none") originalTooltip.style.display = "none";
noYoutubeChapters = true;
} else if (originalTooltip.style.display === "none") {
originalTooltip.style.removeProperty("display");
}
// Used to prevent overlapping // Used to prevent overlapping
this.categoryTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters); this.categoryTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters);
this.chapterTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters); this.chapterTooltip.classList.toggle("ytp-tooltip-text-no-title", noYoutubeChapters);
@@ -171,6 +191,8 @@ class PreviewBar {
// To prevent offset issue // To prevent offset issue
this.categoryTooltip.style.right = titleTooltip.style.right; this.categoryTooltip.style.right = titleTooltip.style.right;
this.chapterTooltip.style.right = titleTooltip.style.right; this.chapterTooltip.style.right = titleTooltip.style.right;
this.categoryTooltip.style.textAlign = titleTooltip.style.textAlign;
this.chapterTooltip.style.textAlign = titleTooltip.style.textAlign;
} }
}); });
@@ -335,8 +357,13 @@ class PreviewBar {
return; return;
} }
// Merge overlapping chapters const remakingBar = segments !== this.lastRenderedSegments;
this.unfilteredChapterGroups = this.createChapterRenderGroups(segments); if (remakingBar) {
this.lastRenderedSegments = segments;
// Merge overlapping chapters
this.unfilteredChapterGroups = this.createChapterRenderGroups(segments);
}
if (segments.every((segments) => segments.source === SponsorSourceType.YouTube) if (segments.every((segments) => segments.source === SponsorSourceType.YouTube)
|| (!Config.config.renderSegmentsAsChapters || (!Config.config.renderSegmentsAsChapters
@@ -423,7 +450,9 @@ class PreviewBar {
} }
} }
this.updateChapterAllMutation(this.originalChapterBar, this.progressBar, true); if (remakingBar) {
this.updateChapterAllMutation(this.originalChapterBar, this.progressBar, true);
}
} }
createChapterRenderGroups(segments: PreviewBarSegment[]): ChapterGroup[] { createChapterRenderGroups(segments: PreviewBarSegment[]): ChapterGroup[] {
@@ -581,6 +610,7 @@ class PreviewBar {
for (const mutation of mutations) { for (const mutation of mutations) {
if (mutation.type === "childList") { if (mutation.type === "childList") {
this.update(); this.update();
break;
} }
} }
@@ -728,8 +758,8 @@ class PreviewBar {
private getPartialChapterSectionStyle(element: HTMLElement, param: string): number { private getPartialChapterSectionStyle(element: HTMLElement, param: string): number {
const data = element.style[param]; const data = element.style[param];
if (data?.includes("100%")) { if (data?.includes("%")) {
return 0; return this.customChaptersBar.clientWidth * (parseFloat(data.replace("%", "")) / 100);
} else { } else {
return parseInt(element.style[param].match(/\d+/g)?.[0]) || 0; return parseInt(element.style[param].match(/\d+/g)?.[0]) || 0;
} }
@@ -740,11 +770,11 @@ class PreviewBar {
|| ((!segments || segments.length <= 0) && submittingSegments?.length <= 0)) { || ((!segments || segments.length <= 0) && submittingSegments?.length <= 0)) {
const chaptersContainer = this.getChaptersContainer(); const chaptersContainer = this.getChaptersContainer();
const chapterButton = this.getChapterButton(chaptersContainer); const chapterButton = this.getChapterButton(chaptersContainer);
if (chapterButton.classList.contains("ytp-chapter-container-disabled")) { if (chapterButton && chapterButton.classList.contains("ytp-chapter-container-disabled")) {
chaptersContainer.style.display = "none"; chaptersContainer.style.display = "none";
} }
return; return [];
} }
segments ??= []; segments ??= [];
@@ -820,7 +850,7 @@ class PreviewBar {
private getChapterButton(chaptersContainer: HTMLElement): HTMLButtonElement { private getChapterButton(chaptersContainer: HTMLElement): HTMLButtonElement {
return (chaptersContainer ?? this.getChaptersContainer()) return (chaptersContainer ?? this.getChaptersContainer())
.querySelector("button.ytp-chapter-title") as HTMLButtonElement; ?.querySelector("button.ytp-chapter-title") as HTMLButtonElement;
} }
remove(): void { remove(): void {
@@ -900,11 +930,18 @@ class PreviewBar {
return this.videoDuration * (showLarger ? 0.006 : 0.003); return this.videoDuration * (showLarger ? 0.006 : 0.003);
} }
private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[]): PreviewBarSegment | null { // Name parameter used for cache
private getSmallestSegment(timeInSeconds: number, segments: PreviewBarSegment[], name?: string): PreviewBarSegment | null {
const proposedIndex = name ? this.lastSmallestSegment[name]?.index : null;
const startSearchIndex = proposedIndex && segments[proposedIndex] === this.lastSmallestSegment[name].segment ? proposedIndex : 0;
const direction = startSearchIndex > 0 && timeInSeconds < this.lastSmallestSegment[name].segment.segment[0] ? -1 : 1;
let segment: PreviewBarSegment | null = null; let segment: PreviewBarSegment | null = null;
let index = -1;
let currentSegmentLength = Infinity; let currentSegmentLength = Infinity;
for (const seg of segments) { // for (let i = startSearchIndex; i < segments.length && i >= 0; i += direction) {
const seg = segments[i];
const segmentLength = seg.segment[1] - seg.segment[0]; const segmentLength = seg.segment[1] - seg.segment[0];
const minSize = this.getMinimumSize(seg.showLarger); const minSize = this.getMinimumSize(seg.showLarger);
@@ -914,8 +951,20 @@ class PreviewBar {
if (segmentLength < currentSegmentLength) { if (segmentLength < currentSegmentLength) {
currentSegmentLength = segmentLength; currentSegmentLength = segmentLength;
segment = seg; segment = seg;
index = i;
} }
} }
if (direction === 1 && seg.segment[0] > timeInSeconds) {
break;
}
}
if (segment) {
this.lastSmallestSegment[name] = {
index: index,
segment: segment
};
} }
return segment; return segment;

View File

@@ -102,6 +102,7 @@ export class SkipButtonControlBar {
this.enabled = true; this.enabled = true;
this.refreshText(); this.refreshText();
this.container?.classList?.remove("textDisabled");
this.textContainer?.classList?.remove("hidden"); this.textContainer?.classList?.remove("hidden");
AnimationUtils.disableAutoHideAnimation(this.skipIcon); AnimationUtils.disableAutoHideAnimation(this.skipIcon);
@@ -134,7 +135,6 @@ export class SkipButtonControlBar {
disable(): void { disable(): void {
this.container.classList.add("hidden"); this.container.classList.add("hidden");
this.textContainer?.classList?.remove("hidden");
this.chapterText?.classList?.remove("hidden"); this.chapterText?.classList?.remove("hidden");
this.getChapterPrefix()?.classList?.remove("hidden"); this.getChapterPrefix()?.classList?.remove("hidden");
@@ -142,6 +142,10 @@ export class SkipButtonControlBar {
this.enabled = false; this.enabled = false;
} }
isEnabled(): boolean {
return this.enabled;
}
toggleSkip(): void { toggleSkip(): void {
this.skip(this.segment); this.skip(this.segment);
this.disableText(); this.disableText();

View File

@@ -532,7 +532,7 @@ function activatePrivateTextChange(element: HTMLElement) {
case "userID": case "userID":
if (Config.config[option]) { if (Config.config[option]) {
utils.asyncRequestToServer("GET", "/api/userInfo", { utils.asyncRequestToServer("GET", "/api/userInfo", {
userID: Config.config[option], publicUserID: utils.getHash(Config.config[option]),
values: ["warnings", "banned"] values: ["warnings", "banned"]
}).then((result) => { }).then((result) => {
const userInfo = JSON.parse(result.responseText); const userInfo = JSON.parse(result.responseText);

View File

@@ -67,9 +67,11 @@ class MessageHandler {
// To prevent clickjacking // To prevent clickjacking
let allowPopup = window === window.top; let allowPopup = window === window.top;
window.addEventListener("message", async (e) => { window.addEventListener("message", async (e): Promise<void> => {
if (e.source !== window.parent) return; if (e.source !== window.parent) return;
if (e.origin.endsWith('.youtube.com')) return allowPopup = true; if (e.origin.endsWith('.youtube.com')) {
allowPopup = true;
}
}); });
//make this a function to allow this to run on the content page //make this a function to allow this to run on the content page
@@ -281,7 +283,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
if (!Config.config.payments.freeAccess && !noRefreshFetchingChaptersAllowed()) values.push("freeChaptersAccess"); if (!Config.config.payments.freeAccess && !noRefreshFetchingChaptersAllowed()) values.push("freeChaptersAccess");
utils.asyncRequestToServer("GET", "/api/userInfo", { utils.asyncRequestToServer("GET", "/api/userInfo", {
userID: Config.config.userID, publicUserID: await utils.getHash(Config.config.userID),
values values
}).then((res) => { }).then((res) => {
if (res.status === 200) { if (res.status === 200) {
@@ -456,8 +458,13 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404"); PageElements.videoFound.innerHTML = chrome.i18n.getMessage("sponsor404");
PageElements.issueReporterImportExport.classList.remove("hidden"); PageElements.issueReporterImportExport.classList.remove("hidden");
} else { } else {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status; if (request.status) {
PageElements.issueReporterImportExport.classList.add("hidden"); PageElements.videoFound.innerHTML = chrome.i18n.getMessage("connectionError") + request.status;
} else {
PageElements.videoFound.innerHTML = chrome.i18n.getMessage("segmentsStillLoading");
}
PageElements.issueReporterImportExport.classList.remove("hidden");
} }
} }
@@ -609,6 +616,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
const votingButtons = document.createElement("details"); const votingButtons = document.createElement("details");
votingButtons.classList.add("votingButtons"); votingButtons.classList.add("votingButtons");
votingButtons.id = "votingButtons" + UUID; votingButtons.id = "votingButtons" + UUID;
votingButtons.setAttribute("data-uuid", UUID);
votingButtons.addEventListener("toggle", () => { votingButtons.addEventListener("toggle", () => {
if (votingButtons.open) { if (votingButtons.open) {
openedUUIDs.push(UUID); openedUUIDs.push(UUID);
@@ -693,6 +701,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
voteButtonsContainer.appendChild(downvoteButton); voteButtonsContainer.appendChild(downvoteButton);
voteButtonsContainer.appendChild(uuidButton); voteButtonsContainer.appendChild(uuidButton);
if (downloadedTimes[i].actionType === ActionType.Skip || downloadedTimes[i].actionType === ActionType.Mute if (downloadedTimes[i].actionType === ActionType.Skip || downloadedTimes[i].actionType === ActionType.Mute
|| downloadedTimes[i].actionType === ActionType.Poi
&& [SponsorHideType.Visible, SponsorHideType.Hidden].includes(downloadedTimes[i].hidden)) { && [SponsorHideType.Visible, SponsorHideType.Hidden].includes(downloadedTimes[i].hidden)) {
voteButtonsContainer.appendChild(hideButton); voteButtonsContainer.appendChild(hideButton);
} }
@@ -1062,10 +1071,37 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
port.onMessage.addListener((msg) => onMessage(msg)); port.onMessage.addListener((msg) => onMessage(msg));
} }
function updateCurrentTime(currentTime: number) {
// Create a map of segment UUID -> segment object for easy access
const segmentMap: Record<string, SponsorTime> = {};
for (const segment of downloadedTimes)
segmentMap[segment.UUID] = segment
// Iterate over segment elements and update their classes
const segmentList = document.getElementById("issueReporterTimeButtons");
for (const segmentElement of segmentList.children) {
const UUID = segmentElement.getAttribute("data-uuid");
if (UUID == null || segmentMap[UUID] == undefined) continue;
const summaryElement = segmentElement.querySelector("summary")
if (summaryElement == null) continue;
const segment = segmentMap[UUID]
summaryElement.classList.remove("segmentActive", "segmentPassed")
if (currentTime >= segment.segment[0]) {
if (currentTime < segment.segment[1]) {
summaryElement.classList.add("segmentActive");
} else {
summaryElement.classList.add("segmentPassed");
}
}
}
}
function onMessage(msg: PopupMessage) { function onMessage(msg: PopupMessage) {
switch (msg.message) { switch (msg.message) {
case "time": case "time":
displayDownloadedSponsorTimes(downloadedTimes, msg.time); updateCurrentTime(msg.time);
break; break;
case "infoUpdated": case "infoUpdated":
infoFound(msg); infoFound(msg);

View File

@@ -43,8 +43,10 @@ export class CategoryPill {
this.root.render(<CategoryPillComponent ref={this.ref} vote={vote} />); this.root.render(<CategoryPillComponent ref={this.ref} vote={vote} />);
if (this.unsavedState) { if (this.unsavedState) {
this.ref.current?.setState(this.unsavedState); GenericUtils.wait(() => this.ref.current).then(() => {
this.unsavedState = null; this.ref.current?.setState(this.unsavedState);
this.unsavedState = null;
});
} }
if (onMobileYouTube) { if (onMobileYouTube) {

View File

@@ -319,6 +319,7 @@ export default class Utils {
return selection; return selection;
} }
} }
return { name: "None", option: 0} as CategorySelection;
} }
/** /**

View File

@@ -148,5 +148,13 @@ export function getGuidelineInfo(category: Category): TextBox[] {
icon: "icons/check-smaller.svg", icon: "icons/check-smaller.svg",
text: chrome.i18n.getMessage(`category_${category}_guideline3`) text: chrome.i18n.getMessage(`category_${category}_guideline3`)
}]; }];
default:
return [{
icon: "icons/segway.png",
text: chrome.i18n.getMessage(`generic_guideline1`)
}, {
icon: "icons/right-arrow.svg",
text: chrome.i18n.getMessage(`generic_guideline2`)
}];
} }
} }

View File

@@ -8,7 +8,7 @@ const inTest = typeof chrome === "undefined";
const chapterNames = CompileConfig.categoryList.filter((code) => code !== "chapter") const chapterNames = CompileConfig.categoryList.filter((code) => code !== "chapter")
.map((code) => ({ .map((code) => ({
code, code,
name: !inTest ? chrome.i18n.getMessage("category_" + code) : code names: !inTest ? [chrome.i18n.getMessage("category_" + code), shortCategoryName(code)] : [code]
})); }));
export function exportTimes(segments: SponsorTime[]): string { export function exportTimes(segments: SponsorTime[]): string {
@@ -47,7 +47,7 @@ export function importTimes(data: string, videoDuration: number): SponsorTime[]
const title = titleLeft?.length > titleRight?.length ? titleLeft : titleRight; const title = titleLeft?.length > titleRight?.length ? titleLeft : titleRight;
if (title) { if (title) {
const determinedCategory = chapterNames.find(c => c.name === title)?.code as Category; const determinedCategory = chapterNames.find(c => c.names.includes(title))?.code as Category;
const segment: SponsorTime = { const segment: SponsorTime = {
segment: [startTime, GenericUtils.getFormattedTimeToSeconds(match[1])], segment: [startTime, GenericUtils.getFormattedTimeToSeconds(match[1])],
@@ -85,3 +85,8 @@ export function exportTimesAsHashParam(segments: SponsorTime[]): string {
return `#segments=${JSON.stringify(hashparamSegments)}`; return `#segments=${JSON.stringify(hashparamSegments)}`;
} }
export function normalizeChapterName(description: string): string {
return description.toLowerCase().replace(/\.|:|-/g, "").replace(/\s+/g, " ");
}

View File

@@ -53,7 +53,7 @@ export async function fetchingChaptersAllowed(): Promise<boolean> {
// Check for free access if no license key, and it is the first time // Check for free access if no license key, and it is the first time
const result = await utils.asyncRequestToServer("GET", "/api/userInfo", { const result = await utils.asyncRequestToServer("GET", "/api/userInfo", {
value: "freeChaptersAccess", value: "freeChaptersAccess",
userID: Config.config.userID publicUserID: await utils.getHash(Config.config.userID)
}); });
try { try {

View File

@@ -68,10 +68,12 @@ export function getHashParams(): Record<string, unknown> {
export function getExistingChapters(currentVideoID: VideoID, duration: number): SponsorTime[] { export function getExistingChapters(currentVideoID: VideoID, duration: number): SponsorTime[] {
const chaptersBox = document.querySelector("ytd-macro-markers-list-renderer"); const chaptersBox = document.querySelector("ytd-macro-markers-list-renderer");
const title = document.querySelector("[target-id=engagement-panel-macro-markers-auto-chapters] #title-text");
if (title?.textContent?.includes("Key moment")) return [];
const chapters: SponsorTime[] = []; const chapters: SponsorTime[] = [];
// .ytp-timed-markers-container indicates that key-moments are present, which should not be divided // .ytp-timed-markers-container indicates that key-moments are present, which should not be divided
if (chaptersBox && !(document.querySelector(".ytp-timed-markers-container")?.childElementCount > 0)) { if (chaptersBox) {
let lastSegment: SponsorTime = null; let lastSegment: SponsorTime = null;
const links = chaptersBox.querySelectorAll("ytd-macro-markers-list-item-renderer > a"); const links = chaptersBox.querySelectorAll("ytd-macro-markers-list-item-renderer > a");
for (const link of links) { for (const link of links) {

View File

@@ -22,5 +22,7 @@ export function urlTimeToSeconds(time: string): number {
return hours * 3600 + minutes * 60 + seconds; return hours * 3600 + minutes * 60 + seconds;
} else if (/\d+/.test(time)) { } else if (/\d+/.test(time)) {
return parseInt(time, 10); return parseInt(time, 10);
} else {
return 0;
} }
} }

View File

@@ -13,7 +13,7 @@ export interface ChatConfig {
export async function openWarningDialog(contentContainer: ContentContainer): Promise<void> { export async function openWarningDialog(contentContainer: ContentContainer): Promise<void> {
const userInfo = await utils.asyncRequestToServer("GET", "/api/userInfo", { const userInfo = await utils.asyncRequestToServer("GET", "/api/userInfo", {
userID: Config.config.userID, publicUserID: await utils.getHash(Config.config.userID),
values: ["warningReason"] values: ["warningReason"]
}); });

View File

@@ -3,6 +3,8 @@
"module": "commonjs", "module": "commonjs",
"target": "es6", "target": "es6",
"noImplicitAny": false, "noImplicitAny": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": false, "sourceMap": false,
"outDir": "dist/js", "outDir": "dist/js",
"noEmitOnError": false, "noEmitOnError": false,

View File

@@ -3,6 +3,8 @@
"module": "commonjs", "module": "commonjs",
"target": "es6", "target": "es6",
"noImplicitAny": false, "noImplicitAny": false,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"sourceMap": true, "sourceMap": true,
"outDir": "dist/js", "outDir": "dist/js",
"noEmitOnError": false, "noEmitOnError": false,

View File

@@ -0,0 +1,66 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const { readFile } = require("fs/promises")
let logger;
const readFileContents = (name) => readFile(name)
.then(data => JSON.parse(data))
// partialDeepEquals from ajayyy/SponsorBlockServer
function partialDeepEquals (actual, expected, logger) {
// loop over key, value of expected
let failed = false;
for (const [ key, value ] of Object.entries(expected)) {
if (key === "serverAddress" || key === "testingServerAddress" || key === "serverAddressComment" || key === "freeChapterAccess") continue
// if value is object, recurse
const actualValue = actual?.[key]
if (typeof value !== "string" && Array.isArray(value)) {
if (!arrayPartialDeepEquals(actualValue, value)) {
printActualExpected(key, actualValue, value, logger)
failed = true
}
} else if (typeof value === "object") {
if (partialDeepEquals(actualValue, value, logger)) {
console.log("obj failed")
printActualExpected(key, actualValue, value, logger)
failed = true
}
} else if (actualValue !== value) {
printActualExpected(key, actualValue, value, logger)
failed = true
}
}
return failed
}
const arrayPartialDeepEquals = (actual, expected) =>
expected.every(a => actual?.includes(a))
function printActualExpected(key, actual, expected, logger) {
logger.error(`Differing value for: ${key}`)
logger.error(`Actual: ${JSON.stringify(actual)}`)
logger.error(`Expected: ${JSON.stringify(expected)}`)
}
class configDiffPlugin {
apply(compiler) {
// eslint-disable-next-line @typescript-eslint/no-unused-vars
compiler.hooks.done.tapAsync("configDiffPlugin", async (stats, callback) => {
logger = compiler.getInfrastructureLogger('configDiffPlugin')
logger.log('Checking for config.json diff...')
// check example
const exampleConfig = await readFileContents("./config.json.example")
const currentConfig = await readFileContents("./config.json")
const difference = partialDeepEquals(currentConfig, exampleConfig, logger)
if (difference) {
logger.warn("config.json is missing values from config.json.example")
} else {
logger.info("config.json is not missing any values from config.json.example")
}
callback()
})
}
}
module.exports = configDiffPlugin;

View File

@@ -7,6 +7,7 @@ const BuildManifest = require('./webpack.manifest');
const srcDir = '../src/'; const srcDir = '../src/';
const fs = require("fs"); const fs = require("fs");
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const configDiffPlugin = require('./configDiffPlugin');
const edgeLanguages = [ const edgeLanguages = [
"de", "de",
@@ -116,6 +117,7 @@ module.exports = env => ({
browser: env.browser, browser: env.browser,
pretty: env.mode === "production", pretty: env.mode === "production",
stream: env.stream stream: env.stream
}) }),
new configDiffPlugin()
] ]
}); });