Compare commits
176 Commits
april-fool
...
4.6
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6bdac234b0 | ||
|
|
337e9680b9 | ||
|
|
986630d0a1 | ||
|
|
ae23bfffe1 | ||
|
|
619683e842 | ||
|
|
1b5ba96bd9 | ||
|
|
bbc5b436e0 | ||
|
|
91311787df | ||
|
|
74e9a98afd | ||
|
|
b369dcc117 | ||
|
|
5a05e01b7d | ||
|
|
8097eff9bb | ||
|
|
c61c97ccad | ||
|
|
9a7baa7325 | ||
|
|
5ac577c99b | ||
|
|
3f421a2fb0 | ||
|
|
e94ce0ffef | ||
|
|
2dfcf2141f | ||
|
|
47220e0abc | ||
|
|
05eed6ee20 | ||
|
|
9eec62d59f | ||
|
|
25c04a49c1 | ||
|
|
efe6b0483c | ||
|
|
32a3cb2cfe | ||
|
|
d9970bf110 | ||
|
|
6514b41418 | ||
|
|
e480e032f2 | ||
|
|
995001bd91 | ||
|
|
466152ed42 | ||
|
|
e4855f7427 | ||
|
|
258abd5deb | ||
|
|
4e7975a9de | ||
|
|
ec8d5d88e9 | ||
|
|
71653572aa | ||
|
|
a18f431e06 | ||
|
|
56f7b40585 | ||
|
|
a5f263dc12 | ||
|
|
3415dafb02 | ||
|
|
9664bbea73 | ||
|
|
c7b07ba958 | ||
|
|
20b95887af | ||
|
|
47d4812b92 | ||
|
|
6202a4d0a3 | ||
|
|
6b584f2111 | ||
|
|
3d9221eb8d | ||
|
|
96173dd901 | ||
|
|
5820758563 | ||
|
|
bfadb1373a | ||
|
|
a7956aacf9 | ||
|
|
afee681575 | ||
|
|
b5482b6527 | ||
|
|
ff87a42147 | ||
|
|
7e5130c49a | ||
|
|
a7b18bca87 | ||
|
|
a2ead6bcc4 | ||
|
|
4a2614349d | ||
|
|
67c63a09fe | ||
|
|
97aea1c268 | ||
|
|
b70f50e1a0 | ||
|
|
4880227320 | ||
|
|
dfa21068f4 | ||
|
|
fd75a33e50 | ||
|
|
1409c563e2 | ||
|
|
588c42d579 | ||
|
|
d7ff6aa6a2 | ||
|
|
44266e508b | ||
|
|
9b9ea39260 | ||
|
|
31b10f9a41 | ||
|
|
c0f8f5e1d0 | ||
|
|
0261d36a47 | ||
|
|
e948e1e569 | ||
|
|
5289e62d43 | ||
|
|
eda7aac5ef | ||
|
|
d9f4ab0d04 | ||
|
|
2665327729 | ||
|
|
4738c1897f | ||
|
|
cfbb194a61 | ||
|
|
9ad21e8ea1 | ||
|
|
941fc2985d | ||
|
|
e2da071761 | ||
|
|
c20c9ac64a | ||
|
|
2d59f3825c | ||
|
|
fb8b7a7d19 | ||
|
|
d992cc7a3c | ||
|
|
f8fecf5174 | ||
|
|
3007cddce9 | ||
|
|
2b3c812f8a | ||
|
|
61535fac95 | ||
|
|
4182595436 | ||
|
|
97e30e4001 | ||
|
|
6763fd3b4b | ||
|
|
a39ec76340 | ||
|
|
f68282decc | ||
|
|
160de56a71 | ||
|
|
bd4fbcc93d | ||
|
|
f1839eef94 | ||
|
|
3e3abf36e5 | ||
|
|
393861dcd3 | ||
|
|
b5d6b2d3fd | ||
|
|
a0c82dc734 | ||
|
|
e4be99c3d7 | ||
|
|
3da6a57e42 | ||
|
|
7ce9442153 | ||
|
|
773da185ee | ||
|
|
bf3dcd97b8 | ||
|
|
793c16a21b | ||
|
|
52dc697635 | ||
|
|
36689ed886 | ||
|
|
4d4689a190 | ||
|
|
78aaffb8d8 | ||
|
|
b82e43bb93 | ||
|
|
8eef3a3ce5 | ||
|
|
063845d513 | ||
|
|
7353a2ac0d | ||
|
|
50aaea0dd2 | ||
|
|
5e733fddad | ||
|
|
5d48e87e0b | ||
|
|
e86f5a1a59 | ||
|
|
2d2bd36abb | ||
|
|
e72f3b1a12 | ||
|
|
fd260f4caa | ||
|
|
ccc1f4cad1 | ||
|
|
42511cb667 | ||
|
|
123d7af5eb | ||
|
|
44f2de42db | ||
|
|
e4dd0f1ac6 | ||
|
|
9fdce8e814 | ||
|
|
813b2df1ac | ||
|
|
95696e23fe | ||
|
|
463ce258bf | ||
|
|
0bf8368686 | ||
|
|
0c216792cf | ||
|
|
dd447297f9 | ||
|
|
1a908b5038 | ||
|
|
ba629e9c9e | ||
|
|
fb11242dd5 | ||
|
|
aa88ab1985 | ||
|
|
b075116502 | ||
|
|
9e02e35c4d | ||
|
|
d7e67fb397 | ||
|
|
f2172bb2ad | ||
|
|
c773b4ecd1 | ||
|
|
9bad5ed324 | ||
|
|
93bb016b4f | ||
|
|
8c901d5bad | ||
|
|
ac533c612c | ||
|
|
21e9dd870d | ||
|
|
e3f6242e5f | ||
|
|
a47fa20652 | ||
|
|
fa0c890633 | ||
|
|
d7d12e1618 | ||
|
|
82bdc28305 | ||
|
|
7c4f649016 | ||
|
|
d937a2ae59 | ||
|
|
d19fcd2a4c | ||
|
|
9b4c4afa35 | ||
|
|
c5b00f67a1 | ||
|
|
6f79e986ba | ||
|
|
8aa10605c5 | ||
|
|
44421c4b5d | ||
|
|
fbbd6de0ff | ||
|
|
c6e3d11071 | ||
|
|
ae7f1f228f | ||
|
|
d353f3b677 | ||
|
|
42eceb3efd | ||
|
|
6f5586d656 | ||
|
|
9bea04dfc2 | ||
|
|
0d34e643c7 | ||
|
|
88f60c0e84 | ||
|
|
964a277331 | ||
|
|
057c7792df | ||
|
|
bd6372d944 | ||
|
|
0d31b8276c | ||
|
|
b15a8db651 | ||
|
|
9f1f9f84d4 | ||
|
|
a64deb2e18 |
33
.eslintrc.js
@@ -1,33 +0,0 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
es2021: true,
|
||||
node: true,
|
||||
jest: true,
|
||||
jasmine: true,
|
||||
},
|
||||
extends: [
|
||||
"eslint:recommended",
|
||||
"plugin:react/recommended",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
],
|
||||
parser: "@typescript-eslint/parser",
|
||||
parserOptions: {
|
||||
ecmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
ecmaVersion: 12,
|
||||
sourceType: "module",
|
||||
},
|
||||
plugins: ["react", "@typescript-eslint"],
|
||||
rules: {
|
||||
// TODO: Remove warn rules when not needed anymore
|
||||
"no-self-assign": "off",
|
||||
"@typescript-eslint/no-empty-interface": "off",
|
||||
},
|
||||
settings: {
|
||||
react: {
|
||||
version: "detect",
|
||||
},
|
||||
},
|
||||
};
|
||||
33
.eslintrc.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es2021": true,
|
||||
"node": true,
|
||||
"jest": true
|
||||
},
|
||||
"extends": [
|
||||
"eslint:recommended",
|
||||
"plugin:react/recommended",
|
||||
"plugin:@typescript-eslint/recommended"
|
||||
],
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"parserOptions": {
|
||||
"ecmaFeatures": {
|
||||
"jsx": true
|
||||
},
|
||||
"ecmaVersion": 12,
|
||||
"sourceType": "module"
|
||||
},
|
||||
"plugins": ["react", "@typescript-eslint"],
|
||||
"rules": {
|
||||
"@typescript-eslint/no-unused-vars": "error",
|
||||
"no-self-assign": "off",
|
||||
"@typescript-eslint/no-empty-interface": "off",
|
||||
"react/prop-types": [2, { "ignore": ["children"] }]
|
||||
},
|
||||
"settings": {
|
||||
"react": {
|
||||
"version": "detect"
|
||||
}
|
||||
}
|
||||
}
|
||||
2
.github/workflows/ci.yml
vendored
@@ -13,7 +13,7 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '16'
|
||||
node-version: '18'
|
||||
- run: npm ci
|
||||
- name: Copy configuration
|
||||
run: cp config.json.example config.json
|
||||
|
||||
2
.github/workflows/release.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '16'
|
||||
node-version: '18'
|
||||
- run: npm ci
|
||||
- name: Copy configuration
|
||||
run: cp config.json.example config.json
|
||||
|
||||
17
.github/workflows/tests.yml
vendored
@@ -3,8 +3,7 @@ name: Tests
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
test:
|
||||
name: Run tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -13,8 +12,18 @@ jobs:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '16'
|
||||
node-version: '18'
|
||||
- run: npm ci
|
||||
- run: sudo apt-get install chromium-chromedriver
|
||||
|
||||
- name: Copy configuration
|
||||
run: cp config.json.example config.json
|
||||
- name: Run tests
|
||||
run: npm run test-without-building
|
||||
run: npm run test
|
||||
|
||||
- name: Upload results on fail
|
||||
if: ${{ failure() }}
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Test Results
|
||||
path: ./test-results
|
||||
2
.github/workflows/update-oss-attribution.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
||||
uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '16'
|
||||
node-version: '18'
|
||||
- name: Install and generate attribution
|
||||
run: |
|
||||
npm ci
|
||||
|
||||
1
.gitignore
vendored
@@ -8,3 +8,4 @@ dist/
|
||||
tmp/
|
||||
.DS_Store
|
||||
ci/data.json
|
||||
test-results
|
||||
@@ -13,7 +13,7 @@
|
||||
<a href="https://addons.mozilla.org/addon/sponsorblock/?src=external-github">Firefox</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Android">Android</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Edge">Edge</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Safari">Safari for MacOS</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock/wiki/Safari">Safari for MacOS and iOS</a> |
|
||||
<a href="https://sponsor.ajay.app">Website</a> |
|
||||
<a href="https://sponsor.ajay.app/stats">Stats</a>
|
||||
</p>
|
||||
|
||||
@@ -1 +1 @@
|
||||
["yewtu.be","invidious.snopyta.org","vid.puffyan.us","invidious.kavin.rocks","invidio.xamh.de","inv.riverside.rocks","invidious-us.kavin.rocks","invidious.osi.kr","tube.cthd.icu","yt.artemislena.eu","youtube.076.ne.jp","invidious.namazso.eu"]
|
||||
["yewtu.be","vid.puffyan.us","invidious.snopyta.org","inv.riverside.rocks","invidious-us.kavin.rocks","invidious.osi.kr","tube.cthd.icu","invidious.flokinet.to","yt.artemislena.eu","invidious.mutahar.rocks","invidious.esmailelbob.xyz","youtube.076.ne.jp","invidious.weblibre.org","invidious.namazso.eu","invidious.kavin.rocks"]
|
||||
@@ -5,4 +5,5 @@ module.exports = {
|
||||
"transform": {
|
||||
"^.+\\.ts$": "ts-jest"
|
||||
},
|
||||
"reporters": ["default", "github-actions"]
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "4.2.1",
|
||||
"version": "4.6",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"homepage_url": "https://sponsor.ajay.app",
|
||||
@@ -34,6 +34,7 @@
|
||||
"icons/settings.svg",
|
||||
"icons/pencil.svg",
|
||||
"icons/check.svg",
|
||||
"icons/check-smaller.svg",
|
||||
"icons/upvote.png",
|
||||
"icons/downvote.png",
|
||||
"icons/thumbs_down.svg",
|
||||
@@ -50,6 +51,16 @@
|
||||
"icons/heart.svg",
|
||||
"icons/visible.svg",
|
||||
"icons/not_visible.svg",
|
||||
"icons/money.svg",
|
||||
"icons/segway.png",
|
||||
"icons/close-smaller.svg",
|
||||
"icons/right-arrow.svg",
|
||||
"icons/campaign.svg",
|
||||
"icons/star.svg",
|
||||
"icons/lightbulb.svg",
|
||||
"icons/bolt.svg",
|
||||
"icons/stopwatch.svg",
|
||||
"icons/music-note.svg",
|
||||
"icons/PlayerInfoIconSponsorBlocker.svg",
|
||||
"icons/PlayerDeleteIconSponsorBlocker.svg",
|
||||
"popup.html",
|
||||
@@ -64,7 +75,35 @@
|
||||
],
|
||||
"browser_action": {
|
||||
"default_title": "SponsorBlock",
|
||||
"default_popup": "popup.html"
|
||||
"default_popup": "popup.html",
|
||||
"default_icon": {
|
||||
"16": "icons/IconSponsorBlocker16px.png",
|
||||
"32": "icons/IconSponsorBlocker32px.png",
|
||||
"64": "icons/LogoSponsorBlocker64px.png",
|
||||
"128": "icons/LogoSponsorBlocker128px.png"
|
||||
},
|
||||
"theme_icons": [
|
||||
{
|
||||
"light": "icons/IconSponsorBlocker16px.png",
|
||||
"dark": "icons/IconSponsorBlocker16px.png",
|
||||
"size": 16
|
||||
},
|
||||
{
|
||||
"light": "icons/IconSponsorBlocker32px.png",
|
||||
"dark": "icons/IconSponsorBlocker32px.png",
|
||||
"size": 32
|
||||
},
|
||||
{
|
||||
"light": "icons/LogoSponsorBlocker64px.png",
|
||||
"dark": "icons/LogoSponsorBlocker64px.png",
|
||||
"size": 64
|
||||
},
|
||||
{
|
||||
"light": "icons/LogoSponsorBlocker128px.png",
|
||||
"dark": "icons/LogoSponsorBlocker128px.png",
|
||||
"size": 128
|
||||
}
|
||||
]
|
||||
},
|
||||
"background": {
|
||||
"scripts":[
|
||||
|
||||
11700
package-lock.json
generated
64
package.json
@@ -3,37 +3,40 @@
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "background.js",
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chrome": "^0.0.178",
|
||||
"@types/chrome": "^0.0.188",
|
||||
"@types/firefox-webext-browser": "^94.0.1",
|
||||
"@types/jest": "^27.4.0",
|
||||
"@types/jest": "^27.5.1",
|
||||
"@types/react": "^17.0.43",
|
||||
"@types/react-dom": "^17.0.14",
|
||||
"@types/selenium-webdriver": "^4.1.1",
|
||||
"@types/wicg-mediasession": "^1.1.3",
|
||||
"@types/react": "^17.0.39",
|
||||
"@types/react-dom": "^17.0.11",
|
||||
"@types/selenium-webdriver": "^4.0.17",
|
||||
"@typescript-eslint/eslint-plugin": "^5.10.2",
|
||||
"@typescript-eslint/parser": "^5.10.2",
|
||||
"chromedriver": "^97.0.4",
|
||||
"concurrently": "^7.0.0",
|
||||
"copy-webpack-plugin": "^10.2.4",
|
||||
"eslint": "^8.8.0",
|
||||
"eslint-plugin-react": "^7.28.0",
|
||||
"jest": "^27.5.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.26.0",
|
||||
"@typescript-eslint/parser": "^5.26.0",
|
||||
"chromedriver": "^101.0.0",
|
||||
"concurrently": "^7.2.1",
|
||||
"copy-webpack-plugin": "^11.0.0",
|
||||
"eslint": "^8.16.0",
|
||||
"eslint-plugin-react": "^7.30.0",
|
||||
"fork-ts-checker-webpack-plugin": "^7.2.11",
|
||||
"jest": "^28.1.0",
|
||||
"rimraf": "^3.0.2",
|
||||
"schema-utils": "^4.0.0",
|
||||
"selenium-webdriver": "^4.1.1",
|
||||
"ts-jest": "^27.1.3",
|
||||
"ts-loader": "^9.2.6",
|
||||
"ts-node": "^10.4.0",
|
||||
"typescript": "4.5",
|
||||
"web-ext": "^6.6.0",
|
||||
"webpack": "^5.68.0",
|
||||
"selenium-webdriver": "^4.2.0",
|
||||
"speed-measure-webpack-plugin": "^1.5.0",
|
||||
"ts-jest": "^28.0.3",
|
||||
"ts-loader": "^9.3.0",
|
||||
"ts-node": "^10.8.0",
|
||||
"typescript": "4.7",
|
||||
"web-ext": "^6.8.0",
|
||||
"webpack": "^5.72.1",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-merge": "^4.2.2"
|
||||
"webpack-merge": "^5.8.0"
|
||||
},
|
||||
"scripts": {
|
||||
"web-run": "npm run web-run:chrome",
|
||||
@@ -63,21 +66,26 @@
|
||||
"lint:fix": "eslint src --fix"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.20.0"
|
||||
"node": ">=16"
|
||||
},
|
||||
"funding": [{
|
||||
"funding": [
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "hhttps://sponsor.ajay.app/donate"
|
||||
}, {
|
||||
"url": "https://sponsor.ajay.app/donate"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/ajayyy-org"
|
||||
}, {
|
||||
},
|
||||
{
|
||||
"type": "patreon",
|
||||
"url": "https://www.patreon.com/ajayyy"
|
||||
}, {
|
||||
},
|
||||
{
|
||||
"type": "individual",
|
||||
"url": "https://paypal.me/ajayyy"
|
||||
}],
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/ajayyy/SponsorBlock.git"
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Копиране на публичния UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Копиране на идентификатора на сегмента"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Елате в официалния Discord сървър, за да давате предложения!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Показване на известие след пропускане на сегмент"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Показване на помощ за категорията"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Известия за пропускане в пълен размер"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "до",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Включване на преходи"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Възпроизвежда се, сякаш нищо не е пропуснато"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Спонсорство"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Платени промоции"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Не за дарения или персонализирани стоки"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Неплатена/Самореклама"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Дарения, членства и персонализирани стоки"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Безплатни възгласи, които не допринасят за видеоклипа"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Не за продукти и стоки с корпоративен дизайн"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Ексклузивен достъп"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Този видеоклип представя продукт, услуга или място, до което е получен безплатен или субсидиран достъп",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Целият видеоклип показва нещо, до което е получен безплатен или субсидиран достъп"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Напомняне за действие (абониране)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Когато има кратко напомняне да харесате, да се абонирате или да последвате канала по средата на съдържанието. Ако е дълго или за нещо специфично, трябва да е под „самореклама“."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Кратки напомняния за харесване, абониране или следване"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Включва непреки напомняния за коментиране"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Не за общо популяризиране, а само за призиви за действие"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Напомняне за взаимодействие"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Антракт"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Интервал без реално съдържание"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Не за преходи с информация"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Крайни картички/Заслуги"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Заслуги или когато се показват крайните карти на YouTube. Не за заключения с информация."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Без съдържание, дори ако крайните карти са на екрана"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Кратко резюме/Обобщение"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Клипове, които се появяват по-късно или в бъдещ видеоклип"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Резюме на предишен видеоклип"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Не за части, които добавят допълнително съдържание"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Пълнеж/Шеги"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Пълнеж"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Съпътстващи сцени само за пълнеж или хумор"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Отвличане на вниманието, гафове, повторения"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Не за сцени, необходими за разбиране на темата"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Музика: Част без музика"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Без музика"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Секции, които не са в официалните издания"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Немузикална част от изпълнение на живо"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Акцент"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Частта от видеото, която повечето хора търсят. Подобно на коментарите „Видеото започва от х“."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Секция, която повечето хора търсят"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Може да помогне за прескачане на миналия контекст"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Може да прескочи до заглавието или миниатюрата"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Поточно предаване: Четене на съобщения/дарения"
|
||||
},
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Научете повече"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Пълна информация"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Гласуване против и създаване на локално копие, за да го изпратите отново"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Това незабавно ще се приложи към вашите сегменти"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Не одобрение"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Одобрение"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Скриване на сегмента"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Използвайте колелото на мишката, докато държите курсора върху полето за редактиране, за да коригирате бързо времето. Комбинации с клавиша ctrl или shift могат да се използват за фина настройка на промените."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Това е вградена клавишна комбинация в YouTube. Наистина ли искате да я използвате?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Сървърът BETA е активиран!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Отваряне на страницата с опции"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Възстановяване на първоначалните настройки"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Наистина ли искате да възстановите всички настройки до стойностите им по подразбиране? Това не може да бъде отменено."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "পাবলিক ইউজার আইডি কপি করুন"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "অংশের আইডি কপি করুন"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "পরামর্শ এবং প্রতিক্রিয়া জানাতে অফিসিয়াল ডিসকর্ড সার্ভারে যোগ দিন!"
|
||||
},
|
||||
@@ -211,5 +214,738 @@
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "স্টোর সেগমেন্ট ডাউনভোট"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "যেকোন ডাউনভোটকৃত অংশ রিফ্রেশ করার পরেও অদৃশ্য থাকবে"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "সতর্কীকরণ: এটি বন্ধ করলে পূর্বে সংরক্ষিত সব ডাউনভোট মুছে যাবে"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "হ্যাশের প্রিফিক্স দিয়ে খুজুন "
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "সার্ভার থেকে videoID দিয়ে অংশ অনুরোধ করার পরিবর্তে videoID এর হ্যাশ এর প্রথম ৪ অক্ষর পাঠানো হয়। এই সার্ভার সমতুল্য হ্যাশ এর সকল ভিডিও এর তথ্য ফেরত পাঠাবে।"
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "নতুন ভিডিওতে আবার অংশটি যোগার করুন"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "যদি ভিডিওটি নতুন হয়, এবং কোন অংশ পাওয়া না যায়, আপনার দেখার সময় কয়েক মিনিট পর পরই এটি তথ্য আনতে থাকবে।"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "নোটিশ পুনরায় প্রদর্শন করুন"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "একটি অংশ এড়ানোর পরে নোটিস প্রদর্শন করুন"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "পূর্ণ আকারের স্কিপ নোটিস"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "স্বয়ংক্রিয় স্কিপের জন্য ক্ষুদ্র আকারের স্কিপ নোটিস"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "সব ক্ষুদ্র আকারের স্কিপ নোটিস"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "স্বয়ংক্রিয় স্কিপের জন্য অনুজ্বল স্কিপ নোটিস"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "সব অনুজ্বল স্কিপ নোটিস"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock আপনাকে YouTube ভিডিওসমূহের স্পন্সর বার্তা, সূচনাবার্তা, সমাপ্তিবার্তা, সাবস্ক্রাইব করার জন্য স্মরণ করানো, এবং অন্যান্য বিবিধ বিরক্তিকর অংশ এড়িয়ে যেতে সাহায্য করে। SponsorBlock জনসংগৃহীত তথ্যসম্বলিত একটি ব্রাউজার এক্সটেনশন যা যে কাউকে একটি ভিডিওর স্পন্সর বার্তা এবং অন্যান্য অংশের শুরু এবং শেষ সময় সাবমিট করতে দেয়। যখন কেউ একজন এই তথ্য সাবমিট করে, এই এক্সটেনশন ব্যবহারকারী সবাই ঐ স্পন্সর বার্তা সম্বলিত অংশ এড়িয়ে যাবে। মিউজিক ভিডিও এর মিউজিক বহির্ভুত অংশও আপনি এড়িয়ে যেতে পারেন।",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "ওয়েবসাইট",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "সোর্স কোড",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "নোটিসটি আপগ্রেড করা হয়েছে!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "আপনি যদি এখনও এটি পছন্দ না করেন তবে কখনই দেখাবে না বোতামটি চাপুন।",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "সেগমেন্ট এড়িয়ে যান",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "সেগমেন্ট শুরু/শেষ",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "সেগমেন্ট জমা দিন",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "এটি টাইপ করে একটি কী নির্বাচন করুন এবং আপনি যে কোনও সংশোধক কীগুলি ব্যবহার করতে চান তা চয়ন করুন।"
|
||||
},
|
||||
"0": {
|
||||
"message": "সংযোগের সময়সীমা অতিক্রান্ত। আপনার ইন্টারনেট সংযোগ যাচাই করুন. যদি আপনার ইন্টারনেট কাজ করে থাকে তবে সার্ভারটি সম্ভবত ওভারলোডেড বা ডাউন।"
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "স্কিপিং চালু করা হয়েছে"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "স্কিপিং বন্ধ করা হয়েছে"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "আপনার কাজ",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "সার্ভারটি সম্ভবত ওভারলোডেড। কয়েক সেকেন্ডের মধ্যে আবার চেষ্টা করুন।"
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "ইরোর কোডঃ "
|
||||
},
|
||||
"skip": {
|
||||
"message": "এড়িয়ে যান"
|
||||
},
|
||||
"mute": {
|
||||
"message": "নিঃশব্দ করুন"
|
||||
},
|
||||
"full": {
|
||||
"message": "সমপূর্ণ ভিডিও",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "{0} এড়িয়ে যান?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "{0} নিঃশব্দ করুন?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "{0} তে চলে যান?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} এড়িয়ে যাওয়া হয়েছে",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} নিঃশব্দ করা হয়েছে",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0} তে চলে যাওয়া হয়েছে",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "স্বয়ংক্রিয়ভাবে স্কিপ করা বন্ধ করুন"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "স্বয়ংক্রিয়ভাবে স্কিপ করা চালু করুন"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "স্কিপের জন্য অডিও নোটিস"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "যখনই কোনও অংশ এড়িয়ে যাওয়া হয় তখন একটি শব্দ বাজাবে। যদি বন্ধ করা হয় (বা অটো স্কিপ বন্ধ থাকে) তবে কোনও শব্দ বাজানো হবে না।"
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "স্কিপগুলি সরানো সহ সময় দেখান"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "এই সময়টি সময় বারের নীচে বর্তমান সময়ের পাশের বন্ধনীগুলিতে উপস্থিত হয়। এটি মোট ভিডিও সময়কাল যে কোনও বিভাগকে বিয়োগ করে তা দেখায়। এর মধ্যে কেবল \"সময় বার এ দেখান\" হিসাবে চিহ্নিত বিভাগগুলি অন্তর্ভুক্ত রয়েছে।"
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "আপনি এড়িয়েছেন "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "মিনিট"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "মিনিট"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "ঘন্টা"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "ঘন্টা"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "আপনি মানুষকে রক্ষা করেছেন",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": "তাদের জীবন থেকে",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "সার্ভারের স্ট্যাটাস এর জন্য status.sponsor.ajay.app দেখুন করুন।"
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "আপনার ইউজার আইডি ইম্পোর্ট/এক্সপোর্ট করুন"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "এটি ব্যক্তিগত রাখা উচিত। এটি একটি পাসওয়ার্ডের মতো এবং কারও সাথে ভাগ করা উচিত নয়। কারও যদি এটি থাকে তবে তারা আপনার ছদ্মবেশ ধারণ করতে পারে। আপনি যদি আপনার পাবলিক ইউজারআইডি খুঁজছেন তবে পপআপে ক্লিপবোর্ড আইকনটি ক্লিক করুন।"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "ইউজার আইডি দিন"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "সতর্কতা: ইউজারআইডি পরিবর্তন করা চিরস্থায়ী। আপনি কি নিশ্চিত যে আপনি এটি করতে চান? আপনার পুরানোটিকে সাবধানতার সার্থে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন।"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "সৃষ্টি করেছেন"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "এটি ৩য় পক্ষের ইউটইউব সাইট সাপোর্ট করে"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "তৃতীয় পক্ষের ইউটিউব ক্লায়েন্টদের সমর্থন করুন। সমর্থন সক্ষম করতে, আপনাকে অবশ্যই অতিরিক্ত অনুমতিগুলি গ্রহণ করতে হবে। এটি ক্রোম এবং অন্যান্য ক্রোমিয়াম ভেরিয়েন্টগুলিতে ছদ্মবেশে কাজ করে না।",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "সমর্থিত সাইটসমুহ:"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Indivious সমর্থন সক্ষম করুন, অটোস্কিপ বন্ধ করুন, বোতামগুলি লুকান এবং আরও অনেক কিছু করুন।"
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "তৃতীয় পক্ষের ক্লায়েন্ট যুক্ত করুন"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "একটি কাস্টম উদাহরণ যুক্ত করুন। এটি অবশ্যই ডোমেন দিয়ে ফর্ম্যাট করা উচিত। উদাহরণ: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "যোগ করুন"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "এটি একটি অবৈধ ডোমেন। এটিতে কেবল ডোমেন অংশ অন্তর্ভুক্ত করা উচিত। উদাহরণ: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Invidious Instance এর তালিকা পুনরায় সেট করুন"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "আপনি এখন Invidious Instance এর তালিকা পুনরায় আগের মত করে দিবেন"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "বর্তমান Instance এর তালিকা"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "সর্বনিম্ন দৈর্ঘ্য (সেকেন্ড):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "সেট করা মান (সেকেন্ডে) থেকে ছোট সেগমেন্টগুলি প্লেয়ারে এড়িয়ে যাওয়া হবে বা দেখানো হবে না"
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "নোটিশ প্রদর্শন করার দৈর্ঘ্য (সেকেন্ড):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "স্কিপ নোটিশটি কমপক্ষে এত সেকেন্ডের জন্য স্ক্রিনে থাকবে। নিজে এড়িয়ে যাওয়ার জন্য, এটি দীর্ঘকাল ধরে দৃশ্যমান হতে পারে।"
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "নিম্নলিখিত সাবমিশনটি আপনার ন্যূনতম সময়কাল অপশনের চেয়ে কম। এর মানে এই হতে পারে যে এটি ইতিমধ্যে জমা দেওয়া হয়েছে, এবং এই অপশনের কারণে উপেক্ষা করা হচ্ছে। আপনি কি জমা দিতে চান?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "একটি সক্রিয় লাইভস্ট্রিম বা প্রিমিয়ারে জমা দেওয়ার অনুমতি নেই। এটি শেষ না হওয়া পর্যন্ত অপেক্ষা করুন, তারপরে পৃষ্ঠাটি রিফ্রেশ করুন এবং অংশগুলি এখনও বৈধ কিনা তা যাচাই করুন।"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "আপলোড করার বোতামটি দেখান"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "স্পনসরব্লক সার্ভার ঠিকানা"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "এ ঠিকানা SponsorBlock সার্ভারে সাথে যোগাযোগ করতে ব্যবহার করে।\nআপনার নিজের সার্ভার না থাকলে এটি পরিবর্তন করবেন না।"
|
||||
},
|
||||
"save": {
|
||||
"message": "সংরক্ষণ করুন"
|
||||
},
|
||||
"reset": {
|
||||
"message": "পুনরায় সেট করুন"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "এই ঠিকানাটি সঠিক আকারে নেই। এটিতে http: // বা https: // শুরুতে এবং কোনও পিছনের স্ল্যাশ নেই তা নিশ্চিত করুন।"
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "আপনি কি নিশ্চিতভাবে এটি মুছে ফেলতে চান??"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com এখন সাপর্টেড"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "সব অপশন ইম্পোর্ট/এক্সপোর্ট করুন"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "সম্পাদন/কপি করুন"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "ফাইল এ সেভ করুন"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "ফাইল থেকে লোড করুন"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "এটি আপনার সম্পূর্ণ কনফিগারেশন এতে আপনার ইউজারআইডি অন্তর্ভুক্ত রয়েছে, তাই বিজ্ঞতার সাথে শেয়ার করতে ভুলবেন না।."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "অপশন সেট করুন"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "সতর্কতা: অপশনগুলি পরিবর্তন করা চিরস্থায়ী এবং আপনার ইনস্টলটি ভাঙতে পারে। আপনি কি নিশ্চিত যে আপনি এটি করতে চান? আপনার পুরানোটিকে সাবধানতার সার্থে ব্যাকআপ করার বিষয়টি নিশ্চিত করুন।"
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "এই JSON সঠিকভাবে ফর্ম্যাট করা হয় নাই। আপনার অপশনগুলি পরিবর্তন করা হয়নি।"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "অংশ জমা দিন"
|
||||
},
|
||||
"submit": {
|
||||
"message": "জমা দিন"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "বাতিল করুন"
|
||||
},
|
||||
"delete": {
|
||||
"message": "মুছে ফেলুন"
|
||||
},
|
||||
"preview": {
|
||||
"message": "প্রিভিউ দেখুন"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "জমাকৃত নয়"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "পরিদর্শন করুন"
|
||||
},
|
||||
"edit": {
|
||||
"message": "সম্পাদন করুন"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "ডিবাগ তথ্য ক্লিপবোর্ডে কপি করুন"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "ক্লিপবোর্ডে কপি করা যায় নি"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": " কোনও বাগ উত্থাপন করার সময় / যখন কোনও ডেভেলপার এটির জন্য অনুরোধ করে তখন ক্লিপবোর্ডে তথ্য কপি করে। সংবেদনশীল তথ্য যেমন আপনার ইউজার আইডি, সাদা তালিকাভুক্ত চ্যানেল এবং কাস্টম সার্ভারের ঠিকানা সরানো হয়েছে। তবে এটিতে আপনার ব্যবহারকারীর, ব্রাউজার, অপারেটিং সিস্টেম এবং এক্সটেনশন সংস্করণ নম্বরের মতো তথ্য রয়েছে।"
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "ডিবাগের তথ্য ক্লিপ বোর্ডে কপি করা হয়েছে। আপনি কোনও তথ্য দিতে অনিচ্ছুক হলে তা নির্দ্বিধায় অপসারণ করতে পারেন। এটি একটি টেক্সট ফাইলে সংরক্ষণ করুন বা বাগ প্রতিবেদনে পেস্ট করুন।"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "এই শর্টকাটটি অন্য ক্রিয়ায় আবদ্ধ। দয়া করে একটি আলাদা নির্বাচন করুন।"
|
||||
},
|
||||
"to": {
|
||||
"message": "থেকে",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "স্পন্সর"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "পেইড প্রমোশন, পেইড রেফারেল এবং সরাসরি বিজ্ঞাপন। নিজের পছন্দসই কারণ/স্রষ্টা/ওয়েবসাইট/পণ্যগুলিতে স্ব-প্রচার বা বিনামূল্যে প্রচারের জন্য নয়।"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "বিনা অর্থপ্রাপ্ত/স্ব-প্রচার"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "অবৈতনিক বা স্ব -প্রচার ব্যতীত \"স্পনসর\" এর মতো। এর মধ্যে পণ্যদ্রব্য, অনুদান বা তারা কার সাথে সহযোগিতা করেছে সে সম্পর্কে তথ্য অন্তর্ভুক্ত রয়েছে।"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "এক্সক্লুসিভ অ্যাক্সেস"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "শুধুমাত্র পুরো ভিডিও লেবেল করার জন্য। যখন কোনও ভিডিও কোনও পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে।"
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "এই ভিডিওটি এমন একটি পণ্য, পরিষেবা বা অবস্থান প্রদর্শন করে যা তারা নিখরচায় বা ভর্তুকিযুক্ত অ্যাক্সেস পেয়েছে",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "ইন্টারঅ্যাকশন রেমাইন্ডার (সাবস্ক্রাইব)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "যখন সামগ্রীর মাঝখানে তাদেরকে লাইক, সাবস্ক্রাইব বা ফলো করার জন্য একটি সংক্ষিপ্ত অনুস্মারক থাকে। যদি এটি দীর্ঘ বা নির্দিষ্ট কিছু সম্পর্কে হয় তবে পরিবর্তে এটি স্ব -প্রচারের অধীনে থাকা উচিত।"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "ইন্টারঅ্যাকশন রেমাইন্ডার"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "ইন্টারমিশন/ইন্ট্র অ্যানিমেশন"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "প্রকৃত বিষয়বস্তু ছাড়াই একটি বিরতি। বিরতি, স্থির ফ্রেম, অ্যানিমেশন পুনরাবৃত্তি হতে পারে। এটি তথ্যযুক্ত ট্রানজিশনের জন্য ব্যবহার করা উচিত নয়।"
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "ইন্টারমিশন"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "এন্ডকার্ডস/ক্রেডিট"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "ক্রেডিট বা যখন ইউটিউব এন্ডকার্ডগুলি উপস্থিত হয়। তথ্য সহ সিদ্ধান্তের জন্য নয়।"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "প্রিভিউ/রিক্যাপ"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "পূর্ববর্তী পর্বগুলির দ্রুত পুনরুদ্ধার, বা বর্তমান ভিডিওতে পরে কী ঘটছে তার পূর্বরূপ। একসাথে সম্পাদিত ক্লিপ এর জন্য, কথ্য সংক্ষিপ্তসার এর জন্য নয়।"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "ফিলার ট্যানজেন্ট/জোকস"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "স্পর্শকাতর দৃশ্য যেগুলি কেবল ফিলার বা হাস্যরসের জন্য যুক্ত হয়েছে যা ভিডিওর মূল বিষয়বস্তু বোঝার জন্য প্রয়োজন হয় না। এর মধ্যে প্রসঙ্গ বা পটভূমির বিশদ সরবরাহকারী বিভাগগুলি অন্তর্ভুক্ত করা উচিত নয়।"
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "ফিলার"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "সঙ্গীত: অসঙ্গীত বিভাগ"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "শুধুমাত্র সঙ্গীত ভিডিওতে ব্যবহারের জন্য। এটি কেবলমাত্র সংগীত ভিডিওর সেসব বিভাগের জন্য ব্যবহার করা উচিত যা ইতিমধ্যে অন্য কোনও বিভাগ দ্বারা আচ্ছাদিত নয়।"
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "মিউসিক নয়"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "গুরুত্বপূর্ণ"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "ভিডিওর অংশটি যা বেশিরভাগ লোকেরা খুঁজছেন। \"ভিডিওটি x এ শুরু হয়\" মন্তব্যের মতো।"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "লাইভস্ট্রিম: অনুদান/বার্তা পাঠ"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "বার্তা পাঠ"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "স্বয়ংক্রিয়ভাবে এড়িয়ে যান"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "নিজে এড়িয়ে যান"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "সময় বার এ দেখান"
|
||||
},
|
||||
"disable": {
|
||||
"message": "নিষ্ক্রিয় করুন"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "স্বয়ংক্রিয় ভাবে শুরুতে স্কিপ করুন"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "ভিডিও লোড হলে জিজ্ঞেস করুন"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "সময় বার এ দেখান"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "লেবেল দেখান"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "যখন অ-সংগীত বিভাগ থাকে তখন স্বয়ংক্রিয়ভাবে সমস্ত বিভাগগুলি এড়িয়ে যান"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "স্কিপের পরিবর্তে অডিও নিঃশব্দ এমন বিভাগগুলিকে দেখানোর অনুমতি দিন"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "যখন কোনও ভিডিও সম্পূর্ণ বিজ্ঞাপন হয় তখন একটি আইকন দেখান",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "জমাকৃত নয় এমন অংশের রঙ",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "সময় বারের রঙ"
|
||||
},
|
||||
"category": {
|
||||
"message": "বিভাগ"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "সেগমেন্ট এড়িয়ে যাওয়ার অপশন",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "বিটা টেস্টিং প্রোগ্রামে যোগদান করুন"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "আপনার জমাকৃত অংশ এবং ভোটগুলি মূল সার্ভারের হিসাবে গণনা করা হবে না। কেবল পরীক্ষার জন্য এটি ব্যবহার করুন।"
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "সমস্ত জমাকৃত অংশ এবং ভোট টেস্ট সার্ভারের সাথে সংযোগ করার সময় মূল সার্ভারের হিসাবে গণনা করা হবেনা। আপনি যখন সত্যিকারের অংশ ও ভোট জমা দিতে চান তখন এটি বন্ধ করার বিষয়টি নিশ্চিত করুন।"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(এখন)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "আরো বিভাগ"
|
||||
},
|
||||
"chooseACategory": {
|
||||
"message": "বিভাগ নির্বাচন করুন"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "\"{0}\" বিভাগের অন্তর্ভুক্ত অংশ জমা দিতে, আপনাকে এটি অপশন এ গিয়ে চালু করতে হবে। আপনাকে এখন অপশন এ পাঠানো হবে।",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "সতর্কতা: এই ধরণের বিভাগে একসময়ে সর্বাধিক একবার সক্রিয় থাকতে পারে। একাধিক জমা দেওয়া হলে যেকোন একটি এলোমেলোভাবে বেছে সেটি দেখানো হবে।"
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "আপনাকে প্রত্যেকটি অংশের জন্য কমপক্ষে একটি করে ক্যাটাগরি সিলেক্ট করতে হবে!"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(শেষ)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "লুক্কায়িতঃ ডাউনভোট"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "লুক্কায়িতঃ খুব ছোট"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "নিজে লুক্কায়িত"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "চ্যানেল আইডি এখনও লোড হয় না। আপনি যদি এম্বেডে থাকা ভিডিও দেখছেন তবে পরিবর্তে ইউটিউব হোমপেজটি ব্যবহার করার চেষ্টা করুন। এটি ইউটিউব লেআউটে পরিবর্তনের কারণেও হতে পারে, আপনার যদি মনেহয় এটি লেআউটে পরিবর্তনের কারণে হয়েছে তাহলে এখানে একটি মন্তব্য করুনঃ "
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "দেখে মনে হচ্ছে যে কোনও কিছু স্পনসরব্লকের ভিডিওর ডেটা পাওয়ার ক্ষমতা অবরুদ্ধ করছে। আরও তথ্যের জন্য দয়া করে https://github.com/ajayy/sponsorblock/issues/741 দেখুন।"
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "দেখে মনে হচ্ছে স্পনসরব্লক YouTube API তে পৌঁছাতে অক্ষম। এটি ঠিক করতে, এরপর উপস্থিত হবে সেই অনুমতি প্রম্পটটি গ্রহণ করবেন, তারপর কয়েক সেকেন্ড অপেক্ষা করে পৃষ্ঠাটি পুনরায় লোড করুন।"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "অনুমতি একসেপ্ট করুন"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "অনুমতির অনুরোধ সফল হয়েছে!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "অনুমতির অনুরোধ ব্যর্থ হয়েছে, আপনি কি ডেনাই ক্লিক করেছেন?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "আপনি যদি এটি সমাধান করতে অক্ষম হন তবে সেটিংস এ গিয়ে 'এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন' বন্ধ করুন, কারণ স্পনসরব্লক এই ভিডিওটির জন্য চ্যানেলের তথ্য পুনরুদ্ধার করতে অক্ষম"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "সাধারণত, এটি চ্যানেলটি কী তা জানার আগেই এটি এখনই বিভাগগুলি এড়িয়ে যাবে। সাধারণত, ভিডিওর শুরুতে কিছু বিভাগগুলি সাদা তালিকাভুক্ত চ্যানেলগুলিতে এড়িয়ে যেতে পারে। এই বিকল্পটি সক্ষম করা এটিকে প্রতিরোধ করবে তবে চ্যানেলআইডি পেতে কিছুটা সময় নিতে পারে বলে সমস্ত এড়িয়ে যাওয়া কিছুটা বিলম্বিত করে। আপনার যদি দ্রুত ইন্টারনেট থাকে তবে এই বিলম্বটি অদৃশ্য হতে পারে।"
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "\"এড়িয়ে যাওয়ার আগে চ্যানেল চেক করুন\" সেটিংস টি চালু করার বিষয়টি বিবেচনা করুন"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "সময় ভুল দেওয়া হয়েছে"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "বিভাগ পরিবর্তন করুন"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "এই ভিডিওটি সংগীত হিসাবে শ্রেণীবদ্ধ করা হয়েছে। আপনি কি নিশ্চিত যে এটি একটি স্পনসর আছে? যদি এটি আসলে একটি \"অ-সংগীত বিভাগ\" হয় তবে এক্সটেনশন এর অপশন এ যান এবং এই বিভাগটি চালু করুন। তারপরে, আপনি এই বিভাগটিকে স্পনসর পরিবর্তে \"অ-সংগীত\" হিসাবে জমা দিতে পারেন। আপনি বিভ্রান্ত হলে দয়া করে নিয়মকানুনপড়ুন।"
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "অনেকগুলো অংশ"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "নিয়মকানুন"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "নিয়মকানুন পড়ুন!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "বিভাগ ফিচার এসেছে!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "ইন্ট্রোস, আউট্রোস, মার্চ ইত্যাদি এড়িয়ে যাওয়ার জন্য অপশন খুলুন।"
|
||||
},
|
||||
"help": {
|
||||
"message": "সাহায্য"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "বুঝেছি",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "এই বিভাগটি বিশাল। যদি পুরো ভিডিওটি একটি বিষয় নিয়ে হয় তবে \"Skip\" থেকে \"Full Video\" এ পরিবর্তন করুন। আরও তথ্যের জন্য নিয়মকানুন দেখুন।"
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "এই পুরো ভিডিওটি এই বিভাগ হিসাবে লেবেলযুক্ত এবং পৃথক করা সম্ভব না কারন এটি খুব ঘন ঘন সংযুক্ত করা হয়েছে"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "ভবিষ্যতের সমস্ত পরীক্ষা-নিরীক্ষা পাওয়া থেকে বিরত থাকুন",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "চিরকালের জন্য এই বিষয়বস্তু লুকান"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "আপনি একটি সতর্কতা পেয়েছেন এবং অস্থায়ীভাবে বিভাগগুলি জমা দিতে পারবেন না। এর অর্থ হ'ল আমরা লক্ষ্য করেছি যে আপনি কিছু সাধারণ ভুল করছেন যা দূষিত নয়, দয়া করে কেবল নিশ্চিত করুন যে আপনি নিয়মগুলি বুঝতে পেরেছেন এবং আমরা সতর্কতাটি সরিয়ে দেব। আপনি আমাদের চ্যাটটি discord.gg/SponsorBlock or matrix.to/#/#sponsor:ajay.app ব্যবহার করে যোগ দিতে পারেন"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "একটি সতর্কতার কারণে ভোট প্রত্যাখ্যান করা হয়েছে। এটি সমাধানের জন্য চ্যাট খুলতে ক্লিক করুন বা আপনার এখন সময় না থাকলে পরে আবার ফিরে আসুন।",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "অনুদান"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "অনুদানের মাধ্যমে ভবিষ্যতেে এর উন্নয়নের কাজে সাহায্য হবে"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "অনুদানের লিঙ্ক লুকান"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "অপশন পেজে ডার্ক মোড "
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "স্পনসরব্লক ইনস্টল করার জন্য আপনাকে ধন্যবাদ."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "নীচের অপশনগুলি পর্যালোচনা করুন"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "অনেকগুলি বৈশিষ্ট্য সাধারণত অক্ষম থাকে। আপনি যদি ইন্ট্রোস, আউট্রোস এড়িয়ে যেতে চান, Invidious ইত্যাদি ব্যবহার করতে চান তবে সেগুলি নীচে সক্ষম করুন। আপনি UI উপাদানগুলিও লুকাতে/দেখাতে পারেন।"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "এটি কীভাবে কাজ করে"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "ভিডিও এর অংশ ডাটাবেসে পাওয়া গেলে সেগুলি স্বয়ংক্রিয়ভাবে এড়িয়ে যাবে। তারা কীরকম তা পূর্বরূপ দেখতেআপনি এক্সটেনশন আইকনে ক্লিক করে পপআপটি খুলতে পারেন।"
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "আপনি যখনই কোনও বিভাগ এড়িয়ে যান, আপনি একটা নোটিস পাবেন। সময়টি যদি ভুল বলে মনে হয় তবে ডাউনভোটে ক্লিক করে ভোট দিন! আপনি পপআপ থেকেও ভোট দিতে পারেন।"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "নতুন অংশ জমা দেওয়া"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "জমা দেওয়া যায় পপআপে \"অংশ এখন শুরু হয়\" বোতামটি টিপ মেরে বা প্লেয়ারের বোতামগুলি সহ ভিডিও প্লেয়ারে টিপ মেরে করে।"
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "প্লে বোতামটি ক্লিক করা একটি বিভাগের শুরু নির্দেশ করে এবং স্টপ আইকনটি ক্লিক করা শেষটি নির্দেশ করে। আপনি জমা দেওয়ার আগে একাধিক স্পনসর প্রস্তুত করতে পারেন। আপলোড বোতামটি ক্লিক করা জমা দেওয়া হবে। আবর্জনায় ক্লিক করে বাদ দিতে পারেন এটি।"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "সম্পাদন করা"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "যদি আপনি ভুল করে বসেন তবে আপনি উপড়ের তীর বোতামটি ক্লিক করার পরে আপনার বিভাগগুলি সম্পাদনা বা মুছতে পারেন।"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "গতি অত্যন্ত ধীর।"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "আপনি যদি ব্যবহার করতে চান তাইলে হটকি রয়েছে। স্পনসর বিভাগের শুরু/শেষ নির্দেশ করতে সেমিকোলন কী টিপুন এবং জমা দেওয়ার জন্য অ্যাপোস্ট্রোফে ক্লিক করুন। এগুলি পরিবর্তন করা যেতে পারে। আপনি যদি QWERTY ব্যবহার না করেন তবে আপনার সম্ভবত কীবাইন্ডিং পরিবর্তন করা উচিত।"
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "আমি কি ডাটাবেসের একটি অনুলিপি পেতে পারি? আপনি হারিয়ে গেলে হলে কি হবে?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "ডাটাবেসটি সবার জন্য প্রকাশিত এবং পাওয়া যাবে এখানেঃ "
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "এটির সোর্স কোড অবাধে উপলব্ধ। সুতরাং, যদি আমার কিছু ঘটেও যায় তবে আপনার জমাকৃত অংশগুলি হারিয়ে যাবে না।"
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "খবর এবং এটি কীভাবে তৈরি হয়"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "আমি সোর্স কোডটি কোথায় পেতে পারি?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "কৃতিত্ব"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "আরও জানুন"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "ডাউনভোট করে আপনার জন্য পুনরায় জমা দেওয়ার জন্য একটি স্থানীয় অনুলিপি তৈরি করে"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "এই বিভাগের উইকি পাতা খুলুন."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "কপি এবং ডাউনভোট"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "ভোট করা চালিয়ে যান"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "এটি তাৎক্ষনিকভাবে আপনার অংশে দেওয়া হবে"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "ডাউনভোট"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "আপভোট"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "অংশ আড়াল করুন"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "দ্রুত সময়টি পরিবর্কতন করতে সম্পাদনা বাক্সে ঘুরে দেখার সময় আপনার মাউস এর হুইয়িলটি ব্যবহার করুন। কন্ট্রল বা শিফট কী এর সংমিশ্রণগুলি পরিবর্তনগুলি আরো নিখুতভাবে টিউন করতে ব্যবহার করা যেতে পারে।"
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "নতুন! দেখুন যখন কোনও ভিডিও সম্পূর্ণ স্পনসর করা বা স্ব-প্রচার হয়"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": " দিন",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": " ঘণ্টা",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "আচরণ",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "ইন্টারফেস",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "কীবোর্ড শর্টকাট",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "ব্যাকআপ এবং পুনঃস্থাপন",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "বিবিধ",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"noticeVisibilityLabel": {
|
||||
"message": "নোটিশ প্রদর্শন করা বন্ধ করুন",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "বাদ দিন",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "নির্ধারণ করা হয়নি"
|
||||
},
|
||||
"change": {
|
||||
"message": "বদল করুন"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "এটি একটি অন্তর্নির্মিত ইউটিউব শর্টকাট। আপনি কি নিশ্চিত যে আপনি এটি ব্যবহার করতে চান?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "বেটা সার্ভার চালু করা হয়েছে!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "বিকল্প পাতা খুলুন"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
"message": "Deixa de silenciar"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pausat"
|
||||
"message": "En pausa"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "S'ha aturat el temporitzador"
|
||||
@@ -222,5 +222,8 @@
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Això hauria de romandre privat: és semblant a una contrasenya i no s'hauria de compartir amb cap persona. Si algú hi té accés, poden suplantar-vos. Si esteu cercant el vostre identificador d'usuari públic, premeu la icona del portanotes a la finestra."
|
||||
},
|
||||
"help": {
|
||||
"message": "Ajuda"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopírovat veřejné uživatelské ID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Zkopírovat ID segmentu"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Připojte se k oficiálnímu Discord serveru k podání návrhů a zpětné vazby!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Zobrazit upozornění po přeskočení segmentu"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Zobrazit nápovědu ke kategorii"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Oznámení o přeskočení v plné velikosti"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "do",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Zahrnout přechody segmentů"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Hraje, jako kdyby nebylo nic přeskočeno"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponzor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Placená propagace, placená doporučení a přímé reklamy. Nezahrnuje sebepropagaci nebo shout-outy uživatelů/tvůrců/webů/produktů, které se tvůrcovi líbí."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Placené propagace"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Není pro dary nebo vlastní merch"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Neplacená / vlastní propagace"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Podobně jako \"sponzor\" s výjimkou neplacených nebo propagačních akcí. Zahrnuje sekce o zboží, dary nebo informace o tom, s kým spolupracují."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Dary, členství a vlastní merch"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Bezplatné propagace, které nepřidávají nic k videu"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Není pro podnikové produkty a merch"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exkluzivní přístup"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "V tomto videu je zobrazován produkt, služba nebo místo, které autor obdržel zdarma nebo s bezplatným přístupem",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Celé video zobrazuje místo, kam autor obdržel bezplatný nebo dotovaný přístup"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Připomenutí interakce (odběr)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Při krátké připomínce dát like, odběr nebo sledování tvůrce uprostřed obsahu. Pokud je segment dlouhý nebo zahrnuje něco specifického, mělo by být místo toho zařazeno do vlastní propagace."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Krátká připomenutí pro lajknutí, odebírání či sledování"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Zahrnuje nepřímé připomenutí komentování"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Není pro obecnou propagaci, pouze výzvy k akci"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Připomenutí interakce"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Přestávka"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Část bez skutečného obsahu"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Není pro přechody s informacemi"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Koncové karty / titulky"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Titulky nebo když se objeví konečné karty YouTube. Není pro závěry s informacemi."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Nezahrnuje obsah, i když jsou na obrazovce závěrečné karty"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Náhled / shrnutí"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Rychlé shrnutí předchozích epizod nebo náhled toho, co se objeví v aktuálním videu. Myšleno pro upravené sloučené klipy, ne pro mluvená shrnutí."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Klipy které se objeví později nebo v budoucím videu"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Shrnutí předchozího videa"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Není pro sekce, které přidávají další obsah"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Výplň / vtipy"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Výplň"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Tangenciální scény pouze pro výplň nebo humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Rozptýlení, nepovedené scénky, opakování"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Není pro scény vyžadované k pochopení tématu"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Hudba: nehudební sekce"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Jiné než hudba"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Sekce, které nejsou v oficiálních vydáních"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Nehudební sekce na živém vystoupení"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Zvýraznění"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Část videa, kterou hledá většina lidí. Podobné komentářům typu \"Video začíná v x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Sekce, kterou hledá většina lidí"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Může pomoci přeskočit předchozí kontext"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Může přeskočit k názvu nebo náhledu"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Čtení donatů / zpráv"
|
||||
},
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Zjistit více"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Úplné podrobnosti"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Zahlasuje proti a vytvoří pro vás lokální kopii pro opětovné odeslání"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Toto bude okamžitě platit pro vaše segmenty"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Hlas proti"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Hlas pro"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Skrýt segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Použijte kolečko myši při přechodu přes editační okno pro rychlou úpravu času. Kombinace kláves Ctrl nebo Shift mohou být použity k doladění změn."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Toto je vestavěná zkratka YouTube. Opravdu ji chcete použít?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA server je povolen!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Otevřít stránku s možnostmi"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Obnovit nastavení na výchozí hodnoty"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Opravdu chcete obnovit všechna nastavení na jejich výchozí hodnoty? Tato akce je nevratná."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopier Offentligt Bruger-ID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Kopier Segment-Id"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Kom til den officielle Discord-server for at give forslag og feedback!"
|
||||
},
|
||||
@@ -209,6 +212,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktiver Optælling Af Antal Spring Over I Private-/Inkognitovinduer"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Gem segment nedstemmer"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Ethvert segment, du nedstemmer vil forblive skjult selv efter genindlæsning"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Advarsel: Deaktivering af dette vil slette alle tidligere gemte nedstemmer"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Forespørg Efter Hashpræfiks"
|
||||
},
|
||||
@@ -582,6 +594,9 @@
|
||||
"category_preview_description": {
|
||||
"message": "Hurtig opsummering af tidligere episoder eller en forsmag på, hvad der kommer senere i den aktuelle video. Er beregnet til sammenklippede klip, ikke til talte resuméer."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Fyldningstangent/Jokes"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Tangential scener kun tilføjet for fyldstof eller humor, som ikke er nødvendige for at forstå videoens hovedindhold. Dette bør ikke omfatte segmenter, der gtiver kontekst eller bagrundsoplysninger."
|
||||
},
|
||||
@@ -689,11 +704,14 @@
|
||||
"message": "(Slut)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "skjult: downvote"
|
||||
"message": "skjult: nedstem"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "skjult: for kort"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "manuelt skjult"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "Kanal-ID er ikke indlæst endnu. Hvis du bruger en integreret video, så prøv i stedet at bruge YouTube-hjemmesiden. Dette kunne også være forårsaget af ændringer i YouTube-layout. Hvis du mener det, så lav en kommentar her:"
|
||||
@@ -780,6 +798,9 @@
|
||||
"Donate": {
|
||||
"message": "Doner"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Hjælp til at finansiere udvikling"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Skjul Donationslink"
|
||||
},
|
||||
@@ -802,7 +823,7 @@
|
||||
"message": "Videosegmenter vil automatisk blive sprunget over, hvis de findes i databasen. Du kan åbne popup-vinduet ved at klikke på ikonet for udvidelsen for at få et eksempel på, hvad de er."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på downvote! Du kan også stemme i popup-vinduet."
|
||||
"message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på nedstem! Du kan også stemme i popup-vinduet."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Indsendelse"
|
||||
@@ -811,7 +832,7 @@
|
||||
"message": "Indsendelse kan enten ske i popup-vinduet ved at trykke på \"Segment Begynder Nu\"-knappen eller i videoafspilleren med knapperne på afspilleren."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Ved at klikke på play-knappen vises starten af et segment, og ved at klikke på stop-ikonet vises slutningen. Du kan forberede flere sponsorer, før du trykker på Send. Hvis du klikker på upload-knappen, sendes det. Hvis du klikker på skraldespanden, slettes den."
|
||||
"message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Redigering"
|
||||
@@ -861,6 +882,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Dette vil øjeblikkeligt gælde for dine indsendelser"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Downvote"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Upvote"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Skjul segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Brug musehjulet, mens du holder musen over redigeringsfeltet for hurtigt at justere tiden. Kombinationer af ctrl eller shift-tastenerne kan bruges til at finjustere ændringerne."
|
||||
},
|
||||
@@ -911,5 +941,11 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dette er en indbygget Youtube-genvej. Er du sikker på, at du vil bruge den?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA Server er aktiveret!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Åbn indstillinger"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Öffentliche Benutzer-ID kopieren"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Segment-ID kopieren"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Tritt dem offiziellen Discord-Server bei und teile Anregungen und Feedback!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Zeige Pop-up nach dem Überspringen eines Segments"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Zeige Kategorien-Hilfe"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Skip-Meldung in voller größe"
|
||||
},
|
||||
@@ -300,7 +306,7 @@
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Der Server scheint überlastet zu sein. Probiere es in ein paar Sekunden erneut."
|
||||
"message": "Der Server ist wahrescheinlich überlastet. Probiere es später nochmal."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Fehlermeldung: "
|
||||
@@ -312,7 +318,7 @@
|
||||
"message": "Ton aus"
|
||||
},
|
||||
"full": {
|
||||
"message": "Vollständiges Video",
|
||||
"message": "Ganzes Video",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "bis",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Fließende Übergänge einbeziehen"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Spielt, als ob nichts übersprungen worden wäre"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Gesponserte Videosegmente"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Bezahlte Werbung, bezahlte Empfehlungen und direkte Werbung, nicht für Eigenwerbung, kostenlose Fremdwerbung oder Empfehlungen für Anlässe/Personen/Webseiten/Produkte."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Bezahlte Werbeaktionen"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Nicht für Spenden oder eigenen Merch"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Unbezahlt/Eigenwerbung"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Ähnlich wie bei \"gesponserte Videosegmente\", mit Ausnahme von unbezahlten oder Selbstpromotionen. Dies beinhaltet Merchandising (Fan-Artikel), Spenden oder Informationen darüber, mit wem für das Video zusammengearbeitet wurde."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Spenden, Mitgliedschaften und eigener Merch"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Kostenlose Erwähnungen welche nicht zum Video beitragen"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Nicht für Produkte und Merch von Firmen"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exklusiver Zugriff"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Dieses Video präsentiert ein Produkt, eine Dienstleistung oder einen Ort, zu welchem sie freien oder subventionierten Zugriff erhalten haben",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Das gesamte Video zeigt etwas, zu dem man kostenlosen oder subventionierten Zugang erhalten hat"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaktions-Erinnerungen (Abonnieren, etc.)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Wenn es im Video eine kurze Erinnerung gibt, den Kanal zu abonnieren oder das Video mit \"Mag ich\" zu markieren."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Kurze Erinnerungen zum Liken, Abonnieren oder Folgen"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Enthält indirekte Erinnerungen zum Kommentieren"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Nicht für allgemeine Förderung, nur Aufruf zum Handeln"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Interaktions-Erinnerung"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Unterbrechung"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Intervall ohne tatsächlichen Inhalt"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Nicht für Übergänge mit Informationen"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Endkarten/Quellen/Anerkennungen"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credits oder wenn die YouTube-Endkarten erscheinen. Nicht für videobeendende Schlussfolgerungen mit Informationen."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Enthalten keinen Inhalt, selbst wenn Endcards zu sehen sind"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Vorschau/Zusammenfassung"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Kurze Zusammenfassung bisheriger Videos oder eine Vorschau auf das aktuelle Video. Für zusammengeschnittene Clips gedacht, jedoch nicht für mündliche Zusammenfassungen."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Clips welche später oder in einem zukünftigen Video erscheinen"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Recap eines vorherigen Videos"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Nicht für Bereiche, welche zusätzliche Inhalte geben"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Füller/Witze"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Füller"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Tangentielle Szenen nur für Füller oder Humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Ablenkungen, Patzer, Replays"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Nicht für Szenen, welche zum verstehen des Topics sind"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musikvideoteile ohne Musik"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Musikvideoteile ohne Musik"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Bereiche nicht in offiziellen Veröffentlichungen"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Nicht-Musik in einer Live-Performance"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Highlight"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Der Teil des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Bereiche die die meisten Personen suchen"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Kann helfen, vergangene Inhalte zu überspringen"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Kann zum Titel oder Thumbnail überspringen"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "In Livestreams Spenden/Nachrichten vorlesen"
|
||||
},
|
||||
@@ -829,7 +910,7 @@
|
||||
"message": "Das übermitteln kann entweder im Popup durch das drücken vom \"Segment Started Jetzt\" Knopf oder im Videoplayer mit den Knöpfen im Player gemacht werden."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Mit einem Klick auf den Play-Knopf wird der Beginn eines Segments und mit dem klick auf den Stop-Knopf das ende eines Segments markiert. Du kannst mehrere Sponsoren vorbereiten, bevor du auf Absenden klickst. Das klicken des Upload-Knopfes wird die Segmente übermitteln. Das klicken des Mülleimers löscht es."
|
||||
"message": "Mit einem Klick auf den Play-Button wird der Beginn eines Segments markiert, und mit einem Klick auf den Stop-Button dessen Ende. Du kannst mehrere Segmente anlegen, bevor du durch Klicken des Upload-Buttons zum Einreichen fortfährst. Ein Klick auf die Mülltonne löscht deine angelegten Segmente."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Bearbeitung"
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Erfahre mehr"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Vollständige Details"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Downvotet, und erstellt eine lokale Kopie zum erneuten Einreichen"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Dies wirkt sich sofort auf eigene Segmente aus"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Negativ bewertet"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Positiv bewerten"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Segment verbergen"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Benutze das Mausrad während der Mauszeiger über dem Eingabefeld schwebt um die Zeit schnell anzupassen. Benutze Strg bzw. Shift für gröbere/genauere Änderungen."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dies ist ein vorhandenes YouTube-Kürzel. Bist du sicher, dass du es verwenden möchtest?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA Server wurde aktiviert!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Einstellungen öffnen"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Einstellungen zurücksetzen"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Sind Sie sicher, dass Sie alle Einstellungen auf ihre Standardwerte zurücksetzen wollen? Dies kann nicht rückgängig gemacht werden."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -162,7 +162,10 @@
|
||||
"message": "Ορισμός ονόματος χρήστη"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Αντιγραφή δημόσιου αναγνωριστικού"
|
||||
"message": "Αντιγραφή δημόσιου αναγνωριστικού χρήστη"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Αντιγραφή ταυτότητας τμήματος"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Μπείτε στον επίσημο διακομιστή μας στο Discord για ανατροφοδότηση και προτάσεις!"
|
||||
@@ -183,7 +186,7 @@
|
||||
"message": "Αυτό αποκρύπτει τα κουμπιά που εμφανίζονται στο πρόγραμμα αναπαραγωγής YouTube ώστε να υποβάλετε τμήματα προς παράλειψη."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Διατήρηση του κουμπιού παράλειψης προς την καλύτερη στιγμή στο πρόγραμμα αναπαραγωγής"
|
||||
"message": "Διατήρηση του κουμπιού παράλειψης προς το κυριότερο περιεχόμενο του βίντεο στην οθόνη αναπαραγωγής"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Εμφάνιση κουμπιού «πληροφορίες» στο πρόγραμμα αναπαραγωγής YouTube"
|
||||
@@ -209,6 +212,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Ενεργοποίηση του μετρητή παραλείψεων σε καρτέλες Ιδιωτικής/Ανώνυμης περιήγησης"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Αποθήκευση καταψηφίσεων τμημάτων"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Όποια τμήματα καταψηφίζετε θα παραμένουν κρυμμένα ακόμα και μετά από ανανέωση της σελίδας"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Προειδοποίηση: Η απενεργοποίηση αυτής της επιλογής θα διαγράψει όλες τις προηγούμενες αποθηκευμένες καταψηφίσεις"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Αιτήματα μέσω προθέματος Hash"
|
||||
},
|
||||
@@ -227,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Εμφάνιση ειδοποιήσεων μετά την παράλειψη κάθε τμήματος"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Εμφάνιση βοήθειας κατηγοριών"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Ειδοποιήσεις παράλειψης πλήρους μεγέθους"
|
||||
},
|
||||
@@ -262,6 +277,21 @@
|
||||
"message": "Εάν δεν σας αρέσουν, πατήστε το κουμπί «Να μην ξαναεμφανιστεί».",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Παράλειψη τμήματος",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Έναρξη/Τέλος τμήματος",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Υποβολή Τμημάτων",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Επιλέξτε ένα πλήκτρο πατώντας το και επιλέξτε όποιο πρόσθετο πλήκτρο ελέγχου επιθυμείτε."
|
||||
},
|
||||
"0": {
|
||||
"message": "Λήξη χρονικού ορίου σύνδεσης. Παρακαλώ ελέγξτε ότι η σύνδεσή σας με το διαδίκτυο λειτουργεί, αλλιώς ο διακομιστής μπορεί να υπερφορτώθηκε ή να έπεσε."
|
||||
},
|
||||
@@ -282,14 +312,21 @@
|
||||
"message": "Κωδικός σφάλματος: "
|
||||
},
|
||||
"skip": {
|
||||
"message": "Παράκαμψη"
|
||||
"message": "Παράλειψη"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Σίγαση"
|
||||
},
|
||||
"full": {
|
||||
"message": "Όλο το βίντεο",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Παράλειψη {0};"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Σίγαση {0};"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Παράλειψη προς το σημείο «{0}»;",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
@@ -298,15 +335,19 @@
|
||||
"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": "Απενεργοποίηση Αυτόματης Παράληψης"
|
||||
"message": "Απενεργοποίηση Αυτόματης Παράλειψης"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Ενεργοποίηση Αυτόματης Παράληψης"
|
||||
"message": "Ενεργοποίηση Αυτόματης Παράλειψης"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Ηχητική ειδοποίηση κατά την παράληψη"
|
||||
@@ -315,7 +356,7 @@
|
||||
"message": "Οι ειδοποιήσεις μετά την παράλειψη κάθε τμήματος θα αναπαράγουν ήχο. Εάν είναι ανενεργή αυτή η επιλογή εκτός αν η αυτόματη παράλειψη είναι ανενεργή."
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "Εμφάνιση χρόνου συμπεριλαμβάνοντας τις παραλήψεις"
|
||||
"message": "Εμφάνιση χρόνου συμπεριλαμβάνοντας τις παραλείψεις"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Αυτός ο χρόνος εμφανίζεται σε παρενθέσεις δίπλα από τον τρέχων χρόνο που είναι κάτω από την μπάρα χρόνου. Αυτό δείχνει την συνολική διάρκεια του βίντεο πλην οποιουδήποτε τμήματος. Αυτό περιλαμβάνει και τα τμήματα που εμφανίζονται μόνο στην μπάρα χρόνου."
|
||||
@@ -349,6 +390,9 @@
|
||||
"changeUserID": {
|
||||
"message": "Εισαγωγή/Εξαγωγή της Ταυτότητας Χρήστη σας"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Κρατείστε το μυστικό. Αυτό είναι σαν ένα κωδικό πρόσβασης όπου δε θα έπρεπε να μοιράζεστε με κανένα. Εάν το αποκτήσει κάποιος, μπορεί να σας υποδυθεί. Εάν ψάχνετε για τη δημόσια ταυτότητα χρήστη σας, πατήστε πάνω στο αναδυόμενο εικονίδιο πρόχειρου."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Ορισμός Ταυτότητας Χρήστη"
|
||||
},
|
||||
@@ -369,7 +413,7 @@
|
||||
"message": "Υποστηριζόμενες Ιστοσελίδες: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Ενεργοποίηση υποστήριξης «Invidious», απενεργοποίηση αυτόματης παράληψης, απόκρυψη κουμπιών και άλλα."
|
||||
"message": "Ενεργοποίηση υποστήριξης «Invidious», απενεργοποίηση αυτόματης παράλειψης, απόκρυψη κουμπιών και άλλα."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Προσθήκη 3ου πελάτη συνεδρίας"
|
||||
@@ -407,6 +451,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Η ακόλουθη υποβολή είναι μικρότερη από την επιλεγμένη ελάχιστη διάρκεια. Αυτό θα μπορούσε να σημαίνει ότι αυτό το τμήμα έχει ήδη υποβληθεί, και απλά αγνοείται λόγω αυτής της επιλογής. Είστε σίγουροι ότι θα θέλατε να το υποβάλετε;"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Η υποβολή σε μια ζωντανή μετάδοση σε εξέλιξη ή σε μια πρεμιέρα δεν επιτρέπεται. Παρακαλώ περιμένετε μέχρι να τελειώσει, στην συνέχεια ανανεώστε την σελίδα και επαληθεύστε ότι τα τμήματα είναι έγκυρα."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Εμφάνιση κουμπιού υποβολής"
|
||||
},
|
||||
@@ -434,6 +481,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Εισαγωγή/Εξαγωγή όλων των ρυθμίσεων"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Επεξεργασία/αντιγραφή"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Αποθήκευση σε αρχείο"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Φόρτωση από αρχείο"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Αυτές είναι όλες σας οι ρυθμίσεις σε αρχείο JSON. Αυτό περιλαμβάνει και την Ταυτότητα Χρήστη, οπότε μοιραστείτε το με προσοχή."
|
||||
},
|
||||
@@ -482,28 +538,74 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Οι πληροφορίες εντοπισμού σφαλμάτων έχουν αντιγραφεί στο πρόχειρο. Μη διστάσετε να αφαιρέσετε οποιαδήποτε πληροφορία που προτιμάτε να μη μοιραστείτε. Αποθηκεύστε τες σε ένα αρχείο κειμένου ή επικολλήστε στην αναφορά σφάλματός σας."
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "Αυτό το πλήκτρο έχει οριστεί ως συντόμευση για άλλη ενέργεια. Παρακαλώ επιλέξτε ένα άλλο πλήκτρο."
|
||||
},
|
||||
"to": {
|
||||
"message": "έως",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Συμπερίληψη τμημάτων μεταβάσεων"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Ροή περιεχομένου σαν να μην υπήρξε ποτέ παράλειψη"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Χορηγία"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Προώθηση επί πληρωμή, παραπομπές επί πληρωμή και άμεσες διαφημίσεις. Όχι, για προσωπική προώθηση ή δωρεάν αναφορές σε δημιουργούς/ιστοσελίδες/προϊόντα που τους αρέσουν."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Προώθηση επί πληρωμή"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Όχι για δωρεές ή προσαρμοσμένα προϊόντα"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Αφιλοκέρδεια/Προσωπική Προώθηση"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Παρόμοιο με τη «χορηγία» αλλά για μη κερδοσκοπικό σκοπό ή για προσωπική προώθηση. Αυτό συμπεριλαμβάνει τμήματα από εμπορεύματα, δωρεές, ή πληροφορίες σχετικές με το ποιους συνεργάστηκαν."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Δωρεές, συνδρομές και προσαρμοσμένα προϊόντα"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Δωρεάν αναφορές που δεν προστίθενται στο βίντεο"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Όχι για προϊόντα ή ρουχισμό που έχει κατασκευαστεί από αλυσίδες επιχειρήσεων"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Αποκλειστική Πρόσβαση"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Μόνο για χαρακτηρισμό ολοκλήρου του βίντεο. Χρησιμοποιείται όταν ένα βίντεο παρουσιάζει ένα προϊόν, υπηρεσία, ή τοποθεσία αποκλειστικής ή δωρεάν πρόσβασής τους."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Αυτό το βίντεο παρουσιάζει ένα προϊόν, υπηρεσία, ή τοποθεσία αποκλειστικής ή δωρεάν πρόσβασής τους",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Ολόκληρο το βίντεο παρουσιάζει κάτι με δωρεάν ή επιδοτούμενη πρόσβαση"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Υπενθύμιση Αλληλεπίδρασης (Εγγραφή)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Όταν υπάρχει μια σύντομη υπενθύμιση για να προσθέσετε το βίντεο στα βίντεο που σας αρέσουν, να εγγραφείτε ή να τους ακολουθήσετε στη μέση του περιεχομένου. Εάν διαρκεί για αρκετή ώρα, τότε αυτό περιλαμβάνεται στη κατηγορία «προσωπική προώθηση»."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Σύντομες υπενθυμίσεις εγγραφής, μου αρέσει και ακολούθησης"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Περιλαμβάνει έμμεσες υπενθυμίσεις για σχόλια"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Όχι για γενικότερες προωθήσεις, μόνο για εκκλήσεις βοήθειας"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Υπενθύμιση Αλληλεπίδρασης"
|
||||
},
|
||||
@@ -516,18 +618,54 @@
|
||||
"category_intro_short": {
|
||||
"message": "Διάλειμμα"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Χρονικό διάστημα χωρίς ουσιαστικό περιεχόμενο"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Όχι για μεταβάσεις που συμπεριλαμβάνουν πληροφορίες"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Προτεινόμενα βίντεο καναλιών/Εύσημα"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Όταν εμφανίζονται τα εύσημα ή τα προτεινόμενα βίντεο των καναλιών. Όχι, για επίλογους που περιέχουν πληροφορίες."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Μη συμπερίληψη περιεχομένου, ακόμα και αν τα προτεινόμενα βίντεο βρίσκονται στην οθόνη"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Προεπισκόπηση/Αναθεώρηση"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Γρήγορη ανακεφαλαίωση προηγουμένων επεισοδίων, ή προεπισκόπηση του τι ακολουθεί στο τρέχων βίντεο. Εννοώντας επεξεργασία μερικών κλιπ μαζί, όχι για προφορικές περιγραφές."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Κλιπ που εμφανίζονται μετά, ή σε μελλοντικά βίντεο"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Ανακεφαλαίωση προηγούμενου βίντεο"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Όχι για μέρη που περιλαμβάνουν πρόσθετο περιεχόμενο"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Σπατάλη Χρόνου/Περιττό σχόλιο"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Σκηνές εκτός θέματος προστίθενται μόνο για σπατάλη χρόνου και περιττά σχόλια τα οποία δεν απαιτούνται για να κατανοήσετε το κύριο περιεχόμενο του βίντεο. Δεν πρέπει να περιλαμβάνονται τμήματα που συμβάλουν στην κατανόηση του θέματος του βίντεο ή επιπλέον πληροφορίες."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Περιττό"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Άσχετες σκηνές μόνο για σπατάλη χρόνου ή περιττά σχόλια"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Αποσπάσεις, επαναλήψεις, αποτυχημένες λήψεις"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Όχι για σκηνές που απαιτούνται για την κατανόηση του θέματος"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Μουσική: Τμήμα χωρίς μουσική"
|
||||
},
|
||||
@@ -537,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Χωρίς Μουσική"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Μέρη τα οποία δεν έχουν κυκλοφορήσει επίσημα"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Χωρίς μουσική σε ζωντανή συναυλία"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Καλύτερη στιγμή"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Το κομμάτι του βίντεο που ψάχνουν να δουν οι περισσότεροι άνθρωποι. Παρόμοιο με το «Το βίντεο ξεκινάει από το x σημείο» στα σχόλια."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Το μέρος που ψάχνουν οι περισσότεροι"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Ίσως παραλειφθεί κάτι που συμβάλει στην κατανόηση"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Παράλειψη προς το περιεχόμενο όπου παρουσιάζεται στον τίτλο ή το εικονίδιο"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Ζωντανή μετάδοση: Δωρεές/Ανάγνωση Μηνυμάτων από δωρεές"
|
||||
},
|
||||
@@ -550,10 +703,10 @@
|
||||
"message": "Ανάγνωση Μηνυμάτων"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Αυτόματη Παράληψη"
|
||||
"message": "Αυτόματη Παράλειψη"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Χειροκίνητη Παράληψη"
|
||||
"message": "Χειροκίνητη Παράλειψη"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Εμφάνιση στην μπάρα χρόνου"
|
||||
@@ -570,9 +723,19 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Εμφάνιση στην μπάρα χρόνου"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Εμφάνιση Ετικέτας"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Αυτόματη παράλειψη όλων των τμημάτων όταν είναι «Χωρίς μουσική»"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Επιτρέψτε τμήματα που κάνουν σίγαση αντί για παράλειψη"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "Εμφάνιση εικονιδίου όταν όλο το βίντεο είναι διαφημιστικό εξολοκλήρου",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Χρώμα Μη Υποβληθέντων",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -609,6 +772,9 @@
|
||||
"message": "Για να υποβάλετε τμήματα της «{0}» κατηγορίας, πρέπει να την ενεργοποιήσετε στις ρυθμίσεις. Θα μεταφερθείτε στις ρυθμίσεις τώρα.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Προσοχή: Αυτός ο τύπος τμήματος μπορεί να υπάρξει μόνο μια φορά. Εάν υποβάλετε πολλαπλά τότε εμφανίζεται ένα από τα τμήματα στην τύχη."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Πρέπει να επιλέξετε Κατηγορία για όλα τα τμήματα που υποβάλετε!"
|
||||
},
|
||||
@@ -621,6 +787,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "κρυφό: πολύ κοντό"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "χειροκίνητη απόκρυψη"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "Η ταυτότητα καναλιού δεν έχει φορτώσει ακόμα. Εάν χρησιμοποιείτε ενσωματωμένο βίντεο, δοκιμάστε αντιθέτως να το ανοίξετε στο YouTube. Μπορεί επίσης να ευθύνονται αλλαγές στη διάταξη του YouTube, εάν το πιστεύετε, γράψτε ένα σχόλιο εδώ:"
|
||||
@@ -655,6 +824,9 @@
|
||||
"downvoteDescription": {
|
||||
"message": "Λάθος Συγχρονισμός"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Αλλαγή κατηγορίας"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Αυτό το βίντεο έχει κατηγοριοποιηθεί ως μουσική. Είσαστε σίγουροι ότι έχει χορηγία; Εάν είναι ένα τμήμα «Χωρίς μουσική», ανοίξτε τις επιλογές της επέκτασης και ενεργοποιήστε αυτήν την κατηγορία. Μετά μπορείτε, να υποβάλετε αυτό το τμήμα ως «Χωρίς μουσική», αντί για χορηγία. Παρακαλώ διαβάστε τις οδηγίες, εάν είστε μπερδεμένοι."
|
||||
},
|
||||
@@ -681,6 +853,12 @@
|
||||
"message": "Το' χω",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Αυτό το τμήμα είναι μεγάλο. Αν όλο το βίντεο έχει να κάνει με ένα θέμα, τότε αλλάξτε την επιλογή από \"Παράλειψη\" σε \"Όλο το βίντεο\". Δείτε τις οδηγίες για περισσότερες πληροφορίες."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Ολόκληρο το βίντεο έχει χαρακτηριστεί ως αυτής της κατηγορίας οπότε είναι αυστηρά ενσωματωμένη ώστε να μπορείτε να το διαφοροποιήσετε σε τμήματα"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Αποχή από μελλοντικά πειράματα",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
@@ -688,6 +866,9 @@
|
||||
"hideForever": {
|
||||
"message": "Απόκρυψη για πάντα"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Λάβατε προειδοποίηση οπότε δεν μπορείτε να υποβάλετε τμήματα προσωρινά. Αυτό σημαίνει ότι παρατηρήσαμε ότι κάνατε κάποια λάθη των πρωτάριδων και όχι κάτι ύποπτο, παρακαλώ επιβεβαιώστε ότι κατανοείτε τους κανόνες και θα σας αφαιρέσουμε την προειδοποίηση. Μπορείτε και να μας στείλετε μήνυμα στο discord.gg/SponsorBlock ή στο matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Η ψήφος απορρίφθηκε λόγο μιας προειδοποίησης. Πατήστε για να ανοίξετε μια συνομιλία ώστε να το διορθώσετε, ή επιστρέψτε όταν έχετε περισσότερο χρόνο.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
@@ -695,9 +876,15 @@
|
||||
"Donate": {
|
||||
"message": "Δωρεά"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Χρηματική βοήθεια για την ανάπτυξή μας"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Απόκρυψη Συνδέσμου Δωρεάς"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Σκουρόχρωμη Λειτουργία στη σελίδα Ρυθμίσεις"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Ευχαριστούμε που εγκαταστήσατε το SponsorBlock."
|
||||
},
|
||||
@@ -715,5 +902,137 @@
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Κάθε φορά που παραλείπετε κάποιο τμήμα, θα λαμβάνετε ειδοποίηση. Εάν ο συγχρονισμός σας φαίνεται λάθος, ψηφίστε αρνητικά πατώντας το εικονίδιο! Μπορείτε επίσης να ψηφίσετε μέσω του αναδυόμενου παράθυρου."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Υποβολή"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Η υποβολή μπορεί είτε να γίνει στο αναδυόμενο παράθυρο πατώντας το κουμπί «Το τμήμα ξεκινάει εδώ» είτε στα κουμπιά κάτω από την μπάρα χρόνου κατά την αναπαραγωγή βίντεο."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Πατώντας το κουμπί αναπαραγωγής δείχνετε την αρχή του τμήματος και πατώντας το κουμπί της διακοπής δείχνετε το τέλος του τμήματος. Μπορείτε να ετοιμάσετε πολλαπλά τμήματα χορηγιών πρώτου πατήσετε υποβολή. Πατώντας το κουμπί της αποστολής τα τμήματα υποβάλλονται, ενώ πατώντας το εικονίδιο του κάδου απορριμάτων τα διαγραφεί."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Επεξεργασία"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Αν κάνατε κάτι λάθος, μπορείτε να διορθώσετε ή να διαγράψετε τα τμήματα σας πατώντας το εικονίδιο πάνω βελάκι."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Το να υποβάλεις τμήματα παίρνει χρόνο, υπάρχει ποιο γρήγορος τρόπος;"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Συντομεύσεις που μπορείτε να χρησιμοποιήσετε εάν το επιθυμείτε. Πατήστε την αγγλική άνω τελεία «;» για να δείξετε την αρχή/το τέλος ενός τμήματος χορηγίας και πατήστε την απόστροφο για υποβολή. Αυτές οι συντομεύσεις αλλάζουν στις ρυθμίσεις. Εάν δεν χρησιμοποιείτε το σύστημα πληκτρολόγησης «QWERTY», θα ήταν καλύτερο τα τις αλλάξετε."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Μπορώ να λάβω ένα αντίγραφο της βάσης δεδομένων; Τι θα συμβεί αν η επέκταση εξαφανιστεί;"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Η βάση δεδομένων είναι δημόσια διαθέσιμη στη σελίδα"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Ο πηγαίος κώδικας είναι δημόσια διαθέσιμος. Έτσι ώστε, ακόμα και αν συμβεί κάτι σε εμάς, οι υποβολές σας δε θα χαθούν."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Νέα και πως δημιουργήθηκε η επέκταση"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Πού μπορώ να βρω τον πηγαίο κώδικα;"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Εύσημα"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Μάθετε περισσότερα"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Πλήρεις Λεπτομέρειες"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Καταψήφιση και δημιουργία τοπικού αντίγραφου για επανάληψη υποβολής"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Άνοιγμα σελίδας wiki της κατηγορίας."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Αντίγραφο και καταψήφιση"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Συνεχίστε την ψηφοφορία"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Αυτό θα εφαρμοστεί απευθείας στα τμήματά σας"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Αρνητική ψήφος"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Θετική ψήφος"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Απόκρυψη τμήματος"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Χρήση της ροδέλας ποντικιού καθώς είναι πάνω από το παράθυρο επεξεργασίας για να αλλάξετε γρηγορότερα τον χρόνο. Συνδυασμοί όπως το ctrl ή το shift χρησιμοποιούνται για να τελειοποιήσετε τις αλλαγές."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Νέο! Δείτε ποτέ ένα βίντεο αποτελείται εξολοκλήρου από προσωπικές προωθήσεις ή χορηγίες"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "ημ",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "ω",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Συμπεριφορά παραλ.",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "Διεπαφή",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "Συντομεύσεις πλήκτρων",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "Αντίγραφο/Επαναφορά",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Διάφορα",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"noticeVisibilityLabel": {
|
||||
"message": "Εμφάνιση ειδοποίησης παράλειψης",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Αφαίρεση",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Δεν έχει οριστεί"
|
||||
},
|
||||
"change": {
|
||||
"message": "Αλλαγή"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Αυτή η συντόμευση χρησιμοποιείται από το YouTube. Σίγουρα θέλετε να την χρησιμοποιήσετε;"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Ο Δοκιμαστικός Διακομιστής είναι ενεργός!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Άνοιγμα σελίδας ρυθμίσεων"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Επαναφορά των προκαθορισμένων ρυθμίσεων"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Είστε βέβαιοι ότι θέλετε να επαναφέρετε όλες τις ρυθμίσεις στις προεπιλεγμένες τιμές τους; Αυτό δεν μπορεί να αναιρεθεί."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
"message": "It seems the server is down. Contact the dev immediately."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "A connection error has occured. Error code: "
|
||||
"message": "A connection error has occurred. Error code: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Clear Segments"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Copy Public UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Copy Segment ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Come join the official discord server to give suggestions and feedback!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Show Notice After A Segment Is Skipped"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Show Category Help"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Full Size Skip Notices"
|
||||
},
|
||||
@@ -353,7 +359,7 @@
|
||||
"message": "Show Time With Skips Removed"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "This time appears in brackets next to the current time on below the seekbar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seekbar\"."
|
||||
"message": "This time appears in brackets next to the current time on below the Seek Bar. This shows the total video duration minus any segments. This includes segments marked as only \"Show In Seek Bar\"."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "You've skipped "
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "to",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Include segue transitions"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Plays as if nothing was skipped"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Paid promotion, paid referrals and direct advertisements. Not for self-promotion or free shoutouts to causes/creators/websites/products they like."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Paid promotions"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Not for donations or custom merch"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Unpaid/Self Promotion"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar to \"sponsor\" except for unpaid or self promotion. This includes sections about merchandise, donations, or information about who they collaborated with."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Donations, memberships and custom merch"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Free shoutouts that don't add to the video"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Not for corporate designed products and merch"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exclusive Access"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "This video showcases a product, service or location that they've received free or subsidized access to",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Entire video showcases something with free or subsidized access"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaction Reminder (Subscribe)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "When there is a short reminder to like, subscribe or follow them in the middle of content. If it is long or about something specific, it should be under self promotion instead."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Short reminders to like, subscribe or follow"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Includes indirect reminders to comment"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Not for general promotion, only calls to action"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Interaction Reminder"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Intermission"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Interval without actual content"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Not for transitions with information"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Endcards/Credits"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credits or when the YouTube endcards appear. Not for conclusions with information."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Don't include content, even if endcards are on screen"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Preview/Recap"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Quick recap of previous episodes, or a preview of what's coming up later in the current video. Meant for edited together clips, not for spoken summaries."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Clips that appear later, or in a future video"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Recap of a previous video"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Not for sections that add additional content"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Filler Tangent/Jokes"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Filler"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Tangential scenes only for filler or humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Distractions, bloopers, replays"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Not for scenes required to understand the topic"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Music: Non-Music Section"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Music"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Sections not in official releases"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Non-music in a live performance"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Highlight"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "The part of the video that most people are looking for. Similar to \"Video starts at x\" comments."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Section most people are looking for"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Can skip context"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Can skip to the title or thumbnail"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Donation/Message Readings"
|
||||
},
|
||||
@@ -863,6 +944,9 @@
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Learn More"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Full Details"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Downvotes and creates a local copy for you to resubmit"
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "This will instantly apply to your segments"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Downvote"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Upvote"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Hide segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Use your mousewheel while hovering over the edit box to quickly adjust the time. Combinations of the ctrl or shift key can be used to fine tune the changes."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "This is a built-in YouTube shortcut. Are you sure you want to use it?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA Server is enabled!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Open options page"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Reset settings to default"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Are you sure you want to reset all settings to their default values? This cannot be undone."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"message": "Esto ya ha sido enviado antes"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Canal Permitido!"
|
||||
"message": "¡Canal Permitido!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmento"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Copiar el ID de usuario público"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Copiar ID de Segmento"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "¡Únete al servidor oficial de discord para darnos sugerencias y comentarios!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar aviso después de que se omita un segmento"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Mostrar Ayuda de la Categoría"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Avisos de Omisión de Tamaño Completo"
|
||||
},
|
||||
@@ -539,11 +545,23 @@
|
||||
"message": "a",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Incluye transiciones entre segmentos"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Se reproduce como si no se hubiera omitido nada"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o anuncios gratuitos a causas/creadores/sitios web/productos que les gusten."
|
||||
"message": "Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o agradecimientos gratuitos a causas/creadores/sitios web/productos que les gusten."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Promociones pagadas"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "No para donaciones o mercancía personalizada"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Promoción Propia/No Remunerada"
|
||||
@@ -551,6 +569,15 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar a \"sponsor\", excepto que para la promoción propia o no remunerada. Esto incluye secciones sobre mercancía, donaciones o información sobre con quiénes colaboraron."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Donaciones, membresías y mercancía personalizada"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Agradecimientos gratuitos que no contribuyen al video"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "No para productos ni mercancía diseñados por empresas"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Acceso Exclusivo"
|
||||
},
|
||||
@@ -561,14 +588,26 @@
|
||||
"message": "Este video exhibe un producto, servicio o ubicación al que han recibido acceso gratuito o subsidiado",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Todo el video muestra algo con acceso gratuito o subsidiado"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Recordatorio de interacción (subscribir)"
|
||||
"message": "Recordatorio de Interacción (Suscribir)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Cuando hay un breve recordatorio para dar like, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo autopromoción en su lugar."
|
||||
"message": "Cuando hay un breve recordatorio para dar me gusta, suscribirse o seguirlos en medio del contenido. Si es largo o sobre algo específico, debería estar bajo promoción propia en su lugar."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Breve recordatorio para dar me gusta, suscribirse o seguir"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Incluye recordatorios indirectos para comentar"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "No para promoción general, solo llamadas a la acción"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Recordatorio de interacción"
|
||||
"message": "Recordatorio de Interacción"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Intermisión/Animación de Introducción"
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Intermisión"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Intervalo sin contenido real"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "No para transiciones con información"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Tarjetas/Créditos"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Créditos o cuando aparecen las tarjetas finales de YouTube. No para conclusiones con información."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "No incluyas contenido, aun si las tarjetas finales están en pantalla"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Vista previa/Recapitulación"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Recapitulación rápida de los episodios anteriores, o una vista previa de lo que va a ocurrir más adelante en el vídeo actual. Está pensado para clips editados juntos, no para resúmenes hablados."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Clips que aparecen más tarde o en un video futuro"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Recapitulación de un video anterior"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "No para secciones que añaden contenido adicional"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Tangentes de Relleno/Chistes"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Relleno"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Escenas tangenciales solo de relleno o humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Distracciones, bloopers, repeticiones"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "No para escenas requeridas para entender el tema"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Música: Sección sin musica"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Sin Música"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Secciones que no están en versiones oficiales"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Secciones sin música en un espectáculo en vivo"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Destacado"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "La parte del video que la mayoría de gente está buscando. Similar a los comentarios que dicen \"El video comienza en x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "La sección que la mayoría de personas están buscando"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Puede omitir contexto"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Puede saltar al título o miniatura"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Directo: Lecturas de donaciones y mensajes"
|
||||
},
|
||||
@@ -732,13 +813,13 @@
|
||||
"message": "Si no puede resolverlo, desactive la opción \"Forzar Comprobación de Canal antes de Saltar\", ya que SponsorBlock no puede recuperar la información del canal de este video"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Comprobación forzada del canal antes de saltarse"
|
||||
"message": "Forzar Comprobación de Canal antes de Saltar"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Por defecto, se saltará los segmentos inmediatamente antes de saber cuál es el canal. Por defecto, algunos segmentos al principio del vídeo pueden ser salteados en los canales de la lista blanca. Al activar esta opción se evitará esto, pero haciendo que todos los saltos tengan un ligero retraso, ya que obtener el ID del canal puede llevar algún tiempo. Este retraso podría ser imperceptible si tienes una Internet rápida."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Considere la posibilidad de activar \"Comprobación del canal de fuerza antes de saltar\""
|
||||
"message": "Considere la posibilidad de activar \"Forzar Comprobación de Canal antes de Saltar\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Tiempo incorrecto/equivocado"
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Aprenda Más"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Detalles Completos"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Vota negativamente y crea una copia local para que la puedas volver a enviar"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Esto se aplicará instantáneamente a tus segmentos"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Voto negativo"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Voto positivo"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Ocultar segmento"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Utilice la rueda del ratón mientras pasa el cursor por encima del cuadro de edición para ajustar el tiempo. Se pueden utilizar combinaciones de la tecla ctrl o shift para afinar los cambios."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Este un atajo incorporado de YouTube. ¿Estás seguro de que quieres usarlo?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "¡El servidor BETA está activado!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Abrir página de opciones"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Restablecer los ajustes por defecto"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "¿Estás seguro de que quieres restablecer todos los ajustes a sus valores por defecto? Esto no se puede deshacer."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopeeri avalik UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Kopeeri segmendi ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Tule liitu ametliku Discordi serveriga, et anda soovitusi ja tagasisidet!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Kuva segmendi vahelejätmisel teatis"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Kuva kategooria abi"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Täissuuruses vahelejätmise teavitused"
|
||||
},
|
||||
@@ -530,18 +536,39 @@
|
||||
"message": "kuni",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Kasuta sujuvaid üleminekuid"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Mängib nii, nagu midagi poleks vahele jäetud"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Tasulised promod, tasulised viited ja otsesed reklaamid. Pole mõeldud enesepromo või tasuta petitsioonide/autorite/veebilehtede/toodete mainimiste puhul."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Tasulised kampaaniad"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Mitte annetuste ja oma loodud kauba jaoks"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Tasumata/enesepromo"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Sarnaneb \"sponsorile\", ent on mõeldud tasumata või enesepromo jaoks. Selle alla kuuluvad jaotised oma müüdava kauba, annetuste ja koostööpartnerite kohta."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Annetused, liikmesused ja oma loodud kaup"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Tasuta mainimised, mis ei ole video sisuks olulised"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Mitte ettevõtete disainitud toodete ja kauba jaoks"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Eksklusiivne ligipääs"
|
||||
},
|
||||
@@ -552,12 +579,24 @@
|
||||
"message": "See video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Kogu video kuvab midagi tasuta või toetusega ligipääsuga"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Tegutsemise meeldetuletus (kanali tellimine)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Lühike sisukeskne meeldetuletus anda videole meeldib, tellida kanalit või jälgida autorit. Kui see on pikk või millegi kindlaga seotud, peaks see olema enesepromo all."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Lühikesed meeldetuletused vajutada \"meeldib\", \"telli\" või \"jälgi\""
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Sisaldab mitteotseseid meeldetuletusi kommenteerimiseks"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Mitte üldise promo jaoks, vaid üleskutsed tegevustele"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Tegutsemise meeldetuletus"
|
||||
},
|
||||
@@ -570,18 +609,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Vaheaeg"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Intervall ilma tegeliku sisuta"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Mitte informatsiooniga üleminekute jaoks"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Lõpukaardid/-tiitrid"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Tiitrid või YouTube'i lõpukaardid. Pole mõeldud informatsiooniga järelduste jaoks."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Ära kaasa sisu, isegi kui lõputiitrid on ekraanil"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Eelvaade/kokkuvõte"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Kiire kokkuvõte eelmistest episoodidest või eelvaade videos hiljem tulevast. Mõeldud valmis töödeldud klippide, mitte suuliste kokkuvõtete jaoks."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Klipid, mida kuvatakse hiljem või tulevases videos"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Eelmise video kokkuvõte"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Mitte jaotistele, mis lisavad täiendavat sisu"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Täitesisu/naljad"
|
||||
},
|
||||
@@ -591,6 +648,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Täide"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Sisuga mitteseonduvad täite- või huumoristseenid"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Tähelepanu hajutajad, saatevead, kordused"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Mitte stseenid, mida on teema mõistmiseks vaja vaadata"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muusika: mitte-muusika jaotis"
|
||||
},
|
||||
@@ -600,12 +666,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Mitte-muusika"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Jaotised, mida avalikes väljalasetes pole"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Mitte-muusika kontserdil"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Esiletõst"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Video osa, mida enamus inimesed otsivad. Sarnaneb kommentaaridele stiilis \"video algab ajal x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Jaotis, mida inimesed enim otsivad"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Aitab konteksti vahele jätta"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Aitab pealkirja või pisipildi sisuni viia"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Otseülekanne: annetuste ja sõnumite lugemine"
|
||||
},
|
||||
@@ -831,6 +912,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Lisateave"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Täielikud üksikasjad"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Annab vastuhääle ja loob kohaliku koopia, mida saad uuesti saata"
|
||||
},
|
||||
@@ -846,9 +930,21 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "See rakendub sinu segmentidele koheselt"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Vastuhääl"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Poolthääl"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Peida segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Kiireks aja reguleerimiseks keri hiirega muutmiskasti kohal. Täpsemaks reguleerimiseks hoia kerimise ajal all Ctrl või Shift klahvi."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Uus! Näe, kui video on täielikult sponsoreeritud või enesepromo"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "p",
|
||||
"description": "100d"
|
||||
@@ -890,5 +986,20 @@
|
||||
},
|
||||
"change": {
|
||||
"message": "Muuda"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "See on YouTube'i sisseehitatud otsetee. Kas soovid kindlasti seda kasutada?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BEETAserver on lubatud!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Ava valikute leht"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Lähtesta sätted vaikeväärtustele"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Kas soovid kindlasti kõik sätted vaikeväärtustele lähtestada? Seda ei saa tagasi võtta."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"message": "Älä näytä koskaan"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Paina 'älä ohita' palatakasesi kohtaan, jossa olit."
|
||||
"message": "Paina 'älä ohita' palataksesi kohtaan, jossa olit."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Älä ohita"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopio julkinen UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Kopioi osion ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Liity viralliselle Discord-palvelimelle antaaksesi ehdotuksia ja palautetta!"
|
||||
},
|
||||
@@ -177,7 +180,7 @@
|
||||
"message": "Näytä painikkeet YouTuben soittimessa"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Piilota painikkeet YouTuben soittimesta"
|
||||
"message": "Piilota painikkeet YouTuben soittimessa"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
|
||||
@@ -195,7 +198,7 @@
|
||||
"message": "Piilota info-painike automaattisesti"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Piilota poista-painike YouTuben soittimesta"
|
||||
"message": "Piilota poista-painike YouTuben soittimessa"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Näytä poista-painike YouTuben soittimessa"
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Näytä ilmoitus ohitetun osion jälkeen"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Näytä kategorian ohje"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Täysikokoiset ohitusilmoitukset"
|
||||
},
|
||||
@@ -539,11 +545,23 @@
|
||||
"message": "-",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Sisällytä siirtymät osioon"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Video toistuu ikään kuin mitään ei olisi ohitettu"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsori"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai huikkauksille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."
|
||||
"message": "Maksettu mainostus, maksetut viittaukset ja suorat mainokset. Ei itsensä mainostukselle tai ilmaisille maininnoille kampanjoista/luojista/nettisivuista/tuotteista, joista he pitävät."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Maksetut mainostukset"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Ei lahjoituksille tai omalle kauppatavaralle"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Maksamaton/Itsensä mainostus"
|
||||
@@ -551,6 +569,15 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Samankaltainen \"sponsorin\" kanssa, mutta maksamattomalle tai itsensä mainostukselle. Tämä sisältää osioita kauppatavarasta, lahjoituksista tai tietoa siitä, kenen kanssa he ovat tehneet yhteistyötä."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Lahjoitukset, jäsenyydet ja oma kauppatavara"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Ilmaiset maininnat, jotka eivät tuo videolle lisäarvoa"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Ei yritysten luomille tuotteille tai kauppatavaralle"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Yksinoikeudellinen ensikatsaus"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Tämä video esittelee tuotteen, palvelun tai sijainnin, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Koko video esittelee jotakin, jonka käyttöoikeus on saatu veloituksetta tai tuetusti"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Vuorovaikutusmuistutus (tilaaminen)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Lyhyt muistutus tykätä, tilata tai seurata sisällön keskellä. Jos se on pitkä tai koskee jotain tiettyä asiaa, tulisi se merkitä mielummin itsensä mainostamiseksi."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Lyhyet muistutukset tykätä, tilata tai seurata"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Sisältää epäsuorat muistutukset kommenttien jättämisestä"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Ei yleiselle mainostukselle, vain toimintapyynnöille"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Vuorovaikutusmuistutus"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Tauko"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Tauko ilman varsinaista sisältöä"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Ei tietoa sisältäville siirtymille"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Loppukortit/-tekstit"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille joissa on tietoa."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Älä sisällytä sisältöä, vaikka loppukortit olisivatkin näytöllä"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Esikatselu/Kertaus"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Nopea kertaus aiemmista jaksoista, tai esikatselu siitä, mitä on tulossa myöhemmin nykyisessä videossa. Tarkoitettu yhteen editoituja klippejä varten, ei puhutuille yhteenvedoille."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Myöhemmin tai tulevassa videossa ilmestyvät klipit"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Kertaus edellisestä videosta"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Ei osioille, jotka lisäävät uutta sisältöä"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Epäolennainen täytesisältö/Vitsit"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Täytesisältö"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Täytteeksi tai huumoriksi lisätyt toissijaiset kohtaukset"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Häiriöt, blooperit, uusinnat"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Ei aiheen ymmärtämiseen tarvittavia kohtauksia varten"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musiikki: Musiikiton osa"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Musiikiton"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Osat, jotka eivät ole virallisissa julkaisuissa"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Musiikittomat kohdat live-esityksissä"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Kohokohta"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Kohta videossa, mitä suurin osa ihmisistä etsivät.\nSamankaltainen \"Video alkaa kohdassa x\" kommenttien kanssa."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Kohta mitä useimmat ihmiset etsivät"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Voi ohittaa kontekstin"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Voi ohittaa otsikon tai pikkukuvan viittaamaan kohtaan"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: lahjoitusten/viestien lukeminen"
|
||||
},
|
||||
@@ -776,7 +857,7 @@
|
||||
"message": "Tämä osio on suuri. Jos koko video koskee yhtä aihetta, vaihda \"Ohita\" valintaan \"Koko video\". Katso lisätietoja säännöistä."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Koko video on merkitty tällä luokituksella ja se on liian tiiviisti integroitu eroteltavaksi"
|
||||
"message": "Koko video on merkitty tällä kategorialla ja on erotettavaksi liian tiiviisti integroitu"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Jättäydy pois kaikista tulevista kokeiluista",
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Opi lisää"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Täydet tiedot"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Äänestää alas ja luo paikallisen kopion, jonka voit lähettää uudelleen"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Tämä vaikuttaa sinun osioihin välittömästi"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Äänestä alas"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Äänestä ylös"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Piilota osio"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Käytä hiiren rullaa samalla kun osoitin on muokkauslaatikon päällä säätääksesi aikaa nopeasti. Ctrl- tai Shift-näppäimen yhdistelmiä voi käyttää muutoksien hienosäätelyyn."
|
||||
},
|
||||
@@ -918,7 +1011,7 @@
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Poista valinta",
|
||||
"message": "Poista kytkös",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Tämä on YouTuben sisäänrakennettu pikanäppäin. Haluatko varmasti käyttää sitä?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA-palvelin on käytössä!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Avaa asetussivu"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Palauta oletusasetukset"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Haluatko varmasti palauttaa kaikki asetukset oletusarvoihin? Tätä ei voi perua."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1,118 @@
|
||||
{}
|
||||
{
|
||||
"fullName": {
|
||||
"message": "SponsorBlock para YouTube - I-skip ang mga Sponsorships",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "I-skip ang mga sponsorships, subscription begging at marami pa sa mga YouTube videos. I-report ang mga sponsor sa videos na napapanood mo upang makatipid sa oras ng iba.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"429": {
|
||||
"message": "Masyadong kang maraming beses na nagsumite ng sponsor times para sa video na ito, sigurado ka na marami yan?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Naisumite na ito noon"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Whitelisted na ang channel na ito!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segment"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segments"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "I-upvote ang submission na ito"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "I-report"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "I-report ang submission na ito bilang mali."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "I-dismiss"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Loading..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Hindi ipakita"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Pindutin ang \"unskip\" para bumalik ka sa iyong dating posisyon sa video."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "I-unskip"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "I-reskip"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "I-unmute"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Naka-pause na"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Tigilan ang timer"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Para sa pag-edit o tanggalin ng mga individual values, pindutin ang info button o ang extension icon sa kanang sulok sa itaas."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Sigurado ka bang gusto mong tanggalin ito?"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "May error na nagkaroon sa pagsusumite sa iyong sponsor times, subukang muli mamaya."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "May mga segments sa database para sa video na ito!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Walang nakitang segment"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Simula ang Segment Ngayon"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Nagtatapos ang Segment Ngayon"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Kanselahin ang Paggawa ng Segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Walang YouTube video na nakita.\nKung mali ito, i-refresh ang tab mo."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "I-refresh ang mga segments"
|
||||
},
|
||||
"success": {
|
||||
"message": "Tagumpay na!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Bumoto na!"
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Nagkaroon ng error sa koneksyon. Error code: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "I-clear ang mga segments"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "I-buksan ang SponsorBlock popup"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Isara ang Popup"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "I-submit ang mga segments"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Sigurado ka bang gusto mong isumite ito?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "I-whitelist itong channel"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
"message": "Annuler la création de segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet si il est censé y en avoir une."
|
||||
"message": "Aucune vidéo YouTube trouvée.\nActualisez l'onglet s'il s'agit d'une erreur."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Rafraîchir les segments"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Copier l'ID utilisateur"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Copier l'identifiant du segment"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Rejoignez le serveur Discord officiel pour toutes suggestions ou remarques!"
|
||||
},
|
||||
@@ -549,7 +552,7 @@
|
||||
"message": "Non rémunéré/autopromotion"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Semblable au \"sponsor\", excepté pour la promotion non rémunérée ou l'auto-promotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs."
|
||||
"message": "Semblable aux \"messages commerciaux\", excepté pour la promotion non rémunérée ou l'autopromotion. Cela inclut les marchandises, les dons et les informations sur leurs collaborateurs."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Accès exclusif"
|
||||
@@ -829,7 +832,7 @@
|
||||
"message": "La soumission peut être effectuée dans le popup en appuyant sur le bouton \"le segment commence maintenant\" ou dans le lecteur vidéo avec les boutons du lecteur."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Cliquer sur le bouton de lecture indique le début d'un segment et cliquer sur l'icône d'arrêt indique la fin. Vous pouvez préparer plusieurs sponsors avant d'appuyer sur Soumettre. Cliquer sur le bouton de soumission enverra le segment. Cliquer sur le poubelle supprimera vos segments."
|
||||
"message": "Cliquer sur le bouton de lecture indique le début d'un segment et cliquer sur l'icône d'arrêt indique sa fin. Vous pouvez préparer plusieurs messages commerciaux avant d'appuyer sur Soumettre. Cliquer sur le bouton Téléverser soumettra vos segments. Cliquer sur la poubelle supprimera vos segments."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Édition en cours"
|
||||
@@ -879,6 +882,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Cela s'appliquera instantanément à vos segments"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Voter contre"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Voter pour"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Cacher le segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches ctrl ou maj peuvent être utilisées pour affiner les modifications."
|
||||
},
|
||||
@@ -929,5 +941,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Il s'agit d'un raccourci intégré à YouTube. Êtes-vous sûr de vouloir l'utiliser ?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Le serveur BETA est actif !"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Ouvrir la page d'options"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Rétablir les paramètres par défaut"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Êtes-vous sûr de vouloir rétablir tous les paramètres ? Cette action ne peut pas être annulée."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "דלג קדימה"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "ביטול השתקה"
|
||||
},
|
||||
"paused": {
|
||||
"message": "מושהה"
|
||||
},
|
||||
@@ -79,9 +82,15 @@
|
||||
"sponsorEnd": {
|
||||
"message": "מקטע נגמר עכשיו"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "ביטול יצירת מקטע"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "רענן מקטעים"
|
||||
},
|
||||
"success": {
|
||||
"message": "הצלחה!"
|
||||
},
|
||||
@@ -137,21 +146,63 @@
|
||||
"popupHint": {
|
||||
"message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "נקה זמנים"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "הגש זמנים"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "זה משומש בעמוד הסטטים הפומביים כדי להראות כמה תרמת. צפה בזה"
|
||||
},
|
||||
"Username": {
|
||||
"message": "שם משתמש"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "הגדר שם משתמש"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "העתק קוד משתמש פומבי"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "הצטרף לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "הסתר"
|
||||
},
|
||||
"Options": {
|
||||
"message": "אפשרויות"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "הראה כפתורים על הנגן של יוטיוב"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "הסתר כפתורים על הנגן של יוטיוב"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "השאר את כפתור הדילוג לשיא הסרטון על הנגן באופן קבוע"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "הראה כפתור מידע בנגן YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "החבא כפתור מידע בנגן YouTube"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "הסתר אוטומטית כפתורי אינפורמציה"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "הסתר כפתור מחיקה על הנגן של יוטיוב"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "הצג כפתור מחיקה על הנגן של יוטיוב"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "הפיצ'ר הזה עוקב אחרי מקטעים שדילגת עליהם בכדי ליידע משתמשים אחרים כמה ההגשות שלך עזרו לאחרים ושומשו כמטריקה יחד עם ההצבעות בעד בכדי להבטיח שלא ייכנס ספאם אל תוך המערכת. ההרחבה שולחת הודעה לשרת בכל פעם שאתה מדלג על מקטע. התקווה היא שרוב האנשים לא ישנו את ההגדרה הזו כדי שהמספרי צפייה יהיו מדוייקים :)"
|
||||
},
|
||||
"website": {
|
||||
"message": "אתר",
|
||||
"description": "Used on Firefox Store Page"
|
||||
@@ -163,6 +214,15 @@
|
||||
"errorCode": {
|
||||
"message": "קוד שגיאה: "
|
||||
},
|
||||
"skip": {
|
||||
"message": "דלג"
|
||||
},
|
||||
"mute": {
|
||||
"message": "השתק"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "השתק {0}?"
|
||||
},
|
||||
"minLower": {
|
||||
"message": "דקה"
|
||||
},
|
||||
@@ -186,10 +246,225 @@
|
||||
"createdBy": {
|
||||
"message": "נוצר על ידי"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "אתרים נתמכים: "
|
||||
},
|
||||
"add": {
|
||||
"message": "הוסף"
|
||||
},
|
||||
"save": {
|
||||
"message": "שמור"
|
||||
},
|
||||
"reset": {
|
||||
"message": "אתחל"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "ערוך/העתק"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "שמור לקובץ"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "טען מקובץ"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "הגדר אפשרויות"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "הגש מקטע"
|
||||
},
|
||||
"submit": {
|
||||
"message": "הגש"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "ביטול"
|
||||
},
|
||||
"delete": {
|
||||
"message": "מחק"
|
||||
},
|
||||
"preview": {
|
||||
"message": "תצוגה מקדימה"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "לא מוגש"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "סקור"
|
||||
},
|
||||
"edit": {
|
||||
"message": "עריכה"
|
||||
},
|
||||
"to": {
|
||||
"message": "עד ל",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "נותן חסות"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "גישה אקסקלוסיבית"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "מוזיקה: קטעים ללא מוזיקה"
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "ללא מוזיקה"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "קטע חשוב"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "דילוג אוטומטי"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "דלג ידנית"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "הראה בטיימליין"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "הראה בטיימליין"
|
||||
},
|
||||
"category": {
|
||||
"message": "קטגוריה"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "אפשרות דילוג",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(עכשיו)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "עוד קטגוריות"
|
||||
},
|
||||
"chooseACategory": {
|
||||
"message": "בחר קטגוריה"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(סוף)"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "זמן שגוי/לא נכון"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "שנה קטגוריה"
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "מספר מקטעים"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "הנחיות"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "קראו את ההנחיות!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "קטגוריות נמצאות כאן!"
|
||||
},
|
||||
"help": {
|
||||
"message": "עזרה"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "הבנתי",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "לא מעוניין להשתתף בניסויים עתידיים",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "הסתר לעד"
|
||||
},
|
||||
"Donate": {
|
||||
"message": "תרום"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "עזרו לממן את הפיתוח"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "הסתר כפתור תרומה"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "תודה שהתקנת את ספונסרבלוק."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "אנא סקור את האפשרויות הבאות"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "כיצד דילוג עובד"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "שולח"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "עריכה"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "הקצב איטי מדי"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "קוד המקור זמין באופן חופשי ובחינם. אז, אפילו אם משהו יקרה לי, המקטעים שהגשתם לא יאבדו."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "חדשות וכיצד זה נעשה"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "היכן אוכל להשיג את קוד המקור?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "קרדיטים"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "למידע נוסף"
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "העתק ועשה דיסלייק"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "המשך להצביע"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "זה מיידית ישפיע על כל המקטעים שלך"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "ימים",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "שעות",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "התנהגות",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "ממשק",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "קיצורי מקלדת",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "גיבוי/שחזור",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"notSet": {
|
||||
"message": "לא הוגדר"
|
||||
},
|
||||
"change": {
|
||||
"message": "שנה"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopiraj javni UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Kopiraj ID odsječka"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Pridružite nam se u službenoj Discord zajednici i pošaljite svoje prijedloge i povrate informacije!"
|
||||
},
|
||||
@@ -214,6 +217,21 @@
|
||||
"message": "Izvorni kod",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Preskoči odsječak",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Pokreni/prekini odsječak",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Pošalji odsječke",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Odaberi tipku upisom tipke i odaberi modifikatorske tipke koje želiš koristiti."
|
||||
},
|
||||
"0": {
|
||||
"message": "Veza istekla. Provjerite svoju internetski vezu. Ako vaš internet radi, poslužitelj je vjerojatno preopterećen ili nedostupan."
|
||||
},
|
||||
@@ -236,6 +254,13 @@
|
||||
"skip": {
|
||||
"message": "Preskoči"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Isključi zvuk"
|
||||
},
|
||||
"full": {
|
||||
"message": "Cijeli video",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Preskočiti {0}?"
|
||||
},
|
||||
@@ -246,6 +271,14 @@
|
||||
"message": "Preskočiti na {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Preskočeno: {0}",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "Isključen zvuk: {0}",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Preskočeno na {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
@@ -256,6 +289,12 @@
|
||||
"enableAutoSkip": {
|
||||
"message": "Aktiviraj automatsko preskakanje"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Zvučna obavijest pri preskakanju"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Zvučna obavijest o preskakanju reproducirat će zvuk kad god se odsječak preskoči. Ako je deaktivirano (ili je automatsko preskakanje deaktivirano), zvuk se neće reproducirati."
|
||||
},
|
||||
"minLower": {
|
||||
"message": "min"
|
||||
},
|
||||
@@ -271,6 +310,9 @@
|
||||
"statusReminder": {
|
||||
"message": "Provjerite status.sponsor.ajay.app za status poslužitelja."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Uvezi/Izvezi svoj korisnički ID"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Postavi UserID"
|
||||
},
|
||||
@@ -313,6 +355,9 @@
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Obavijest o preskakanju ostat će na zaslonu barem ovoliko dugo. Za ručno preskakanje može biti duže vidljivo."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Prikaži gumb za prijenos"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresa SponsorBlock poslužitelja"
|
||||
},
|
||||
@@ -322,9 +367,21 @@
|
||||
"reset": {
|
||||
"message": "Resetiraj"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "Sada se podržava m.youtube.com"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Uvezi/Izvezi sve postavke"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Uredi/kopiraj"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Spremi u datoteku"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Učitaj iz datoteke"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Postavi opcije"
|
||||
},
|
||||
@@ -371,6 +428,12 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Slično kao „sponzor”, osim za neplaćenu promociju i samopromociju. To uključuje odlomke marketinga, donacija ili informacija o tome, s kim su surađivali."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Eksluzivni pristup"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Samo za označavanje cijelih videa. Koristi se kad video prikazuje proizvod, uslugu ili lokaciju za koje su dobili besplatan ili subvencionirani pristup."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Podsjetnik interakcije (Pretplati se)"
|
||||
},
|
||||
@@ -419,6 +482,18 @@
|
||||
"manualSkip": {
|
||||
"message": "Ručno preskakanje"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Deaktiviraj"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Automatski skoči na početak"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Pitaj kad se učitava video"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Prikaži oznaku"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Dopustite isječke koji isključuju zvuk umjesto da ga preskaču"
|
||||
},
|
||||
@@ -436,6 +511,9 @@
|
||||
"enableTestingServer": {
|
||||
"message": "Omogućite poslužitelj za beta testiranje"
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Svi podnesci i glasovi NEĆE BROJATI u glavnom poslužitelju dok se povezuješ s testnim poslužiteljem. Obavezno deaktiviraj ovo kada želiš slati podneske."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(sada)"
|
||||
},
|
||||
@@ -446,7 +524,7 @@
|
||||
"message": "Odaberi kategoriju"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Da biste poslali segmente s kategorijom \"{0}\", morate je omogućiti u postavkama. Sada ćete biti preusmjereni na postavke.",
|
||||
"message": "Za slanje odsječaka kategorije „{0}”, moraš je aktivirati u postavkama. Sada ćemo te preusmjeriti na postavke.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
@@ -455,6 +533,9 @@
|
||||
"bracketEnd": {
|
||||
"message": "(kraj)"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "ručno skriveno"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Neispravno/krivo vrijeme"
|
||||
},
|
||||
@@ -480,12 +561,28 @@
|
||||
"categoryUpdate2": {
|
||||
"message": "Otvori opcije za preskakanje uvoda, kraja, proizvoda itd."
|
||||
},
|
||||
"help": {
|
||||
"message": "Pomoć"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Razumijem",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Ovaj cijeli video označen je kao ova kategorija i previše je integriran da bi se mogao odvojiti"
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Sakrij zauvijek"
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Doniraj"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Hvala na instaliranju SponsorBlocka."
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Mnoge funkcije su standardno deaktivirane. Ako želiš preskočiti uvode, završne dijelove, koristiti Invidious, itd., aktiviraj ih niže dolje. Također možeš sakriti/prikazati elemente korisničkog sučelja."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Slanje"
|
||||
},
|
||||
@@ -518,5 +615,61 @@
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Ovo će se odmah primijeniti na vaše isječke"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Sakri odsječak"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Ponašanje",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "Sučelje",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "Tipkovni prečaci",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "Sigurnosna kopija/Obnova",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Razno",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"noticeVisibilityLabel": {
|
||||
"message": "Izgled napomene preskakanja",
|
||||
"description": "Option label"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Nije postavljeno"
|
||||
},
|
||||
"change": {
|
||||
"message": "Promijeni"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Ovo je ugrađeni YouTube prečac. Stvarno ga želiš koristiti?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA poslužitelj je aktiviran!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Otvori stranicu opcija"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Vrati standardne postavke"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Stvarno želiš vratiti sve postavke na standardne vrijednosti? To je nepovratna radnja."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Nyilvános UserID másolása"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Szegmens ID másolása"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Gyere, csatlakozz a hivatalos discord szerverhez, hogy javaslatokat és visszajelzést adhass!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Jelezzen, ha egy szegmens át lett ugorva"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Kategória útmutató megjelenítése"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Teljes méretű átugrási értesítők"
|
||||
},
|
||||
@@ -539,11 +545,23 @@
|
||||
"message": "–",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Tartalmazza a felkonferálást/átvezetőket is"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Olyan a lejátszás, mintha semmi sem lett volna átugorva"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Szponzor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Fizetett promóció, vagy közvetlen reklám. Nem önpromóció vagy ingyenes ajánlat (shoutout) emberekről/termékekről/weboldalakról amik tetszenek nekik."
|
||||
"message": "Fizetett promóció, vagy közvetlen reklám. Nem önpromóció, vagy ingyenes említése ügyeknek/tartalomkészítőknek/weboldalaknak/termékeknek amik tetszenek nekik."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Fizetett promóciók"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Nem adományok vagy saját termékek"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Nem fizetett/önpromóció"
|
||||
@@ -551,6 +569,15 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Hasonló a szponzorhoz, de nem fizetett, vagy önpromóció. Beletartozik a saját ruhaáru, adományok, vagy infó arról, hogy kivel működtek együtt."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Adományok, tagságok és saját termékek"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Ingyenes köszönetnyilvánítások/említések, amik nem adnak hozzá a videóhoz"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Nem cégek által tervezett termékekhez"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exkluzív hozzáférés"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Ez a videó olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "A teljes videó olyan dolgot mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Emlékeztető (Feliratkozás)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Egy rövid emlékeztető arról, hogy likeoljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Rövid emlékeztető lájkolásra, feliratkozásra, vagy követésre"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Beletartoznak a közvetett emlékeztetők kommentelésre"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Nem általános promóciók, csak felhívások cselekvésre"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Emlékeztető"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Megszakítás"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Tényleges tartalom nélküli szakasz"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Nem információt is tartalmazó átmenetekhez"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Záróképernyő/ Stáblista"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Stáblista, vagy amikor megjelennek a YouTube zárókártyák. Nem használandó információt tartalmazó következtetésekkor."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Ne legyen benne tartalom, akkor sem, ha a zárókártyák már a képernyőn vannak"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Előzetes/Ismétlés"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Az előző részekben történtek rövid ismétlése, vagy a videó további tartalmának előzetese. Összevágott jelenetekhez, nem szóbeli összegzéshez."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Klipek amik megjelennek később, vagy egy jövőbeli videóban"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Korábbi videó összefoglalója"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Nem olyan részekhez, amik új tartalmat adnak a videóhoz"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Témától eltérő töltelék/viccek"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Töltelék"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Témától eltérő jelenetek tölteléknek, vagy humornak"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Figyelemelterelődés, bakik, újrajátszások"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Nem olyan jelenetek, amik a téma megértéséhez szükségesek"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Zene: nem-zene szegmens"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Nem-Zene"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Olyan részek, amik nincsenek a hivatalos kiadásokban"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Nem zene egy élő előadásban"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Kiemelés"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "A videónak az a része, amelyiket a legtöbb ember látni szeretne. Hasonlít az \"A videó x percnél kezdődik\" jellegű hozzászólásokhoz."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "A rész, amit a legtöbb ember keres"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Segíthet a kontextus átugrásában"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "A címhez, vagy indexképhez ugorhat"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Élő adás: Adomány / üzenet olvasások"
|
||||
},
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Tudj meg többet"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Teljes részletek"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Leszavazza és készít egy helyi másolatot, amit beküldhetsz"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Ez azonnal érvényes lesz a szegmenseidre"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Leszavazás"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Felszavazás"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Szegmens elrejtése"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Használd egérgörgődet a szerkesztő mező fölött, hogy gyorsan módosíthasd az időt. A ctrl vagy shift billentyűk kombinációjával finomhangolhatod a változás mértékét."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Ez egy beépített YouTube gyorsbillentyű. Biztosan ezt szeretnéd használni?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BÉTA szerver engedélyezve van!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Beállítások megnyitása"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Beállítások visszaállítása alapértelmezettre"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Biztosan vissza szeretnéd állítani az összes beállítást az alapértelmezett értékekre? A műveletet nem lehet visszavonni."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Salin UserID Publik"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Salin ID Segmen"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Gabung dengan server resmi discord untuk memberikan kritik dan saran!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Tampilkan pemberitahuan setelah melewati segmen"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Tampilkan Bantuan Kategori"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Lewati maklumat ukuran penuh"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "sampai",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Tampilkan transisi segue"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Memainkan sebagai tidak apa pun yang dilewati"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promosi dibayar, tautan dibayar dan iklan langsung. Tidak untuk promosi diri sendiri atau dukungan gratis untuk gerakan/kreator/situs/produk yang mereka suka."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Promosi berbayar"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Bukan untuk donasi atau barang dagangan kustom"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Promosi Diri Sendiri/Tidak Dibayar"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Mirip dengan \"sponsor\" kecuali ini tidak dibayar atau promosi diri sendiri. Ini termasuk merchandise, donasi, atau informasi tentang siapa yang berkolaborasi dengan mereka."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Donasi, langganan, dan barang dagangan kustom"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Sebutan gratis yang tidak menambahkan apa pun ke videonya"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Bukan untuk produk dan barang dagangan yang didesain oleh koperasi"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Akses Eksklusif"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Video ini mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Seluruh video pertunjukkan sesuatu dengan akses gratis atau berbayar"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Pengingat Interaksi (Berlangganan)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Saat ada pengingat singkat untuk meminta suka, berlangganan atau mengikuti mereka di tengah konten. Jika panjang atau tentang sesuatu yang spesifik, sebaiknya pakai kategori promosi diri sendiri."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Pengingat pendek untuk menyukai video, berlangganan, atau ikuti"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Menampilkan pengingat tidak langsung untuk berkomentar"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Bukan untuk promosi umum, hanya bilang untuk melakukan tindakan"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Pengingat Interaksi"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Jeda"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Interval tanpa konten aslinya"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Bukan untuk transisi dengan informasi"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Kartu Akhir/Kredit"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Kredit atau saat kartu akhir YouTube muncul. Tidak untuk kesimpulan dengan informasi."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Jangan tampilkan konten, bahkan jika kartu akhir ada di layar"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Pratinjau/Rekap"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Rekapan singkat dari episode sebelumnya, atau pratinjau tentang apa yang akan terjadi nanti di video. Dimaksudkan untuk klip bersama yang di edit, bukan ringkasan yang diucapkan."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Klip yang ditampilkan nanti, atau di video di masa mendatang"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Rekap dari video sebelumnya"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Bukan untuk bagian yang menambahkan konten tambahan"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Pengisi Tak berkaitan/Lawakan"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Isian"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Scene tangen hanya untuk isian atau humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Gangguan, blooper, replay"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Bukan untuk scene yang dibutuhkan untuk mengerti topik"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musik: Bagian Non-Musik"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Musik"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Bagian bukan di rilis resmi"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Non-musik di pertunjukkan langsung"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Sorotan"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Bagian video yang banyak orang lihat. Sama untuk komentar \"Video dimulai di x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Bagian banyak orang yang mencari"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Dapat melewati topik"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Dapat melewati ke judul atau thumbnail"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Baca Pesan/Donasi"
|
||||
},
|
||||
@@ -786,7 +867,7 @@
|
||||
"message": "Sembunyikan selamanya"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Anda mendapatkan peringatan dan tidak bisa mengirim segmen sementara. Ini dikarenakan kami melihat kamu melakukan beberapa kesalahan yang umum, mohon konfirmasi bahwa kamu mengerti perundangan dan kami akan hapus peringatan. Kamu bisa bergabung ke obrolan menggunakan discord.gg/SponsorBlock atau matrix.io/#/#sponsor:ajay.app"
|
||||
"message": "Anda mendapatkan peringatan dan tidak bisa mengirim segmen sementara. Ini dikarenakan kami melihat Anda melakukan beberapa kesalahan yang umum, mohon konfirmasi bahwa Anda mengerti perundangan dan kami akan hapus peringatan. Anda dapat bergabung ke obrolan menggunakan discord.gg/SponsorBlock atau matrix.io/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Suara ditolak karena peringatan. Klik untuk buka obrolan untuk menyelesaikannya, atau kembali beberapa saat lagi ketika ada waktu.",
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Pelajari Lebih Lanjut"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Detail Penuh"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Menurunkan suara dan membuat salinan lokal untuk Anda kirim ulang"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Ini akan menerapkan ke segmen Anda"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Jempol bawah"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Jempol atas"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Sembunyikan segmen"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Gunakan roda mouse ketika berada di kotak edit untuk mengatur waktu dengan cepat. Kombinasi dengan tombol [Ctrl + Shift] bisa digunakan untuk perubahan yang halus."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Ini adalah pintasan YouTube. Apakah Anda yakin untuk menggunakannya?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Server BETA diaktifkan!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Buka laman opsi"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Atur ulang pengaturan ke bawaan"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Apakah Anda yakin ingin mengatur ulang semua pengaturan ke nilai bawaan?\nTindakan ini tidak dapat diurungkan."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Copia UserID Pubblico"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Copia ID Segmento"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Entra nel server Discord ufficiale per darci suggerimenti e feedback!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Mostra Avviso Dopo Aver Saltato un Segmento"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Mostra Aiuto della Categoria"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Salta Avvisi di Dimensioni Complete"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "a",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Includi transizioni"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Riproduci come se nulla fosse stato saltato"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsorizzazione"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promozione a pagamento, referral a pagamento e pubblicità diretta. Non per auto-promozione o ringraziamenti gratuiti a cause/creatori/siti web/ prodotti di loro gradimento."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Promozioni a pagamento"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Non per donazioni o merchandise personalizzato"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Promozione non pagata/Autopromozione"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Simile alle \"sponsorizzazioni\" tranne che per promozioni non pagate o autopromozioni. Ciò include sezioni riguardanti vendita di merce, donazioni o informazioni in merito a collaboratori."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Donazioni, abbonamenti e merce personalizzata"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Shoutout non pagati che non aggiungono nulla al video"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Non per prodotti progettati da aziende e merce"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Accesso Esclusivo"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Questo video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "L'intero video mostra qualcosa con accesso gratuito o sovvenzionato"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Promemoria d'Interazione (Iscrizione)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Quando nel punto centrale del contenuto è presente un breve promemoria per aggiunta di mi piace, iscrizione o seguito. Se dovesse risultare esteso o riguardare qualcosa di specifico, potrebbe essere un'autopromozione."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Brevi promemoria per mi piace, iscrizioni o follow"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Include promemoria indiretti al commento"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Non per promozione generale, solo chiamata all'azione"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Promemoria di Interazione"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Interruzione"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Intervallo senza contenuto effettivo"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Non per transizioni con informazioni"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Conclusioni/Titoli di Coda"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "I titoli di coda o quando vengono mostrate annotazioni a fine video su YouTube. Non per conclusioni provviste di informazioni."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Non include contenuti, anche se le schede finali sono a schermo"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Anteprima/Riepilogo"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Riepilogo rapido degli episodi precedenti, o un'anteprima di ciò che sta arrivando più tardi nel video attuale. Inteso per clip, non per riassunti a voce."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Clip che appaiono più tardi in questo video, oppure in un video futuro"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Riepilogo o riassunto di un video precedente"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Non per sezioni che aggiungono contenuti in più"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Riempitivi irrilevanti/Battute"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Riempimento"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Scene non correlate usate solo per riempimenti o umorismo"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Distrazioni, blooper, replay"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Non per scene necessarie a capire l'argomento"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musica: Sezione Non-Musicale"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Musicale"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Sezioni non presenti nelle release ufficiali"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Sezioni senza musica in una performance dal vivo"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Evidenzia"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "La parte del video che gran parte delle persone stanno cercando. Simile ai commenti \"Il video inizia a x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "La sezione che la maggior parte delle persone sta cercando"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Può ignorare il contesto"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Può portare al titolo o alla miniatura del video"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Donazione/Letture dei Messaggi"
|
||||
},
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Scopri di Più"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Visualizza Dettagli Completi"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Vota negativamente e crea una copia locale da reinviare"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Questo si applicherà istantaneamente ai tuoi segmenti"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Voto negativo"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Voto positivo"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Nascondi segmento"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Usa la rotellina del mouse passando sulla casella di modifica per regolare rapidamente il tempo. Le combinazioni dei tasti ctrl o shift sono utilizzabili per perfezionare le modifiche."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Questa è una scorciatoia integrata da YouTube. Sei sicuro di volerla usare?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Il server BETA è abilitato!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Apri la pagina delle opzioni"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Ripristina le impostazioni predefinite"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Sei sicuro di voler reimpostare tutte le impostazioni ai valori predefiniti? Questo non può essere annullato."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "パブリックユーザIDをコピー"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "セグメントIDをコピー"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください!"
|
||||
},
|
||||
@@ -879,6 +882,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "この変更はすぐにあなたのセグメントに適用されます"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "低評価"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "高評価"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "セグメントを表示しない"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "編集ボックスにカーソルを合わせながらマウスホイールを使用すると、時間をすばやく調整できます。 CtrlキーまたはShiftキーの組み合わせを使用して変更を微調整できます。"
|
||||
},
|
||||
@@ -929,5 +941,11 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "これはYouTubeにデフォルトで使用されているショートカットです。本当にこれを使用しますか?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "ベータサーバーが有効です!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "オプションページを開く"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "공개 사용자 ID 복사"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "구간 ID 복사"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "공식 디스코드 서버에 들어와서 기능 제안을 해주시거나 피드백을 남겨주세요!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "구간을 건너뛴 후 알림 표시"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "카테고리 도움말 표시"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "건너뛰기 알림 크게"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "-",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "연속적인 전환 포함"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "건너뛰지 않은 것처럼 자연스럽게"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "스폰서 광고"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "유료 광고, 유료 협찬과 직접 광고입니다. 원인/크리에이터/웹사이트/제품에 자체 홍보나 대가 없는 홍보는 여기에 해당되지 않습니다."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "유료 광고"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "후원이나 자체 상품은 해당되지 않음"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "자체 홍보 구간"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "'스폰서 광고'와 비슷하지만 협찬 없이 자기 채널을 홍보하는 구간입니다. 여기에는 채널 굿즈 광고, 기부 광고와 영상에 참여한 사람들을 홍보하는 광고가 해당됩니다."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "후원, 멤버십 및 자체 상품"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "동영상과 무관한 무료 홍보"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "기업 제품 및 상품은 해당되지 않음"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "협찬"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "본 동영상은 무료/유료 협찬을 받은 제품, 서비스, 장소를 소개합니다",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "전체 동영상이 유/무료 협찬을 받은 대상을 소개함"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "상호 작용 알림 (구독)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "컨텐츠 중앙의 좋아요, 구독이나 팔로우에 대한 짧은 설명이 뜨는 경우입니다. 길거나 특정적인 거라면 자가 홍보에 해당됩니다."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "좋아요, 구독, 팔로우를 요청하는 구간"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "간접적인 댓글 작성 유도도 포함"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "일반적인 홍보는 해당되지 않음, 행동을 요청하는 경우만"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "상호 작용 알림"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "휴식 시간"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "실제 콘텐츠가 없는 구간"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "정보가 포함된 전환은 해당되지 않음"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "최종 화면 / 크레딧"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "엔딩 크레딧이나 최종 화면이 나타나는 구간입니다. 단순히 결론을 말하는 부분은 여기에 포함되지 않습니다."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "최종 화면 카드가 표시되더라도, 콘텐츠가 포함되도록 하지 말 것"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "미리보기/요약"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "이전 에피소드를 간략히 요약하거나 현재 동영상에서 나중에 나올 내용을 예고해줍니다. 음성 요약이 아니라 편집된 동영상을 통한 요약입니다."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "다음 동영상이나 이후 구간에 나타나는 클립"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "이전 동영상 요약"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "추가적인 콘텐츠가 들어가는 구간은 해당되지 않음"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "쓸데없는 잡담/농담"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "잡담"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "잡담이나 유머를 구사하고 주제에서 벗어난 장면"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "집중을 방해하는 구간, 실수, 리플레이"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "주제를 이해하는 데 필요한 장면은 해당되지 않음"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "음악이 아닌 구간"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "음악이 아닌 구간"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "정식 음악에는 없는 구간"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "실시간 공연에서 음악이 아닌 부분"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "하이라이트"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "대부분의 사람들이 찾는 동영상의 파트를 말합니다. \"바쁘신 분들은...\" 댓글과 유사합니다."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "대부분의 사람들이 찾는 구간"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "맥락을 건너뛰어도 됨"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "제목, 썸네일 구간으로 건너뛰어도 됨"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "라이브스트림: 후원/메시지 읽기"
|
||||
},
|
||||
@@ -692,7 +773,7 @@
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "경고: 이 유형의 세그먼트는 한 번에 최대 하나씩 활성화될 수 있습니다. 여러 개를 제출하면 무작위로 표시됩니다."
|
||||
"message": "경고: 이 유형의 구간은 한 번에 최대 하나씩만 활성화될 수 있습니다. 여러 개를 제출하면 무작위 하나가 표시됩니다."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "제출 해야하는 모든 구간의 카테고리를 설정해야합니다!"
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "더보기"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "전체 자세한 정보"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "비추천에 투표한 뒤 다시 제출할 수 있도록 미제출 사본을 생성합니다"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "당신의 구간에 즉시 적용될 것입니다"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "비추천"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "추천"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "구간 숨기기"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "편집 상자 위에 커서를 올린 채 스크롤하면 시간을 빠르게 조정할 수 있습니다. Ctrl이나 Shift 키를 누른 채로 스크롤하면 세밀한 조정이 가능합니다."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "기본 YouTube 단축키와 겹칩니다. 그래도 사용하시겠습니까?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "베타 서버가 활성화되었습니다!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "설정 페이지 열기"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "기본 설정으로 초기화"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "정말로 모든 설정을 기본값으로 초기화하시겠습니까? 되돌릴 수 없습니다."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Publieke gebruikers-ID kopiëren"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Segment-ID kopiëren"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Word lid van de officiële Discord-server om suggesties en feedback te geven!"
|
||||
},
|
||||
@@ -210,13 +213,13 @@
|
||||
"message": "Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Segment-downvotes opslaan"
|
||||
"message": "Segment-tegenstemmen opslaan"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Segmenten waarop u een downvote doet, blijven verborgen, zelfs na vernieuwen"
|
||||
"message": "Segmenten waarop u een tegenstem doet, blijven verborgen, zelfs na vernieuwen"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen downvotes verwijderd"
|
||||
"message": "Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen tegenstemmen verwijderd"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Opvragen via hash-voorvoegsel"
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Melding weergeven nadat een segment is overgeslagen"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Categorie-hulp weergeven"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Volledige grootte overslaan-meldingen"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "tot",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Inclusief vlotte overgangen"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Speelt af alsof niets overgeslagen werd"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Betaalde promotie, betaalde aanbevelingen en directe reclame. Niet voor zelfpromotie of gratis uitroepen naar zaken/makers/websites/producten waar ze van houden."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Betaalde promoties"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Niet voor donaties of aangepaste koopwaar"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Onbetaalde promotie of zelfpromotie"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Vergelijkbaar met \"sponsor\", behalve voor onbetaalde of zelfpromotie. Dit is inclusief secties over koopwaar, donaties of informatie over met wie ze hebben samengewerkt."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Donaties, lidmaatschappen en aangepaste koopwaar"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Gratis uitroepen die niet aan de video toevoegen"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Niet voor bedrijfsontworpen producten en koopwaar"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exclusieve toegang"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Deze video toont een product, dienst of locatie waartoe men gratis of gesubsidieerd toegang heeft gekregen",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Volledige video laat iets zien met gratis of gesubsidieerde toegang"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interactieherinnering (abonneren)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Als er een korte herinnering is om ze leuk te vinden, u te abonneren of ze te volgen in het midden van de inhoud. Als het lang is of over iets specifieks gaat, moet het in plaats daarvan onder zelfpromotie vallen."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Korte herinneringen om leuk te vinden, te abonneren of te volgen"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Bevat indirecte herinneringen voor commentaar"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Niet voor algemene promotie, roept alleen op tot actie"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Interactieherinnering"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Onderbreking"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Interval zonder werkelijke inhoud"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Niet voor overgangen met informatie"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Eindkaarten/aftiteling"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Aftiteling of wanneer de YouTube-eindkaarten verschijnen. Niet voor conclusies met informatie."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Inhoud niet toevoegen, zelfs niet als eindkaarten op het scherm staan"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Voorbeeld/samenvatting"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Snelle samenvatting van vorige afleveringen of een voorbeeld van wat er later komt in de huidige video. Bedoeld voor samengevoegde clips, niet voor gesproken samenvattingen."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Clips die later of in een toekomstige video verschijnen"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Samenvatting van een vorige video"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Niet voor secties die extra inhoud toevoegen"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Opvulling zijspoor/humor"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Opvulling"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Zijspoor-scènes alleen voor opvulling of humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Afleidingen, bloopers, herhalingen"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Niet voor scènes vereist om het onderwerp te begrijpen"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muziek: sectie niet-muziek"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Niet-muziek"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Secties niet in officiële releases"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Niet-muziek in een live optreden"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Hoogtepunt"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Het deel van de video waar de meeste mensen naar op zoek zijn. Gelijkaardig aan \"video begint bij x\"-opmerkingen."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Sectie die de meeste mensen zoeken"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Kan context overslaan"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Kan naar titel of pictogram overslaan"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: donaties/lezen van berichten"
|
||||
},
|
||||
@@ -701,7 +782,7 @@
|
||||
"message": "(einde)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "verborgen: downvote"
|
||||
"message": "verborgen: tegenstem"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "verborgen: te kort"
|
||||
@@ -796,7 +877,7 @@
|
||||
"message": "Doneren"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Ontwikkeling helpen"
|
||||
"message": "Ontwikkeling steunen"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Donatiekoppeling verbergen"
|
||||
@@ -820,7 +901,7 @@
|
||||
"message": "Videosegmenten zullen automatisch worden overgeslagen als ze in de database worden gevonden. U kunt de popup openen door op het pictogram van de extensie te klikken om een voorbeeld te krijgen van wat ze zijn."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op downvote te klikken! U kunt ook stemmen in de popup."
|
||||
"message": "Als u een segment overslaat, krijgt u een bericht. Als de timing verkeerd lijkt, stem dan door op tegenstemmen te klikken! U kunt ook stemmen in de popup."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Indienen"
|
||||
@@ -864,14 +945,17 @@
|
||||
"LearnMore": {
|
||||
"message": "Meer informatie"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Volledige details"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Doet een downvote en maakt een lokale kopie aan die u opnieuw kunt indienen"
|
||||
"message": "Doet een tegenstem en maakt een lokale kopie aan die u opnieuw kunt indienen"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Wikipagina van deze categorie openen."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopiëren en downvote doen"
|
||||
"message": "Kopiëren en tegenstemmen"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Doorgaan met stemmen"
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Dit is direct van toepassing op uw segmenten"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Tegenstemmen"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Stemmen"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Segment verbergen"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Gebruik het muiswiel terwijl u over het invoerveld beweegt om de tijd snel aan te passen. Combinaties van de ctrl- of shift-toets kunnen worden gebruikt om de wijzigingen te verfijnen."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dit is een ingebouwde YouTube-snelkoppeling. Weet u zeker dat u deze wilt gebruiken?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETAserver is ingeschakeld!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Pagina met opties openen"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Instellingen terugzetten op standaard"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Weet u zeker dat u alle instellingen wilt terugzetten naar hun standaardwaarden? Dit kan niet ongedaan worden gemaakt."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
"message": "Serwer odpowiedział, że to zapytanie jest niepoprawne"
|
||||
},
|
||||
"429": {
|
||||
"message": "Zgłosiłeś za dużo segmentów sponsora dla tego jednego filmu. Jesteś pewien, że jest ich tak dużo?"
|
||||
"message": "Zgłoszono za dużo segmentów sponsora dla tego jednego filmu. Czy na pewno jest ich tak dużo?"
|
||||
},
|
||||
"409": {
|
||||
"message": "To już zostało wysłane wcześniej"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopiuj publiczny identyfikator użytkownika"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Kopiuj ID segmentu"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Dołącz do oficjalnego serwera na discordzie i podziel się wrażeniami i sugestiami!"
|
||||
},
|
||||
@@ -236,20 +239,23 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Pokaż informację po pominięciu segmentu"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Pokaż pomoc kategorii"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Pełnowymiarowe powiadomienia o przewinięciu"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Małe powiadomienia o automatycznym przewijaniu"
|
||||
"message": "Małe powiadomienia o automatycznym pomijaniu"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Małe powiadomienia o przewinięciu"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Znikające powiadomienia o automatycznym przewijaniu"
|
||||
"message": "Znikające powiadomienia o automatycznym pomijaniu"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Znikające powiadomienia o przewijaniu"
|
||||
"message": "Znikające powiadomienia o pomijaniu"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock pozwala pomijać sponsorów, intra, outra, przypomnienia o subskrypcjach i inne irytujące fragmenty filmów na YouTube. SponsorBlock jest opartym na crowdsourcingu rozszerzeniem do przeglądarki, które pozwala każdemu zgłosić początek i koniec segmentów sponsorowanych oraz innych segmentów w filmach na YouTube. Kiedy ktoś już zamieści te informacje, wszyscy pozostali z tym rozszerzeniem będą pomijać segment sponsorowany. Możesz również pomijać fragmenty teledysków bez muzyki.",
|
||||
@@ -319,7 +325,7 @@
|
||||
"message": "{0} — pominąć?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Wyciszyć {0}?"
|
||||
"message": "{0} — wyciszyć?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Przejść do {0}?",
|
||||
@@ -446,7 +452,7 @@
|
||||
"message": "Ten segment jest krótszy od ustawionego przez Ciebie minimalnego czasu trwania. Może to oznaczać, że ktoś już to zamieścił, ale nie widzisz tego przez to ustawienie. Czy na pewno chcesz to zamieścić?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Przesyłanie na aktywnej transmisji na żywo lub premierze jest niedozwolone. Poczekaj aż ona się zakończy, a następnie odśwież stronę i sprawdź, czy te segmenty są nadal prawidłowe."
|
||||
"message": "Przesyłanie segmentów podczas transmisji na żywo lub trwającej premiery jest niedozwolone. Poczekaj, aż się zakończy, a następnie odśwież stronę i sprawdź, czy te segmenty są nadal prawidłowe."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Pokaż przycisk wysyłania"
|
||||
@@ -461,7 +467,7 @@
|
||||
"message": "Zapisz"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Reset"
|
||||
"message": "Resetuj"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Ten adres nie jest w prawidłowej formie. Upewnij się, że http:// lub https:// znajduje się na początku i nie ma końcowych ukośników."
|
||||
@@ -533,40 +539,73 @@
|
||||
"message": "Informacje do debugowania zostały skopiowane do schowka. Możesz usunąć dane, których nie chcesz udostępniać. Zapisz je w pliku tekstowym albo wklej do raportu podczas zgłaszania błędu."
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "Ten skrót jest przypisany do innej akcji. Proszę wybrać inny."
|
||||
"message": "Ten skrót jest przypisany do innej czynności. Wybierz inny."
|
||||
},
|
||||
"to": {
|
||||
"message": "do",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Zawiera płynne przejścia"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Odtwarza się, jakby nic nie zostało pominięte"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Płatna promocja, płatne rekomendacje oraz bezpośrednie reklamy. Nie do autopromocji ani darmowych wyrazów uznania dla kwestii/twórców/stron/produktów, które im się podobają."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Segmenty sponsorowane"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Nie dla donateów lub merchu"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Nieopłacona/Własna promocja"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Podobnie jak \"sponsor\", ale nieodpłatnie bądź w ramach promocji własnej. Obejmuje to sekcje o własnych produktach, donacjach czy informacje o tym, z kim współpracowali."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Dotacje, płatne członkostwo i merch"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Szybkie przypomnienia, które nie wnoszą nic do filmu"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Nie dla produktów zaprojektowanych przez duże firmy"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Ekskluzywny dostęp"
|
||||
"message": "Dostęp na wyłączność"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Tylko do oznaczania całych filmów. Używane, gdy wideo wyświetla produkt, usługę lub lokalizację, do których otrzymali darmowy lub subsydiowany dostęp."
|
||||
"message": "Tylko do oznaczania całych filmów. Używane, gdy materiał wideo przedstawia produkt, usługę lub miejsce, do którego dostęp został otrzymany bezpłatnie lub dzięki dofinansowaniu."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Ten film pokazuje produkt, usługę lub lokalizację, do których otrzymali darmowy lub subsydiowany dostęp",
|
||||
"message": "Ten materiał wideo przedstawia produkt, usługę lub miejsce, do którego dostęp został otrzymany bezpłatnie lub dzięki dofinansowaniu",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Cały film jest poświęcony czemuś z darmowym lub płatnym dostępem"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Przypomnienie o interakcji (Subskrybuj)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Gdy ma miejsce krótkie przypomnienie, by lajkować, subskrybować lub śledzić ich w trakcie kontentu. Jeśli trwa to długo lub dotyczy czegoś konkretnego, powinno być zamiast tego jako promocja własna."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Krótkie przypomnienia, by polubić lub zasubskrybować"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Zawiera niebezpośrednie zachęcanie do komentowania"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Nie dla ogólnej promocji, tylko zaproszenia do działania"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Przypomnienie o interakcji"
|
||||
},
|
||||
@@ -579,24 +618,54 @@
|
||||
"category_intro_short": {
|
||||
"message": "Przerwa"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Przerwy bez rzeczywistej zawartości"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Nie dla przejść zawierających informacje"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Ekran końcowy/Napisy"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Napisy końcowe lub gdy pojawia się ekran końcowy. Nie do konkluzji zawierających informacje."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Nie zawiera treści, nawet jeśli na ekranie są karty końcowe"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Zapowiedź/Podsumowanie"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Szybkie podsumowanie poprzednich odcinków lub podgląd tego, co pojawia się później w bieżącym filmie. Dotyczy zmontowanych klipów, a nie ustnych podsumowań."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Klipy, które pojawiają się później lub w następnym filmie"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Podsumowanie poprzedniego filmu"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Nie dla sekcji, które zawierają potrzebne informacje"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Wypełniacz nietematyczny/Żart"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Sceny nietematyczne dodawane tylko jako wypełniacz lub dla humoru, które nie są wymagane do zrozumienia głównej treści filmu. Nie powinno to obejmować segmentów zawierających informacje kontekstowe lub szczegółowe."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Wypełniacz"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Przerywniki lub sceny czysto humorystyczne"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Rozpraszacze, wpadki, powtórki"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Nie dla scen wymaganych, by zrozumieć temat"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muzyka: Sekcja niemuzyczna"
|
||||
},
|
||||
@@ -606,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Bez muzyki"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Sekcje, których nie ma w oficjalnych wydaniach"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Niemuzyczna część wystąpienia na żywo"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Wyróżnione"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Część filmu, która interesuje większość osób. Podobne do komentarzy typu „Filmik zaczyna się od x”."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Część filmu, której szuka większość osób"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Może pomijać kontekst"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Może pomijać do tytułu lub miniaturki"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Transmisja live: Dotacja/Czytanie wiadomości"
|
||||
},
|
||||
@@ -689,7 +773,7 @@
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Ostrzeżenie: Ten typ segmentu, może być maksymalnie jeden. Przesyłanie kilku na raz spowoduje, że pojawi się losowy."
|
||||
"message": "Ostrzeżenie: Ten typ segmentu może być maksymalnie jeden. Przesyłanie kilku na raz spowoduje, że pojawi się losowy."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Musisz wybrać kategorię dla każdego segmentu, który zamieszczasz!"
|
||||
@@ -703,6 +787,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "ukryty: zbyt krótki"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "ręcznie ukryty"
|
||||
},
|
||||
"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 kanału nie zostało jeszcze załadowane. Jeśli używasz embeddowanego filmu, spróbuj użyć strony głównej YouTube'a. Może to być również spowodowane zmianami w layout'cie YouTube'a, jeśli myślisz, że to przez to, dodaj swój komentarz tutaj:"
|
||||
@@ -787,13 +874,13 @@
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Dotacje"
|
||||
"message": "Wesprzyj nas"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Wesprzyj"
|
||||
"message": "Wesprzyj rozwój wtyczki"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ukryj Link Do Dotacji"
|
||||
"message": "Ukryj link do darowizny"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Tryb ciemny na stronie opcji"
|
||||
@@ -817,10 +904,10 @@
|
||||
"message": "Za każdym razem, gdy pominiesz segment, otrzymasz powiadomienie. Jeśli moment nie wydaje się być poprawny, kliknij łapkę w dół! Możesz również głosować w okienku pop-up."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Wysyłanie"
|
||||
"message": "Przesyłanie"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Wysyłanie może być wykonane w wyskakującym okienku, poprzez kliknięcie przycisku \"Początek segmentu\" lub za pomocą przycisków na odtwarzaczu wideo."
|
||||
"message": "Zgłoszenia można dokonać w wyskakującym okienku, naciskając przycisk „Początek segmentu”, lub za pomocą przycisków w odtwarzaczu wideo."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Kliknięcie przycisku odtwarzania wskazuje początek segmentu a kliknięcie ikony stop wskazuje koniec segmentu. Możesz przygotować wielu segmentów przed wysłaniem. Aby wysłać kliknij przycisk potwierdzający, a aby usunąć - na śmietnik."
|
||||
@@ -858,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Dowiedz się więcej"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Pełne szczegóły"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Daje łapkę w dół i tworzy lokalną kopię, abyś mógł przesłać poprawioną wersję"
|
||||
},
|
||||
@@ -873,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "To natychmiastowo zostanie zastosowane do twoich segmentów"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Głos przeciw"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Głos za"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Ukryj segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany."
|
||||
},
|
||||
@@ -923,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "To jest wbudowany skrót YouTube. Czy na pewno chcesz go użyć?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Serwer BETA jest włączony!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Otwórz stronę ustawień"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Resetuj do ustawień domyślnych"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Czy na pewno chcesz przywrócić wszystkie ustawienia do ich domyślnych wartości? Tego nie można cofnąć."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Copiar ID Pública de Usuário"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Copiar ID do segmento"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Junte-se ao servidor do discord oficial para dar dicas e sugestões!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar Aviso Após Um Segmento Ser Ignorado"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Mostrar Categoria de Ajuda"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Avisos de Ignorar em Tamanho Inteiro"
|
||||
},
|
||||
@@ -879,6 +885,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Isto irá aplicar instantaneamente seus segmentos"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Voto negativo"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Voto positivo"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Ocultar segmento"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Use a roda do mouse enquanto mantêm o cursor sobre a caixa de edição para ajustar o tempo rapidamente. Combinações das teclas ctrl e shift podem ser usadas para refinar as mudanças."
|
||||
},
|
||||
@@ -929,5 +944,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Este já é um atalho padrão do YouTube. Tem certeza que deseja utilizá-lo?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Os Servidores BETA estão ativos!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Abrir página de opções"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Redefinir configurações para o padrão"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Tem certeza de que deseja redefinir todas as configurações para os valores padrão? Essa ação não poderá ser desfeita."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"message": "Isso já foi enviado antes"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Canal adicionado à whitelist!"
|
||||
"message": "Canal adicionado à lista de autorizados!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmento"
|
||||
@@ -159,10 +159,13 @@
|
||||
"message": "Nome de Utilizador"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Criar nomde de utilizador"
|
||||
"message": "Criar nome de utilizador"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Copiar UserID Publico"
|
||||
"message": "Copiar ID público de utilizador"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Copiar ID do segmento"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
|
||||
@@ -224,15 +227,280 @@
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Em vez de solicitar segmentos do servidor usando o ID do Vídeo, são enviados os primeiros 4 caracteres do hash do ID do Vídeo. Este servidor enviará de volta dados para todos os vídeos com hashes semelhantes."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Recuperar segmentos em novos vídeos"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos a monitorizar enquanto assiste."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Mostrar notificação outra vez"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Mostrar aviso após um segmento ser ignorado"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Avisos de ignorar em tamanho inteiro"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Avisos pequenos quando ignorado automaticamente"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Todos os avisos de ignorar em tamanho pequeno"
|
||||
},
|
||||
"website": {
|
||||
"message": "Site",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Código fonte",
|
||||
"message": "Código-fonte",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Código de erro: "
|
||||
},
|
||||
"skip": {
|
||||
"message": "Saltar"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Silenciar"
|
||||
},
|
||||
"full": {
|
||||
"message": "Vídeo completo",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Saltar {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Silenciar {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Avançar para {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} ignorado",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} silenciado",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuto"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "minutos"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "hora"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "horas"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Poupou pessoas de",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " das suas vidas",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Definir ID de utilizador"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Atenção: A alteração do ID de utilizador é permanente. Tem certeza que a deseja? Certifique-se de fazer uma cópia de segurança do seu ID antigo por precaução."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Tem certeza que deseja redefinir?"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com é agora suportado"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Importar/Exportar todas as opções"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Editar/copiar"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Guardar num ficheiro"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Carregar a partir de ficheiro"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Definir opções"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Enviar"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Cancelar"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Eliminar"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Pré-visualizar"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Inspecionar"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Editar"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "Copiar informações de depuração para a área de transferência"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "Falha ao copiar para a área de transferência"
|
||||
},
|
||||
"to": {
|
||||
"message": "até",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Reproduz como se nada tivesse sido ignorado"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Patrocinador"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Acesso exclusivo"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Lembrete de interação"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Leitura de mensagens"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Saltar automaticamente"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Saltar manualmente"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Desativar"
|
||||
},
|
||||
"category": {
|
||||
"message": "Categoria"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(agora)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Mais categorias"
|
||||
},
|
||||
"chooseACategory": {
|
||||
"message": "Escolher uma categoria"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(fim)"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "ocultado manualmente"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Alterar categoria"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Orientações"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Leia as nossas orientações!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Modo escuro na página de opções"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Obrigado por instalar o SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Por favor, reveja as opções abaixo"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Como a função saltar funciona"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "A enviar"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "A editar"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Está demasiado lento"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Créditos"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Saber mais"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Todos os detalhes"
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Copiar e dar voto negativo"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Continuar a votar"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Voto negativo"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Voto positivo"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Ocultar segmento"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Comportamento",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "Interface",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "Atalhos de teclado",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "Cópia de seg./restauro",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Diversos",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Desvincular",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Não definido"
|
||||
},
|
||||
"change": {
|
||||
"message": "Alterar"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "O servidor BETA está ativado!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Abrir página de opções"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "Sari peste"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Activare sunet"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pauză"
|
||||
},
|
||||
@@ -79,9 +82,15 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segmentul se termină acum"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Anulare creare segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nu s-a găsit niciun videoclip YouTube.\nDacă acest lucru este incorect, actualizați fila."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Reîmprospătare segmente"
|
||||
},
|
||||
"success": {
|
||||
"message": "Succes!"
|
||||
},
|
||||
@@ -152,6 +161,9 @@
|
||||
"setUsername": {
|
||||
"message": "Setează Numele De Utilizator"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Copiază ID-Utilizator Public"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Vino și alătură-te serverului oficial de discord pentru a oferi sugestii și feedback!"
|
||||
},
|
||||
|
||||
@@ -144,7 +144,7 @@
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Подсказка: Вы можете настроить сочетания клавиш для отправки в опциях"
|
||||
"message": "Подсказка: Вы можете настроить сочетания клавиш для отправки в настройках"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Очистить время"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Копировать публичный UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Копировать ID сегмента"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Присоединяйтесь к официальному серверу Discord, чтобы оставить предложения и обратную связь!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Показывать уведомление после пропуска сегмента"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Показать справку для категории"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Полноразмерные уведомления о пропусках"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "до",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Содержит плавный переход от одной темы к другой"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Пропуск должен произойти незаметно"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Спонсор"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Рекламные интеграции, реферальные ссылки и реклама напрямую. Не для саморекламы или рекомендаций разных событий/создателей/сайтов/продуктов, которые нравятся автору видео."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Реклама"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Не для доната или мерчендайза"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Самореклама/рекомендация"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Похоже на \"Спонсора\", но для бесплатной рекламы и саморекламы. Включает себя вставки про мерчендайз, пожертвования или информацию о тех, вместе с кем было сделано видео."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Донаты, платное членство и мерчендайз"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Рекомендации, не добавляющие контекста видео"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Не для корпоративной продукции"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Эксклюзивный доступ"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Это видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Всё видео - демонстрация чего-либо, к чему авторам был дан эксклюзивный доступ"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Напоминание о взаимодействии (подписка)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Когда есть краткое напоминание поставить лайк, подписаться на канал или в соцсетях в середине содержимого. Если эта вставка длительная или о чём-то конкретном, она должна классифицироваться как самореклама."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Краткие напоминания поставить лайк, подписаться или нажать на колокольчик"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Включает косвенные предложения оставить комментарий"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Не для рекламы, только призывы к действию"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Напоминание о взаимодействии"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Заставка"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Сегмент без контента"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Не для переходных сегментов с информацией"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Конечная заставка/титры"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Титры или время появления конечных заставок YouTube. Не для подведения итогов сказанного в видео."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Не для сегментов с контентом, даже если на видео показываются конечные заставки"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Предпросмотр/краткое содержание"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Краткое содержание предыдущих эпизодов или предварительный просмотр того, что будет в данном видео. Предназначено для сегментов, смонтированных из кусков видео, а не для устных пересказов."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Фрагменты, которые появляются позже или в будущем видео"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Пересказ предыдущего видео"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Не для сегментов с дополнительным контентом"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Заполнение отвлечёнными темами/шутками"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Заполнитель"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Сцены с отвлечёнными темами или шутками"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Разговоры не по теме, неудачные дубли, повторы"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Не для сегментов, необходимых для понимания темы"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Музыка: Сегмент без музыки"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Без музыки"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Сегменты, не включённые в официальные релизы"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Сегменты без музыки во время живого выступления"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Важное"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Часть видео, которую ищет большинство людей. По сути заменяет комментарии типа \"Видео начинается с x:xx\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Момент, который будет интересен большинству людей"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Может помочь пропустить контекст"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Может пропустить до объекта заголовка или превью"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Прямые трансляции: пожертвование/чтение сообщения"
|
||||
},
|
||||
@@ -735,7 +816,7 @@
|
||||
"message": "Принудительная проверка каналов перед пропуском"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "По умолчанию расширение пропускает сегменты сразу же, не проверяя то, какой это канал. По умолчанию некоторые сегменты в начале видео могут быть пропущены на каналах из белого списка. Включение этой опции предотвратит это, но все пропуски будут иметь небольшую задержку, так как получение ID канала может занять некоторое время. Эта задержка может быть незаметной, если у вас быстрый интернет."
|
||||
"message": "По умолчанию расширение пропускает сегменты сразу же, не проверяя то, какой это канал. По умолчанию некоторые сегменты в начале видео могут быть пропущены на каналах из белого списка. Включение этой настройки предотвратит это, но все пропуски будут иметь небольшую задержку, так как получение ID канала может занять некоторое время. Эта задержка может быть незаметной, если у вас быстрый интернет."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Рекомендуем включить \"Принудительная проверка каналов перед пропуском\""
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Узнать больше"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Полная информация"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Голосует против и создаёт локальную копию сегмента для повторной отправки"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Это мгновенно применится к вашим сегментам"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Голос «против»"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Голос «за»"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Скрыть сегмент"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Наведите курсор на поле редактирования и используйте колесо мыши для быстрой настройки времени. Клавиши Ctrl или Shift могут быть использованы для точной настройки."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Это сочетание используется на сайте YouTube. Вы уверены, что хотите его использовать?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Используется BETA сервер!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Открыть страницу настроек"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Восстановить настройки по умолчанию"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Вы уверены, что вы хотите восстановить настройки по умолчанию? Это действие не может быть отменено."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Skopírovať verejné ID používateľa"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Skopírovať ID segmentu"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Pripojte sa k oficiálnemu Discord serveru a zanechajte nám pripomienky!"
|
||||
},
|
||||
@@ -227,6 +230,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Zobraziť upozornenie pri preskočení segmentu"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Zobraziť pomocníka ku kategórii"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Veľké upozornenia o preskočení"
|
||||
},
|
||||
@@ -503,18 +509,39 @@
|
||||
"message": "do",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Zahŕňa plynulé prechody"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Prehrať tak, ako keby nebolo nič preskočené"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponzor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Platená propagácia, platené odporúčania a priame reklamy. Neplatí pre vlastnú propagáciu alebo neplatenú propagáciu dobročinností/tvorcov/webových stránok/produktov, ktoré sa im páčia."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Platené promo"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Nie pre dary a vlastný merch"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Neplatená/Vlastná propagácia"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Podobné ako sponzor, okrem neplatenej alebo vlastnej propagácie. Patria sem sekcie týkajúce sa merchu, donatov alebo informácií o tom, s kým spolupracovali."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Dary, členstvo a vlastný merch"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Obsah mimo témy, ktorý nepridáva žiadne informácie"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Nie pre firemne navrhnuté produkty a merch"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exkluzívny Prístup"
|
||||
},
|
||||
@@ -525,12 +552,24 @@
|
||||
"message": "Toto video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Celé video predstavuje niečo, kde sa dá získať voľný alebo zľavnený prístup"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Pripomienka interakcie (Prihlásiť sa na odber)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Krátka výzva dať like, prihlásiť sa na odber alebo sledovať ich v strede obsahu. Ak je to dlhé alebo sa týka niečoho konkrétneho, malo by to radšej byť v ramci vlastnej propagácie."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Krátke pripomienky na \"Páči sa mi to\", Odber a Sledovanie"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Zahŕňa nepriame pripomienky na komentovanie"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Nie pre všeobecné promo, iba výzvy k akcii"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Pripomienka interakcie"
|
||||
},
|
||||
@@ -543,24 +582,51 @@
|
||||
"category_intro_short": {
|
||||
"message": "Prerušenie"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Interval bez samotného obsahu"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Nie pre prechody bez informácie"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Koncové karty / titulky"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Kredity alebo keď sa zobrazia YouTube koncové karty. Neplatí pre zhrnutia s informáciami."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Nezahrňte obsah, aj keby už boli vidieť koncové karty"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Ukážka/Rekapitulácia"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Rýchla rekapitulácia predošlej epizódy alebo ukážka toho, čo bude nasledovať neskôr v aktuálnom videu. Myslené pre zostrihané videá, nie pre hovorený súhrn."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Ukážky, ktoré sa zobrazia neskôr alebo v budúcom videu"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Zhrnutie predošlého videa"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Nie pre sekcie, ktoré majú dodatočný obsah"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Odbočky mimo tému pridané len pre zábavu, nepotrebné pre pochopenie hlavného obsahu videa. Nemalo by zahŕňať segmenty, ktoré vysvetľujú kontext alebo vedľajšie detaily."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Odbočka"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Nepodstatné scény slúžiace len ako výplň alebo humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Nepodarené a opakované zábery"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Nie pre scény vyžadované pre pochopenie témy"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Hudba: časť bez hudby"
|
||||
},
|
||||
@@ -570,12 +636,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Bez hudby"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Sekcie, ktoré nie sú v oficiálnom vydaní"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Sekcia bez hudby v živom vystúpení"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Hlavný obsah videa"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Tá časť videa, ktorú ľudia vyhľadávajú. Podobné komentárom \"Video začína v čase x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Sekcia, ktorú vyhľadáva väčšina ľudí"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Môže pomôcť preskočiť predošlý obsah"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Môže preskočiť na hlavný obsah alebo náhľad"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Živé vysielanie: oznamy a dary"
|
||||
},
|
||||
@@ -816,6 +897,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Zistiť viac"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Úplné podrobnosti"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Dá palec dole a vytvorí kópiu, aby ste mohli segment znova odoslať"
|
||||
},
|
||||
@@ -831,6 +915,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Týmto ihneď vykonáte zmeny v segmentoch"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Hlasovať proti"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Hlasovať za"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Skryť segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Čas môžete rýchlo zmeniť kolieskom myši, ak je kurzor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift."
|
||||
},
|
||||
@@ -844,5 +937,11 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Je zapnutý BETA server!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Otvoriť stránku s nastaveniami"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"fullName": {
|
||||
"message": "SponsorBlock for YouTube - Skip Sponsorships",
|
||||
"message": "SponsorBlock för YouTube - Hoppa över sponsringar",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Hoppa över sponsring, prenumerationstiggande och mer på YouTube-videor. Rapportera sponsorer på videor du tittar på för att spara andras tid.",
|
||||
"message": "Hoppa över sponsringar, prenumerationstiggande och mer på YouTube-videor. Rapportera sponsorer på videor du tittar på för att spara andras tid.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Servern sa att denna begäran var ogiltig"
|
||||
},
|
||||
"429": {
|
||||
"message": "Du har rapporterat för många sponsormeddelanden för den här videon, är du säker att det finns så många?"
|
||||
"message": "Du har skickat in för många sponsormeddelanden för den här videon. Är du säker på att det finns så många?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Den här har redan blivit rapporterad"
|
||||
"message": "Den här har redan skickats in"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanalen är vitlistad!"
|
||||
@@ -44,7 +44,7 @@
|
||||
"message": "Visa aldrig"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Tryck på Tillbaka för att ångra åtgärden."
|
||||
"message": "Tryck på Hoppa inte över för att återgå till där du kom i från."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Hoppa inte över"
|
||||
@@ -116,7 +116,7 @@
|
||||
"message": "Skicka in segment"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Är du säker på att du vill rapportera detta?"
|
||||
"message": "Är du säker på att du vill skicka in detta?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Vitlistkanal"
|
||||
@@ -150,7 +150,7 @@
|
||||
"message": "Rensa tider"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Skicka tider"
|
||||
"message": "Skicka in tider"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Detta kommer att användas på den publika statistiksidan för att visa hur mycket du har bidragit. Spana in den"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Kopiera publikt Användar-ID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Kopiera Segment-ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Gå med i den officiella discordservern för att ge förslag och feedback!"
|
||||
},
|
||||
@@ -183,7 +186,7 @@
|
||||
"message": "Detta döljer knapparna på YouTube-spelaren som du kan skicka in segment med som ska hoppas över."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Behåll knappen hoppa till markerat på spelaren"
|
||||
"message": "Behåll knappen hoppa till höjdpunkt på spelaren"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Visa Infoknapp På YouTube-spelaren"
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Visa ett meddelande efter att ett segment har hoppats över"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Visa kategorihjälp"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Hoppa över-meddelanden i fullstorlek"
|
||||
},
|
||||
@@ -280,7 +286,7 @@
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Skicka in segment",
|
||||
"message": "Skicka segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
@@ -497,7 +503,7 @@
|
||||
"message": "Denna JSON är inte korrekt formaterad. Dina alternativ har inte ändrats."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Skicka in segment"
|
||||
"message": "Skicka segment"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Skicka"
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "till",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Inkludera segmentövergångar"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Spelar som om ingenting hoppades över"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsormeddelande"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Betald marknadsföring, betalda hänvisningar och direktannonser, men inte till självbefodran eller gratis shoutouts till skapare/webbplatser/produkter de gillar."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Betalda kampanjer"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Inte för donationer eller anpassade varor"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Obetald/självbefodran"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Som \"sponsormeddelande\" men med undantag för obetald eller självkampanj. Detta inkluderar avsnitt om varor, donationer eller information om vem de samarbetade med."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Donationer, medlemskap och anpassade varor"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Gratis shoutouts som inte läggs till i videon"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Inte för företagsdesignade produkter och varor"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Exklusiv tillgång"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Denna video visar en produkt, tjänst eller plats som de har fått gratis eller subventionerad tillgång till",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Hela videon visar något med gratis eller subventionerad tillgång"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interaktionspåminnelse (Prenumerera)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "När där är en kort påminnelse att gilla, prenumerera eller följa dem. Om det är långt eller om det gäller något specifikt bör det istället vara under självbefodran."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Korta påminnelser om att gilla, prenumerera eller följa"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Inkluderar indirekta påminnelser att kommentera"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Inte för allmän marknadsföring, endast för uppmaningar"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Interaktionspåminnelse"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Uppehåll"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Intervall utan egentligt innehåll"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Inte för övergångar med information"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Slutkort/Credits"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Credits eller när YouTube-slutkort visas. Inte för slut med information."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Inkludera inte innehåll, även om slutkort visas på skärmen"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Förhandsgranska/sammanfatta"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Snabb sammanfattning av tidigare avsnitt eller en förhandsvisning av vad som kommer upp senare i den aktuella videon. Avsett för redigerade klipp, inte för sammanfattningar."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Klipp som visas senare, eller i en framtida video"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Sammanfattning av en tidigare video"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Inte för sektioner som lägger till ytterligare innehåll"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Ämnesavvikelse/Skämt"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Utfyllnad"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Tangentiella scener endast för utfyllnad eller humor"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Distraktioner, bloopers, repriser"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Inte för scener som krävs för att förstå ämnet"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musik: Icke-musikavsnitt"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Icke-musik"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Avsnitt som inte finns i officiella utgåvor"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Icke-musik i ett liveframträdande"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Markera"
|
||||
"message": "Höjdpunkt"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Den del av videon som de flesta letar efter. Liknande kommentarer \"Video börjar på x\"."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Avsnitt som de flesta personer letar efter"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Kan hoppa över sammanhang"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Kan hoppa över till titeln eller miniatyrbilden"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Liveström: Donations-/meddelandeavläsningar"
|
||||
},
|
||||
@@ -688,7 +769,7 @@
|
||||
"message": "Välj en kategori"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "För att skicka segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.",
|
||||
"message": "För att skicka in segment med kategorin \"{0}\" måste du först aktivera det i alternativen. Du kommer nu att bli omdirigerad till alternativen.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
@@ -864,8 +945,11 @@
|
||||
"LearnMore": {
|
||||
"message": "Läs mer"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Fullständiga detaljer"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Rösta ner och skapar en lokal kopia för dig att skicka igen"
|
||||
"message": "Rösta ner och skapar en lokal kopia för dig att skicka in igen"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Öppna denna kategoris wiki-sida."
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Detta kommer omedelbart att verkställas till dina segment"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Rösta ner"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Rösta upp"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Dölj segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Använd mushjulet medan du håller muspekaren över redigeringsrutan för att snabbt justera tiden. Kombinationer av CTRL- eller SKIFT-tangenten kan användas för att finjustera tiden."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Detta är en inbyggd YouTube-genväg. Är du säker på att du vill använda den?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA-servern är aktiverad!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Öppna alternativsidan"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Återställ inställningar till standard"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Är du säker på att du vill återställa alla inställningar till deras standardvärden? Detta kan inte ångras."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "பொது பயனர் IDயை நகலெடுக்கவும்"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "துண்டத்தின் IDஐ நகலெடு"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "பரிந்துரைகள் மற்றும் கருத்துக்களை வழங்க அதிகாரப்பூர்வ டிஸ்கார்ட் சேவையகத்தில் சேர வாருங்கள்!"
|
||||
},
|
||||
@@ -209,6 +212,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "தனிப்பட்ட/மறைநிலை தாவல்களில் ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கவும்"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "துண்டத்தின் வாக்கிறக்கங்களைச் சேமி"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "புதுப்பித்தப் பின் நீங்கள் வாக்கிறக்கிய துண்டங்கள் மறைந்தே இருக்கும்"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "எச்சரிக்கை: இதை முடக்குதல் முன்னர் சேமித்த எல்லா வாக்கிறக்கங்களையும் அழிக்கும்"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "ஹாஷ் முன்னொட்டு மூலம் வினவல்"
|
||||
},
|
||||
@@ -262,6 +274,18 @@
|
||||
"message": "உங்களுக்கு இன்னும் பிடிக்கவில்லை என்றால், ஒருபோதும் காண்பி பொத்தானை அழுத்தவும்.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "துண்டத்தைக் கெந்து",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "துண்டத்தை ஆரம்பி/நிறுத்து",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "துண்டங்களைச் சமர்ப்பி",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"0": {
|
||||
"message": "இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்."
|
||||
},
|
||||
@@ -287,6 +311,10 @@
|
||||
"mute": {
|
||||
"message": "ஒலியடக்கு"
|
||||
},
|
||||
"full": {
|
||||
"message": "முழு காணொளி",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "{0} ஐ தவிர்?"
|
||||
},
|
||||
@@ -444,6 +472,15 @@
|
||||
"exportOptions": {
|
||||
"message": "அனைத்து விருப்பங்களையும் இறக்குமதி / ஏற்றுமதி"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "திருத்து/நகலெடு"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "கோப்பிற்கு சேமி"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "கோப்பிலிருந்து ஏற்று"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "இது JSON இல் உங்கள் முழு உள்ளமைவு. இது உங்கள் பயனர் ஐடியை உள்ளடக்கியது, எனவே இதை புத்திசாலித்தனமாக பகிர்ந்து கொள்ளுங்கள்."
|
||||
},
|
||||
@@ -508,6 +545,9 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "செலுத்தப்படாத அல்லது சுய விளம்பரத்தைத் தவிர \"ஸ்பான்சர்\" போன்றது. பொருட்கள், நன்கொடைகள் அல்லது அவர்கள் யாருடன் ஒத்துழைத்தார்கள் என்பது பற்றிய தகவல்கள் இதில் அடங்கும்."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "பிரத்யேக அணுகல்"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "தொடர்பு நினைவூட்டல் (குழுசேர்)"
|
||||
},
|
||||
@@ -538,6 +578,9 @@
|
||||
"category_preview_description": {
|
||||
"message": "முந்தைய எபிசோடுகளின் விரைவான மறுபரிசீலனை அல்லது தற்போதைய வீடியோவில் பின்னர் என்ன வரப்போகிறது என்பதற்கான முன்னோட்டம். ஒன்றாக தொகுக்கப்பட்ட கிளிப்புகள், பேசப்பட்ட சுருக்கங்களுக்கு அல்ல."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "நிரப்பி"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "இசை: இசை அல்லாத பிரிவு"
|
||||
},
|
||||
@@ -571,6 +614,16 @@
|
||||
"disable": {
|
||||
"message": "முடக்கு"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "துவக்கத்திற்கு தானாகக் கெந்து"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "காணொளி ஏறுகையில் கேள்"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "சமர்ப்பிக்கப்படாதவை நிறம்",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "பார் வண்ணத்தைத் தேடுங்கள்"
|
||||
},
|
||||
@@ -615,6 +668,15 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "மறைக்கப்பட்ட: மிகக் குறுகிய"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "கைமுறையாக மறைக்கப்பட்டது"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "அனுமதியை ஏற்றுக்கொள்"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "அனுமதி கோரிக்கை வெற்றி!"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "தவிர்ப்பதற்கு முன் சேனல் சோதனை கட்டாயப்படுத்தவும்"
|
||||
},
|
||||
@@ -627,6 +689,9 @@
|
||||
"downvoteDescription": {
|
||||
"message": "தவறான / தவறான நேரம்"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "வகையை மாற்று"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "இந்த வீடியோ இசை என வகைப்படுத்தப்பட்டுள்ளது. இதற்கு ஒரு ஸ்பான்சர் இருப்பதை நீங்கள் உறுதியாக நம்புகிறீர்களா? இது உண்மையில் \"இசை அல்லாத பிரிவு\" என்றால், நீட்டிப்பு விருப்பங்களைத் திறந்து இந்த வகையை இயக்கவும். பின்னர், நீங்கள் இந்த பகுதியை ஸ்பான்சருக்கு பதிலாக \"இசை அல்லாதது\" என்று சமர்ப்பிக்கலாம். நீங்கள் குழப்பமாக இருந்தால் வழிகாட்டுதல்களைப் படிக்கவும்."
|
||||
},
|
||||
@@ -645,5 +710,82 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "அறிமுகங்கள், அவுட்ரோஸ், மெர்ச் போன்றவற்றைத் தவிர்க்க விருப்பங்களைத் திறக்கவும்."
|
||||
},
|
||||
"help": {
|
||||
"message": "உதவி"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "புரிந்தது",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "என்றென்றும் மறை"
|
||||
},
|
||||
"Donate": {
|
||||
"message": "கொடையளி"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "நன்கொடை இணைப்பை மறை"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "தெரிவுகள் பக்கத்தில் இருண்ட பயன்முறை"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "ஸ்பான்சர்ப்ளாக் நிறுவியதற்கு நன்றி."
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "தொடர்ந்து வாக்களி"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "இது உம் துண்டங்களை உடனடியாகச் செயல்படுத்தும்"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "வாக்கிறக்கு"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "வாக்கேற்று"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "துண்டத்தை மறை"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "நா",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "ம",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "நடத்தை",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "இடைமுகம்",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "விசைப்பலகை குறுக்குவழிகள்",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "காப்புநகல்/மீட்டெடுப்பு",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "இதர",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"notSet": {
|
||||
"message": "அமைக்கவில்லை"
|
||||
},
|
||||
"change": {
|
||||
"message": "மாற்று"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "பீட்டா சேவையகம் இயக்கப்பட்டுள்ளது!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "தெரிவுகள் பக்கத்தைத் திற"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"message": "Bu daha önce zaten gönderilmiş"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanal beyazlistede!"
|
||||
"message": "Kanala izin verildi!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "kısım"
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Herkese Açık Kullanıcı Kimliğini Kopyala"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Segment Kimliğini Kopyala"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Öneri ve geri bildirimleriniz için resmi Discord serverımıza katılın!"
|
||||
},
|
||||
@@ -236,6 +239,9 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Bir Kısmı Atladıktan Sonra Uyarı Göster"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "Kategori Yardımını Göster"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Tam Boyutlu Atlama Bildirimleri"
|
||||
},
|
||||
@@ -539,18 +545,39 @@
|
||||
"message": "'e",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "Segue geçişlerini dahil et"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "Hiçbir şey atlanmamış gibi oynuyor"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Ücretli tanıtım, ücretli yönlendirmeler ve doğrudan reklamlar. Kendini pazarlayan veya beğendiği içerik üreticilerine/sitelere/ürünlere atıfta bulunanlar için değil."
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "Ücretli promosyonlar"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "Bağışlar veya özel ürünler için değil"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Karşılıksız/Kendi Reklamı"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "\"Sponsor\" seçeneğinden farkı para karşılığı olmaması veya kendi reklamını yapmasıdır. Buna kendi markalı ürünlerini satmak, bağış toplamak ve videoda işbirliği yaptığı kimselerden bahsetmek dahildir."
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "Bağışlar, üyelikler ve özel ürünler"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "Videoya eklenmeyen ücretsiz konuşmalar"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "Kurumsal tasarım ürünleri ve malları için değil"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Özel Erişim"
|
||||
},
|
||||
@@ -561,12 +588,24 @@
|
||||
"message": "Bu video; yayıncıya özel ücretle veya ücretsiz sunulan bir ürünün, hizmetin veya bir yerin reklamını yapıyor",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "Tüm video, ücretsiz veya sübvansiyonlu erişime sahip bir şeyi sergiliyor"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Etkileşim Hatırlatıcısı (Abonelik)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Videonun ortasında beğenmek, abone olmak veya takip etmek için kısa bir hatırlatma olan kısımdır. Eğer süresi uzunsa veya belirli bir şey hakkındaysa, kendi reklamını yapan kategorisi seçilmelidir."
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "Beğenmek, abone olmak veya takip etmek için kısa hatırlatıcılar"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "Yorum yapmak için dolaylı hatırlatıcılar içerir"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "Genel tanıtım için değil, yalnızca harekete geçirici mesajlar"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Etkileşim Hatırlatıcısı"
|
||||
},
|
||||
@@ -579,18 +618,36 @@
|
||||
"category_intro_short": {
|
||||
"message": "Aralık"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "Gerçek içerik olmayan aralık"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "Bilgi içeren geçişler için değil"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Bitiş Ekranı/Jenerik"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Videoda emeği geçenlerin veya video sonunda çıkan kartların gösterildiği kısımlar. Bilgilendirici sona sahip videolar için değil."
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "Bitiş kartları ekranda olsa bile içerik eklemeyin"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Ön İzleme/Özet"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Önceki bölümlerin bir özeti veya geçerli videonun içeriğine yönelik bir ön izleme. Bu özellik birleştirilmiş klipler içindir, konuşarak anlatılan özetleri kapsamaz."
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "Daha sonra veya gelecekteki bir videoda görünen klipler"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "Bir önceki videonun özeti"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "Ek içerik ekleyen bölümler için değil"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Konuyla Alakasız / Şaka"
|
||||
},
|
||||
@@ -600,6 +657,15 @@
|
||||
"category_filler_short": {
|
||||
"message": "Alakasız Konu"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "Yalnızca dolgu veya mizah için teğet sahneler"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "Dikkat dağıtıcı şeyler, hatalar, tekrarlar"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "Konuyu anlamak için gerekli sahneler için değil"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Müzik: Müzik Olmayan Bölüm"
|
||||
},
|
||||
@@ -609,12 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Müzik Olmayan Bölüm"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "Resmi sürümlerde olmayan bölümler"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "Canlı performansta müzik dışı"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Vurgu"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Videoda, çoğu insanın aradığı kısım. \"Video x sürede başlıyor\" yorumlarına benzer."
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "Çoğu kişinin aradığı bölüm"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "Bağlamı atlayabilir"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "Başlığa veya küçük resme atlayabilir"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Canlı Yayın: Bağış/Mesaj Okuma"
|
||||
},
|
||||
@@ -817,19 +898,19 @@
|
||||
"message": "Atlama nasıl çalışıyor"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Video kısımları veri tabanında mevcut ise otomatikman atlanır. Eklentinin simgesine tıklayınca açılan pencereden, video için mevcut olan kısımları görebilirsiniz."
|
||||
"message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Bir kısmı atladığınızda size bildirim gönderilir. Eğer kısım hatalıysa bunu eksi oylayınız. Eklentinin penceresinde de oy verebilirsiniz."
|
||||
"message": "Når du springer et segment over, får du besked, når du springer et segment over. Hvis timingen virker forkert, kan du stemme ned ved at klikke på downvote! Du kan også stemme i popup-vinduet."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Gönderme"
|
||||
"message": "Submitting"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Gönderi, açılır pencerede \"Kısım Şimdi Başlıyor\" düğmesine basılarak veya oynatıcıdaki düğmelerle video oynatıcıda yapılabilir."
|
||||
"message": "Indsendelse kan enten ske i popup-vinduet ved at trykke på \"Segment Begynder Nu\"-knappen eller i videoafspilleren med knapperne på afspilleren."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Oynat düğmesine tıklamak bir kısımın başlangıcını, durdurma simgesine tıklamak ise bitişini gösterir. Gönder düğmesine basmadan önce birden fazla sponsor hazırlayabilirsiniz. Yükle düğmesine tıklamak kısımları gönderir. Çöp kutusuna tıkladığınızda silinir."
|
||||
"message": "Clicking the play button indicated the start of a segment and clicking the stop icon indicates the end. You can prepare multiple sponsors before hitting submit. Clicking the upload button will submit. Clicking the garbage can will delete."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Düzenleme"
|
||||
@@ -864,6 +945,9 @@
|
||||
"LearnMore": {
|
||||
"message": "Dahasını Öğren"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "Tüm Detaylar"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Olumsuz oy verir ve yeni bir kısım seçmeniz için bir kopya oluşturur"
|
||||
},
|
||||
@@ -879,6 +963,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Bu, kısımlarınız için anında geçerli olur"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Eksi oy"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Olumlu oy"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Segmenti gizleyin"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Zaman aralığını hızlı bir şekilde ayarlamak için düzenleme kutusunun üzerinde fare tekerini kullanın. Değişikliklere ince ayar yapmak için ctrl veya shift tuşunun kombinasyonları kullanılabilir."
|
||||
},
|
||||
@@ -929,5 +1022,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Bu kısayol YouTube tarafından kullanılıyor. Bunu kullanmak istediğinize emin misiniz?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA Sunucusu etkinleştirildi!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Seçenekler sayfasını aç"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Ayarları varsayılana sıfırla"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Tüm ayarları varsayılan değerlerine sıfırlamak istediğinizden emin misiniz? Bu geri alınamaz."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Копіювати публічний UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Копіювати ID сегменту"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Приєднуйтесь до офіційного сервера Discord, щоб залишити пропозиції і зворотний зв'язок!"
|
||||
},
|
||||
@@ -879,6 +882,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Це миттєво буде застосовано до ваших сегментів"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Голос \"проти\""
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Голос \"за\""
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Приховати сегмент"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін."
|
||||
},
|
||||
@@ -929,5 +941,17 @@
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Це вбудована комбінація YouTube. Ви впевнені що хочете її використовувати?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "BETA сервер увімкнено!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Відкрити сторінку налаштувань"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "Повернутись до стандартних налаштувань"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "Ви впевнені, що хочете скинути всі налаштування до значень за замовчуванням? Це не можна буде скасувати."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,9 @@
|
||||
"copyPublicID": {
|
||||
"message": "Sao chép Public UserID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "Sao chép ID phân đoạn"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Hãy tham gia server Discord chính thức để đưa ra gợi ý và phản hồi!"
|
||||
},
|
||||
@@ -209,6 +212,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Bật việc theo dõi số lượng người bỏ qua phân đoạn trong tab Riêng tư/Ẩn danh"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Lưu trữ phiếu phản đối phân đoạn"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Bất kỳ phân đoạn nào bạn phản đối sẽ vẫn bị ẩn ngay cả sau khi làm mới"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Cảnh báo: Tắt tính năng này sẽ xóa tất cả các phiếu phản đối đã lưu trữ trước đó"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Truy vấn theo Hash Prefix"
|
||||
},
|
||||
@@ -262,6 +274,21 @@
|
||||
"message": "Nếu bạn vẫn không thích, hãy nhấn nút không hiển thị lại.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Bỏ qua phân đoạn",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Bắt đầu/dừng phân đoạn",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Gửi phân đoạn",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Chọn một phím bằng cách nhập nó và chọn bất kỳ phím bổ trợ nào bạn muốn sử dụng."
|
||||
},
|
||||
"0": {
|
||||
"message": "Kết nối quá hạn thời gian. Hãy kiểm tra đường truyền mạng của bạn. Nếu mạng của bạn vẫn hoạt động, có thể máy chủ đang bị quá tải hoặc không hoạt động."
|
||||
},
|
||||
@@ -421,6 +448,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Đoạn quảng cáo sau ngắn hơn tùy chọn độ dài ngắn nhất của bạn. Điều này có thể có nghĩa là nó đã được đăng rồi, và không được bỏ qua vì tùy chọn này. Bạn có chắc muốn đăng nó không?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Không được phép gửi trên một buổi phát trực tiếp hoặc buổi ra mắt đang hoạt động. Vui lòng đợi cho đến khi kết thúc, sau đó làm mới trang xác minh rằng các phân đoạn vẫn hợp lệ."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Hiển thị nút tải lên"
|
||||
},
|
||||
@@ -448,6 +478,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Nhập/xuất tất cả tùy chọn"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Chỉnh sửa/sao chép"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Lưu vào tệp"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Tải từ tệp"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Đây là toàn bộ cấu hình của bạn trong tệp JSON. Nó chứa cả mã người dùng của bạn, nên hãy chia sẻ cẩn thận."
|
||||
},
|
||||
@@ -496,6 +535,9 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Thông tin gỡ lỗi đã được sao chép vào bộ nhớ tạm. Hãy thoải mái xóa thông tin mà bạn không muốn chia sẻ. Lưu thông tin này vào một tập tin văn bản hoặc dán nó vào bản báo cáo lỗi."
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "Phím tắt này liên kết với một hành động khác. Vui lòng chọn một cái khác."
|
||||
},
|
||||
"to": {
|
||||
"message": "đến",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -515,6 +557,13 @@
|
||||
"category_exclusive_access": {
|
||||
"message": "Truy cập riêng"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Chỉ để dán nhãn cho toàn bộ video. Được sử dụng khi video giới thiệu một sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Video này giới thiệu sản phẩm, dịch vụ hoặc vị trí mà họ đã nhận được quyền truy cập miễn phí hoặc được trợ cấp",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Nhắc tương tác (Đăng ký)"
|
||||
},
|
||||
@@ -593,12 +642,19 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Hiện ở thanh xem trước"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Hiển thị nhãn"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Tự động bỏ qua tất cả các phân đoạn nếu trong video có phân đoạn không phải nhạc"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Cho phép các phân đoạn bị tắt tiếng hay vì bỏ qua"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "Hiển thị biểu tượng khi video hoàn toàn là quảng cáo",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Màu khi chưa được gửi đi",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -650,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "đã bị ẩn: quá ngắn"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "ẩn thủ công"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "Không xác định được ID kênh. Nếu bạn đang xem video này trên 1 trang web thứ 3, hãy mở lại video này trên trang chủ Youtube rồi thử lại. Điều này cũng có thể do những thay đổi trong mã nguồn trang web YouTube, nếu bạn nghĩ vậy, hãy bình luận tại đây:"
|
||||
@@ -713,6 +772,9 @@
|
||||
"message": "Đã hiểu",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Phân đoạn này là lớn. Nếu toàn bộ video nói về một chủ đề, hãy chuyển từ \"Bỏ qua\" thành \"Toàn bộ video\". Xem hướng dẫn để biết thêm thông tin."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Toàn bộ video này được gắn thẻ vào thể loại này và được tích hợp quá chặt chẽ để có thể tách ra"
|
||||
},
|
||||
@@ -733,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Ủng hộ"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Hỗ trợ phát triển cấp quỹ"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ẩn link donate"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Chế độ tối trên trang tùy chọn"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Cảm ơn bạn đã cài đặt SponsorBlock."
|
||||
},
|
||||
@@ -811,6 +879,15 @@
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Điều này sẽ ngay lập tức áp dụng cho phân đoạn của bạn"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "Phản đối"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "Bình chọn"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "Ẩn phân đoạn"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Sử dụng con lăn chuột của bạn khi di chuột qua hộp chỉnh sửa để nhanh chóng điều chỉnh thời gian. Kết hợp phím ctrl hoặc shift có thể được sử dụng để tinh chỉnh các thay đổi."
|
||||
},
|
||||
@@ -824,5 +901,48 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Hành vi",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "Giao diện",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "Phím tắt bàn phím",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "Sao lưu/Khôi phục",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Điều khoản khác",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"noticeVisibilityLabel": {
|
||||
"message": "Bỏ qua thông báo xuất hiện",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Gỡ liên kết",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Chưa thiết lập"
|
||||
},
|
||||
"change": {
|
||||
"message": "Thay đổi"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Đây là lối tắt YouTube được tích hợp sẵn. Bạn có chắc chắn muốn sử dụng nó không?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "Máy chủ BETA đã được kích hoạt!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "Mở trang tùy chọn"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,6 +161,12 @@
|
||||
"setUsername": {
|
||||
"message": "設定使用者名稱"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "複製公開使用者ID"
|
||||
},
|
||||
"copySegmentID": {
|
||||
"message": "複製片段ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "快加入官方 Discord 伺服器來給予建議和反應!"
|
||||
},
|
||||
@@ -179,6 +185,9 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "這會隱藏 YouTube 播放器上提交片段的按鈕"
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "在播放器保留跳至精華按鈕"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "在 YouTube 播放器上顯示資訊按鈕"
|
||||
},
|
||||
@@ -203,6 +212,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "在私人/無痕分頁啟用跳過次數追蹤"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "儲存片段倒讚"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "所有你按倒讚的片段在重新整理後仍會保留"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "警告:停用此將刪除所有之前儲存的倒讚"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "使用雜湊前綴查詢"
|
||||
},
|
||||
@@ -221,6 +239,24 @@
|
||||
"showSkipNotice": {
|
||||
"message": "在跳過片段後顯示通知"
|
||||
},
|
||||
"showCategoryGuidelines": {
|
||||
"message": "顯示分類說明"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "完整大小的略過提醒"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "小的自動略過提醒"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "所有小的略過提醒"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "消逝的自動跳過提醒"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "所有消逝的略過提醒"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock 讓您可以跳過贊助工商,開場動畫,結束動畫,訂閱提醒等煩人的 YouTube 影片片段。SponsorBlock 是個大眾外包的網頁瀏覽器擴充功能,能讓任何人提交贊助片段的始與末。當一個人提交這個片段後,所有使用這個擴充功能的人都可以跳過該片段。您也可以跳過在音樂中的非音樂片段",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -241,6 +277,21 @@
|
||||
"message": "如果您還是不喜歡它,請按下永不顯示按鈕",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "略過片段",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "開始/停止片段",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "提交片段",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "按下按鍵以選擇並選擇想要使用的修飾鍵"
|
||||
},
|
||||
"0": {
|
||||
"message": "連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線"
|
||||
},
|
||||
@@ -266,16 +317,32 @@
|
||||
"mute": {
|
||||
"message": "靜音"
|
||||
},
|
||||
"full": {
|
||||
"message": "整部影片",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "跳過 {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "要靜音 {0} 嗎?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "跳到 {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} 已略過",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} 已靜音",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "已跳到 {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "停用自動跳過"
|
||||
},
|
||||
@@ -323,6 +390,9 @@
|
||||
"changeUserID": {
|
||||
"message": "匯入/匯出您的使用者 ID"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "密鑰應被保密。它就像是密碼,不應與他人分享。若密鑰落入他人手中,他人將可以冒充你。若你在尋找你的公開使用者ID,點擊彈出視窗上的剪貼簿圖示"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "設定使用者 ID"
|
||||
},
|
||||
@@ -348,6 +418,9 @@
|
||||
"addInvidiousInstance": {
|
||||
"message": "新增第三方的客戶端實例"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "添加一個自定進程。它必須只有域名。例如:invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "新增"
|
||||
},
|
||||
@@ -378,6 +451,9 @@
|
||||
"shortCheck": {
|
||||
"message": "以下的提交小於您的最小時間設定。這表是它們可能已經被提交,只是被該設定忽略了。您確定要提交嗎?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "在進行中的直播或首播提交片段是不被允許的。請等到該直播完成後,重新整理頁面再重新確認片段並提交。"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "顯示上傳按鈕"
|
||||
},
|
||||
@@ -405,6 +481,15 @@
|
||||
"exportOptions": {
|
||||
"message": "匯入/匯出所有設定"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "編輯/複製"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "儲存到檔案"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "從檔案載入"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "這是您全部設定的 JSON 格式。它包含了您的用戶 ID ,所以您一定要謹慎的保管它。"
|
||||
},
|
||||
@@ -453,28 +538,74 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "除錯資訊已複製到剪貼板中。您可以任意移除任何您不想分享的資訊。請將其另存為文字文件或貼到錯誤報告中。"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "這個快捷鍵已被綁定到另一個動作,請另擇快捷鍵。"
|
||||
},
|
||||
"to": {
|
||||
"message": "到",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"generic_guideline1": {
|
||||
"message": "包含轉場"
|
||||
},
|
||||
"generic_guideline2": {
|
||||
"message": "如同沒有略過任何片段般播放"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "贊助廣告"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "有收錢的工商廣告和直接廣告。不是為了自我推銷或為了其他創作的免費推銷"
|
||||
},
|
||||
"category_sponsor_guideline1": {
|
||||
"message": "付費促銷"
|
||||
},
|
||||
"category_sponsor_guideline2": {
|
||||
"message": "並非捐款或客製週邊商品"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "非付費/自我推廣"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "類似 “贊助商廣告” ,但是非付費或自我推廣。這包括有關商品、捐贈或與他人合作的信息。"
|
||||
},
|
||||
"category_selfpromo_guideline1": {
|
||||
"message": "贊助、會員或客製週邊商品"
|
||||
},
|
||||
"category_selfpromo_guideline2": {
|
||||
"message": "與影片無關之免費的推廣"
|
||||
},
|
||||
"category_selfpromo_guideline3": {
|
||||
"message": "不是企業設計的商品和週邊商品"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "獨家限定"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "只限於標記整部影片,用於影片在獲得特殊或免費存取後,展示產品、服務或位置時使用。"
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "此影片展示了獲得特殊或免費存取的產品、服務或位置",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_exclusive_access_guideline1": {
|
||||
"message": "整部影片在展示收到的免費或付費存取權"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "互動提醒 (訂閱)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "當有短提醒來請觀眾按讚、訂閱或跟隨他們時。如果該片段很長或很針對某事,它應該歸類為自我推銷。"
|
||||
},
|
||||
"category_interaction_guideline1": {
|
||||
"message": "要求點讚、訂閱或跟隨的短暫提醒"
|
||||
},
|
||||
"category_interaction_guideline2": {
|
||||
"message": "包含要求評論的非直接提醒"
|
||||
},
|
||||
"category_interaction_guideline3": {
|
||||
"message": "並非一般促銷、只限於要求進行某動作"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "互動提醒"
|
||||
},
|
||||
@@ -487,18 +618,54 @@
|
||||
"category_intro_short": {
|
||||
"message": "開場"
|
||||
},
|
||||
"category_intro_guideline1": {
|
||||
"message": "無實際內容的片段"
|
||||
},
|
||||
"category_intro_guideline2": {
|
||||
"message": "不是含有資訊的轉場"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "結束畫面/鳴謝"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "鳴謝或當 YouTube 結尾資訊卡出現時。不是含有資訊的總結"
|
||||
},
|
||||
"category_outro_guideline1": {
|
||||
"message": "即使結尾的資訊卡已開始顯示也不應包含內容"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "預覽/摘要"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "係指影片的前情提要或內容預告等刻意編輯過的內容"
|
||||
},
|
||||
"category_preview_guideline1": {
|
||||
"message": "出現在後面或未來影片的片段"
|
||||
},
|
||||
"category_preview_guideline2": {
|
||||
"message": "上一部影片的回顧"
|
||||
},
|
||||
"category_preview_guideline3": {
|
||||
"message": "不是有額外內容的部分"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "離題閒聊/玩笑"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "與影片主要內容無關的填充詞或笑話,但不應包含與前後或背景有關者"
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "填充詞"
|
||||
},
|
||||
"category_filler_guideline1": {
|
||||
"message": "為了幽默而離題的片段"
|
||||
},
|
||||
"category_filler_guideline2": {
|
||||
"message": "分心、失誤、重播"
|
||||
},
|
||||
"category_filler_guideline3": {
|
||||
"message": "不是需要觀看才能理解主題的片段"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "音樂:非音樂部分"
|
||||
},
|
||||
@@ -508,9 +675,27 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "非音樂"
|
||||
},
|
||||
"category_music_offtopic_guideline1": {
|
||||
"message": "不在官方釋出內容的片段"
|
||||
},
|
||||
"category_music_offtopic_guideline2": {
|
||||
"message": "在現場演出的非音樂片段"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "重點"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "大部分的人在影片尋找的部分。類似「影片在幾分幾秒開始」的留言"
|
||||
},
|
||||
"category_poi_highlight_guideline1": {
|
||||
"message": "大部分觀眾想要看的部分"
|
||||
},
|
||||
"category_poi_highlight_guideline2": {
|
||||
"message": "可以幫助略過前後文"
|
||||
},
|
||||
"category_poi_highlight_guideline3": {
|
||||
"message": "可以跳過到標題或縮圖的內容"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "直播:捐贈/訊息閱讀"
|
||||
},
|
||||
@@ -529,9 +714,28 @@
|
||||
"disable": {
|
||||
"message": "停用"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "自動略過至開頭"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "在影片載入時詢問"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "在時間條顯示"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "顯示標籤"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "自動跳過非音樂片段(如果有的話)"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "允許靜音式片段"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "在整個影片都是廣告時顯示圖示",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "未提交的顏色",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -568,6 +772,9 @@
|
||||
"message": "若想要提交{0} 類的分段,您必須要在選項內將其啟用。您現在將被重新導向至選項頁面。",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "注意:這種片段同時只能有一個啟用,提交多個片段將顯示隨機一個"
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "您必須為所有您要提交的片段選擇類別!"
|
||||
},
|
||||
@@ -580,6 +787,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "隱藏:太短"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "手動隱藏"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "未偵測到頻道ID,如果您正在使用嵌入式YouTube播放器,請移至YouTube網站上觀看本影片。此問題亦有可能是由於YouTube改變了系統架構,如果你認為這是造成此問題的原因,請留言告訴我們:"
|
||||
@@ -614,6 +824,9 @@
|
||||
"downvoteDescription": {
|
||||
"message": "不正確/錯誤的時間"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "變更類別"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "這個影片被分類為音樂。您確定這有贊助內容嗎?如果這其實是\"非音樂片段\"的話,開啟擴充功能設定並啟用這個類別。接下來您即可提交這個片段為\"非音樂片段\"。如果您感到困惑,請閱讀方針"
|
||||
},
|
||||
@@ -640,6 +853,12 @@
|
||||
"message": "知道了",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "這個片段有點長,如果整部影片都跟一個主題有關,請將「跳過」改為「整部影片」。請參照方針以獲得更多資訊"
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "這整部影片都被標示為此類別且過於相關而不可分開"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "關閉所有未來的實驗性功能",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
@@ -647,21 +866,130 @@
|
||||
"hideForever": {
|
||||
"message": "永久隱藏"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "你被記了警告所以暫時不能提交片段。這意味著我們注意到你在犯下常見的但不是可疑的錯誤,請確認你真的瞭解方針之內容後我們就會移除警告。你也可以加入 discord.gg/SponsorBlock 或 matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "投票因警告而被駁回。點擊以打開聊天室並解決之",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "贊助"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "資助開發"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "隱藏贊助選項"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "選項頁面深色模式"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "感謝你安裝 SponsorBlock。"
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "請確認以下選項"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "許多功能預設為停用,若欲跳過開頭、結尾或使用Invidious等,在下方啟用它們。你也可以隱藏/顯示介面內容"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "略過如何運作"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "影片片段如果出現於資料庫將自動被略過,你可以點擊擴充功能圖示以打開浮窗以便預覽"
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "當你略過片段時,你會被提醒。若你認為跳過時間有誤,請按下倒讚以反對之。你也可以用浮窗投票。"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "正在提交"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "提交可以透過在浮窗內點擊「片段由此開始」按鈕或在影片播放器中的按鈕執行"
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "點擊播放按鈕表示片段的開始,停止按鈕表示結束。你可以在提交前設定多個片段。點擊上傳按鈕將會提交片段,點擊垃圾桶按鈕將會刪除片段"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "編輯中"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "若你失誤了,你可以按下箭頭向上按鍵以編輯或刪除你的片段"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "這太慢了"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "快捷鍵是被支援的,按下分號以標示片段的開始或結束,並按下逗號以提交。你可以在選項裡更改快捷鍵設定。若你不是用QWERTY鍵盤的話,你應該更改設定。"
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "我可以下載資料庫嗎?作者消失怎麼辦?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "資料庫是公開的且可以在這取用:"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "原始碼是公開的,若作者發生狀況,你的提交將不會化為烏有"
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "消息和製作過程"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "我在哪裡可以找到原始碼?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "致謝"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "了解更多"
|
||||
},
|
||||
"FullDetails": {
|
||||
"message": "完整詳細資料"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "按倒讚和建立本機副本以便你重新提交"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "打開此類別之維基頁面"
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "複製並按倒讚"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "繼續投票"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "這將會立即套用至你的片段"
|
||||
},
|
||||
"downvote": {
|
||||
"message": "按倒讚"
|
||||
},
|
||||
"upvote": {
|
||||
"message": "按讚"
|
||||
},
|
||||
"hideSegment": {
|
||||
"message": "隱藏片段"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "在滑鼠鼠標放在編輯框上時使用滾輪以快速調製時間。Ctrl和Shift可以用於精密調整"
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "新功能》知道整部影片是不是贊助或自我推廣"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "天",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "小時",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "行為",
|
||||
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabInterface": {
|
||||
"message": "介面",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
@@ -670,8 +998,41 @@
|
||||
"message": "鍵盤快捷鍵",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "備份/還原",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "其他",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"noticeVisibilityLabel": {
|
||||
"message": "略過通知外觀",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "取消綁定",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "未設定"
|
||||
},
|
||||
"change": {
|
||||
"message": "更改"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "這是YouTube內建捷徑,你真的要取代它嗎?"
|
||||
},
|
||||
"betaServerWarning": {
|
||||
"message": "測試版伺服器已啟用!"
|
||||
},
|
||||
"openOptionsPage": {
|
||||
"message": "打開選項頁面"
|
||||
},
|
||||
"resetToDefault": {
|
||||
"message": "重設設定為預設值"
|
||||
},
|
||||
"confirmResetToDefault": {
|
||||
"message": "你確定要將所有設定重設為預設值嗎?此動作無法還原。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,10 @@
|
||||
transition: transform .1s cubic-bezier(0,0,0.2,1);
|
||||
}
|
||||
|
||||
.ytm-progress-bar > #previewbar {
|
||||
height: 3px;
|
||||
}
|
||||
|
||||
#previewbar.hovered {
|
||||
transform: scaleY(1)
|
||||
}
|
||||
@@ -152,9 +156,6 @@
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeParent, .sponsorSkipNotice {
|
||||
min-width: 350px;
|
||||
max-width: 50%;
|
||||
|
||||
border-spacing: 5px 10px;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
@@ -162,6 +163,15 @@
|
||||
border-collapse: unset;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeParent {
|
||||
min-width: 350px;
|
||||
max-width: 50%;
|
||||
}
|
||||
|
||||
.sponsorSkipNotice {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeTableContainer {
|
||||
background-color: rgba(28, 28, 28, 0.9);
|
||||
border-radius: 5px;
|
||||
@@ -173,7 +183,7 @@
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeLimitWidth {
|
||||
min-width: calc(100% - 50px);
|
||||
max-width: calc(100% - 50px);
|
||||
}
|
||||
|
||||
.sponsorSkipNotice .hidden {
|
||||
@@ -343,13 +353,20 @@
|
||||
color: rgb(235, 235, 235);
|
||||
}
|
||||
|
||||
.voteButton {
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
cursor: pointer;
|
||||
.sb-guidelines-notice .sponsorTimesInfoMessage td {
|
||||
padding-left: 5px;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 2px;
|
||||
font-size: 15px;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.voteButton:hover {
|
||||
filter: brightness(80%);
|
||||
|
||||
.sponsorTimesInfoIcon {
|
||||
width: 30px;
|
||||
padding-right: 10px;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.segmentSummary {
|
||||
@@ -523,7 +540,7 @@ input::-webkit-inner-spin-button {
|
||||
position: absolute;
|
||||
}
|
||||
.helpButton:hover {
|
||||
filter: brightness(80%);
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
.sbChatNotice iframe {
|
||||
@@ -653,3 +670,11 @@ input::-webkit-inner-spin-button {
|
||||
.sponsorBlockCategoryPill:hover .categoryPillClose {
|
||||
display: inherit;
|
||||
}
|
||||
|
||||
/* tweak for mobile duration */
|
||||
#sponsorBlockDurationAfterSkips.ytm-time-display {
|
||||
padding-left: 4px;
|
||||
margin: 0px;
|
||||
color: #fff;
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
37
public/icons/bolt.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="bolt.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M19.95 42 22 27.9H14.7Q14.15 27.9 13.9 27.4Q13.65 26.9 13.9 26.45L26.15 6H28.2L26.15 20.05H33.35Q33.9 20.05 34.175 20.55Q34.45 21.05 34.2 21.5L22 42Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
37
public/icons/campaign.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="campaign.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M36.5 25.5V22.5H44V25.5ZM39 40 32.95 35.5 34.75 33.1 40.8 37.6ZM34.9 14.85 33.1 12.45 39 8 40.8 10.4ZM10.5 38V30H7Q5.75 30 4.875 29.125Q4 28.25 4 27V21Q4 19.75 4.875 18.875Q5.75 18 7 18H16L26 12V36L16 30H13.5V38ZM28 30.7V17.3Q29.35 18.5 30.175 20.225Q31 21.95 31 24Q31 26.05 30.175 27.775Q29.35 29.5 28 30.7Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
38
public/icons/check-smaller.svg
Normal file
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="check-smaller.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="26.25"
|
||||
inkscape:cx="12.038095"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d="M 17.69347,4.9833775 9.9421192,12.940517 6.3065298,9.5107153 3.7684768,12.048769 9.9421192,18.016623 20.231523,7.5214304 Z"
|
||||
id="path2"
|
||||
style="stroke-width:0.68596" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
37
public/icons/close-smaller.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="close-smaller.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="731"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M12.45 37.65 10.35 35.55 21.9 24 10.35 12.45 12.45 10.35 24 21.9 35.55 10.35 37.65 12.45 26.1 24 37.65 35.55 35.55 37.65 24 26.1Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
37
public/icons/lightbulb.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="lightbulb.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M24 44Q22.3 44 21.125 42.825Q19.95 41.65 19.95 39.95H28.05Q28.05 41.65 26.875 42.825Q25.7 44 24 44ZM15.9 36.85V33.85H32.1V36.85ZM16.15 30.8Q12.85 28.65 10.925 25.425Q9 22.2 9 18.15Q9 12.05 13.45 7.6Q17.9 3.15 24 3.15Q30.1 3.15 34.55 7.6Q39 12.05 39 18.15Q39 22.2 37.1 25.425Q35.2 28.65 31.85 30.8Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
37
public/icons/money.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="money.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="6.5625"
|
||||
inkscape:cx="37.942857"
|
||||
inkscape:cy="29.714286"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="731"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M 22.070204,47.757552 V 42.214123 Q 18.308592,41.554191 15.89984,39.343419 13.491088,37.132647 12.435197,33.766994 l 3.695619,-1.517844 q 1.121884,3.167674 3.233667,4.718514 2.111782,1.55084 5.081476,1.55084 3.167674,0 5.213463,-1.583837 2.045789,-1.583837 2.045789,-4.355551 0,-2.903701 -1.814813,-4.487538 -1.814813,-1.583836 -6.830296,-3.233666 -4.75151,-1.517844 -7.094269,-4.025586 -2.342759,-2.507741 -2.342759,-6.269354 0,-3.629626 2.342759,-6.0713741 2.342759,-2.4417484 6.104371,-2.7717144 V 0.24244792 h 3.959592 V 5.7198835 q 2.969694,0.329966 5.114473,1.9467994 2.144779,1.6168335 3.266663,4.1245751 l -3.695619,1.583837 q -0.923905,-2.111783 -2.474745,-3.068684 -1.55084,-0.9569014 -4.058582,-0.9569014 -3.035687,0 -4.817503,1.3858574 -1.781817,1.385857 -1.781817,3.761612 0,2.507742 1.979796,4.058582 1.979796,1.55084 7.325246,3.20067 4.487537,1.385857 6.632316,3.992589 2.144779,2.606731 2.144779,6.566323 0,4.157572 -2.441748,6.69831 -2.441749,2.540738 -7.193259,3.266663 v 5.477436 z"
|
||||
id="path2"
|
||||
style="fill:#ffffff;stroke-width:1.31986" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.0 KiB |
37
public/icons/music-note.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="music-note.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M19.65 42Q16.5 42 14.325 39.825Q12.15 37.65 12.15 34.5Q12.15 31.35 14.325 29.175Q16.5 27 19.65 27Q21.05 27 22.175 27.4Q23.3 27.8 24.15 28.5V6H35.85V12.75H27.15V34.5Q27.15 37.65 24.975 39.825Q22.8 42 19.65 42Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
37
public/icons/right-arrow.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="right-arrow.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24.07619"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M 17.039265,39.62264 14.838095,37.382164 28.320259,23.9 14.838095,10.417836 17.039265,8.1773601 32.761905,23.9 Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff;stroke-width:0.786132" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
public/icons/segway.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
37
public/icons/star.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="star.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M11.65 44 16.3 28.8 4 20H19.2L24 4L28.8 20H44L31.7 28.8L36.35 44L24 34.6Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
37
public/icons/stopwatch.svg
Normal file
@@ -0,0 +1,37 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="stopwatch.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.125"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="482"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M14.45 34Q16.3 35.95 18.8 36.975Q21.3 38 24 38Q29.85 38 33.925 33.925Q38 29.85 38 24Q38 18.15 33.925 14.075Q29.85 10 24 10V24ZM24 44Q19.75 44 16.1 42.475Q12.45 40.95 9.75 38.25Q7.05 35.55 5.525 31.9Q4 28.25 4 24Q4 19.8 5.525 16.15Q7.05 12.5 9.75 9.8Q12.45 7.1 16.1 5.55Q19.75 4 24 4Q28.2 4 31.85 5.55Q35.5 7.1 38.2 9.8Q40.9 12.5 42.45 16.15Q44 19.8 44 24Q44 28.25 42.45 31.9Q40.9 35.55 38.2 38.25Q35.5 40.95 31.85 42.475Q28.2 44 24 44Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
@@ -176,6 +176,18 @@
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div data-type="toggle" data-sync="showCategoryGuidelines">
|
||||
<div class="switch-container">
|
||||
<label class="switch">
|
||||
<input id="showCategoryGuidelines" type="checkbox" checked>
|
||||
<span class="slider round"></span>
|
||||
</label>
|
||||
<label class="switch-label" for="showCategoryGuidelines">
|
||||
__MSG_showCategoryGuidelines__
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-type="toggle" data-toggle-type="reverse" data-sync="hideVideoPlayerControls">
|
||||
<div class="switch-container">
|
||||
<label class="switch">
|
||||
@@ -368,6 +380,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div data-type="button-press" data-sync="resetToDefault" data-confirm-message="confirmResetToDefault">
|
||||
<div class="option-button trigger-button">
|
||||
__MSG_resetToDefault__
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="advanced" class="option-group hidden">
|
||||
|
||||
558
public/popup.css
@@ -1,41 +1,64 @@
|
||||
:root {
|
||||
--sb-main-font-family: "Source Sans Pro", sans-serif;
|
||||
--sb-main-bg-color: #222626;
|
||||
--sb-main-bg-color: #222;
|
||||
--sb-main-fg-color: #fff;
|
||||
--sb-grey-bg-color: #333;
|
||||
--sb-grey-fg-color: #999;
|
||||
--sb-red-bg-color: #cc1717;
|
||||
}
|
||||
|
||||
/*
|
||||
* Container when popup displayed in-page
|
||||
* Generic utilities
|
||||
*/
|
||||
|
||||
#sponsorBlockPopupContainer {
|
||||
.grey-text {
|
||||
color: var(--sb-grey-fg-color);
|
||||
}
|
||||
.white-text {
|
||||
color: var(--sb-main-fg-color);
|
||||
}
|
||||
.sbHeader {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin: 0;
|
||||
}
|
||||
#sponsorBlockPopupBody .u-mZ {
|
||||
margin: 0 !important;
|
||||
position: relative;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
#sponsorBlockPopupBody .hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable fixed popup width when displayed in-page
|
||||
* <button> elements that have icons
|
||||
*/
|
||||
|
||||
#sponsorBlockPopupContainer #sponsorBlockPopupBody {
|
||||
width: auto;
|
||||
#setUsernameButton,
|
||||
#copyUserID,
|
||||
#submitUsername {
|
||||
color: var(--sb-main-fg-color);
|
||||
background: transparent;
|
||||
width: fit-content;
|
||||
padding: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/*
|
||||
* Main containers
|
||||
*/
|
||||
|
||||
#sponsorBlockPopupHTML {
|
||||
color-scheme: dark;
|
||||
max-height: 600px;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#sponsorBlockPopupBody {
|
||||
margin: 0;
|
||||
width: 374px;
|
||||
font-family: var(--sb-main-font-family);
|
||||
max-width: 100%; /* NOTE: Ensures content doesn't exceed restricted popup widths in Firefox */
|
||||
font-size: 14px;
|
||||
font-family: var(--sb-main-font-family);
|
||||
background-color: var(--sb-main-bg-color);
|
||||
color: var(--sb-main-fg-color);
|
||||
color-scheme: dark;
|
||||
@@ -45,18 +68,55 @@
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#sponsorblockPopup a,
|
||||
#sponsorblockPopup button {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable transition on all elements until the extension has loaded
|
||||
*/
|
||||
|
||||
.sb-preload * {
|
||||
transition: none !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close popup button when displayed in-page
|
||||
* Alert indicating that Beta server is enabled
|
||||
*/
|
||||
#sbBetaServerWarning {
|
||||
padding: 8px;
|
||||
font-size: 1em;
|
||||
font-weight: 700;
|
||||
color: var(--sb-main-fg-color);
|
||||
background-color: var(--sb-red-bg-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/*
|
||||
* Container when popup displayed in-page (content.ts)
|
||||
*/
|
||||
#sponsorBlockPopupContainer {
|
||||
position: relative;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable popup max height when displayed in-page (content.ts)
|
||||
*/
|
||||
#sponsorBlockPopupContainer #sponsorBlockPopupHTML {
|
||||
max-height: none;
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable fixed popup width when displayed in-page (content.ts)
|
||||
*/
|
||||
#sponsorBlockPopupContainer #sponsorBlockPopupBody {
|
||||
width: auto;
|
||||
}
|
||||
|
||||
/*
|
||||
* Close popup button when displayed in-page (top-right corner)
|
||||
*/
|
||||
.sbCloseButton {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
@@ -75,36 +135,31 @@
|
||||
/*
|
||||
* Header logo
|
||||
*/
|
||||
|
||||
.sbPopupLogo {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 32px;
|
||||
font-weight: bold;
|
||||
justify-content: center;
|
||||
font-weight: bold;
|
||||
user-select: none;
|
||||
padding: 20px 0 10px;
|
||||
padding: 10px 0px 0px;
|
||||
font-size: 32px;
|
||||
}
|
||||
|
||||
.sbPopupLogo img {
|
||||
margin-right: 8px;
|
||||
margin: 8px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Refresh segments button
|
||||
*/
|
||||
|
||||
#refreshSegmentsButton {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
border-radius: 50%;
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
padding: 5px;
|
||||
margin: 5px auto;
|
||||
align-items: center;
|
||||
background: transparent;
|
||||
border-radius: 50%;
|
||||
margin: 5px auto;
|
||||
border: none;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
#refreshSegmentsButton:hover {
|
||||
background-color: var(--sb-grey-bg-color);
|
||||
}
|
||||
@@ -112,15 +167,14 @@
|
||||
/*
|
||||
* <details> wrapper around each segment
|
||||
*/
|
||||
|
||||
.votingButtons {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
border-radius: 8px;
|
||||
margin: 4px 16px;
|
||||
}
|
||||
|
||||
.votingButtons[open] {
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.votingButtons:hover {
|
||||
background-color: var(--sb-grey-bg-color);
|
||||
}
|
||||
@@ -128,44 +182,59 @@
|
||||
/*
|
||||
* Individual segments summaries (clickable <summary>)
|
||||
*/
|
||||
|
||||
.segmentSummary {
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
padding: 7px;
|
||||
list-style: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
white-space: nowrap;
|
||||
font-weight: bold;
|
||||
list-style: none;
|
||||
cursor: pointer;
|
||||
padding: 4px 8px;
|
||||
}
|
||||
.segmentSummary > div {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/*
|
||||
* Category dot in segment
|
||||
*/
|
||||
|
||||
.sponsorTimesCategoryColorCircle {
|
||||
margin: 0 8px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
}
|
||||
/*
|
||||
* Category name in segment
|
||||
*/
|
||||
.summaryLabel {
|
||||
overflow-wrap: break-word;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.sbVoteButtonsContainer {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/*
|
||||
* Buttons that appear under a segment on click
|
||||
*/
|
||||
|
||||
.voteButton {
|
||||
height: 20px;
|
||||
padding: 0 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.voteButton:hover {
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
/*
|
||||
* "Voted!" text that appears after voting on a segment
|
||||
*/
|
||||
|
||||
.sponsorTimesThanksForVotingText {
|
||||
font-size: large;
|
||||
}
|
||||
@@ -173,113 +242,44 @@
|
||||
/*
|
||||
* Main controls menu
|
||||
*/
|
||||
|
||||
.sbControlsMenu {
|
||||
margin: 16px;
|
||||
margin-top: 6px;
|
||||
border-radius: 8px;
|
||||
background-color: var(--sb-grey-bg-color);
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.sbControlsMenu-item {
|
||||
background-color: var(--sb-grey-bg-color);
|
||||
border: 0;
|
||||
padding: 0;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
padding: 10px 15px;
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.sbControlsMenu-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
background: transparent;
|
||||
user-select: none;
|
||||
cursor: pointer;
|
||||
border: none;
|
||||
flex: 1;
|
||||
padding: 10px 15px;
|
||||
trasition: background-color 0.2s ease-in-out;
|
||||
}
|
||||
.sbControlsMenu-item:hover {
|
||||
background-color: #444;
|
||||
}
|
||||
|
||||
.sbControlsMenu-itemIcon {
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
/*
|
||||
* "Skipping is enabled" toggle
|
||||
*/
|
||||
|
||||
.toggleSwitchContainer {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.toggleSwitchContainer-switch {
|
||||
display: flex;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
|
||||
.switchBg {
|
||||
display: block;
|
||||
width: 50px;
|
||||
height: 23px;
|
||||
border-radius: 18.5px;
|
||||
}
|
||||
|
||||
.switchBg.shadow {
|
||||
box-shadow: 0.75px 0.75px 10px 0px rgba(50, 50, 50, 0.5);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.switchBg.white {
|
||||
position: absolute;
|
||||
background-color: #ccc;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.switchBg.green {
|
||||
position: absolute;
|
||||
background-color: #00a205;
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s ease-out;
|
||||
}
|
||||
|
||||
.switchDot {
|
||||
background-color: var(--sb-main-fg-color);
|
||||
border-radius: 50%;
|
||||
width: 15px;
|
||||
height: 15px;
|
||||
margin: 4px;
|
||||
position: absolute;
|
||||
box-shadow: 0.75px 0.75px 3.8px 0px rgba(50, 50, 50, 0.45);
|
||||
transition: transform 0.2s ease-out;
|
||||
}
|
||||
|
||||
#toggleSwitch:checked ~ .switchDot {
|
||||
transform: translateX(27px);
|
||||
}
|
||||
|
||||
#toggleSwitch:checked ~ .switchBg.green {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#toggleSwitch:checked ~ .switchBg.white {
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s step-end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Whitelist add/remove icon
|
||||
*/
|
||||
|
||||
.SBWhitelistIcon > path {
|
||||
fill: var(--sb-main-fg-color);
|
||||
}
|
||||
|
||||
.SBWhitelistIcon.rotated {
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
from {
|
||||
transform: rotate(0deg);
|
||||
@@ -290,257 +290,269 @@
|
||||
}
|
||||
|
||||
/*
|
||||
* Notice that appears when whitelisting a channel, that recommends
|
||||
* enabling the "Force Channel Check Before Skipping" option
|
||||
* "Skipping is enabled" toggle
|
||||
*/
|
||||
|
||||
#whitelistForceCheck {
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
font-size: large;
|
||||
cursor: pointer;
|
||||
padding: 10px 0;
|
||||
.toggleSwitchContainer {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
}
|
||||
.toggleSwitchContainer-switch {
|
||||
display: flex;
|
||||
margin-bottom: 6px;
|
||||
}
|
||||
.switchBg {
|
||||
width: 50px;
|
||||
height: 23px;
|
||||
display: block;
|
||||
border-radius: 18.5px;
|
||||
}
|
||||
.switchBg.shadow {
|
||||
box-shadow: 0.75px 0.75px 10px 0px rgba(50, 50, 50, 0.5);
|
||||
opacity: 1;
|
||||
}
|
||||
.switchBg.white {
|
||||
opacity: 1;
|
||||
position: absolute;
|
||||
background-color: #ccc;
|
||||
}
|
||||
.switchBg.green {
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
background-color: #00a205;
|
||||
transition: opacity 0.2s ease-out;
|
||||
}
|
||||
.switchDot {
|
||||
width: 15px;
|
||||
margin: 4px;
|
||||
height: 15px;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
transition: transform 0.2s ease-out;
|
||||
background-color: var(--sb-main-fg-color);
|
||||
box-shadow: 0.75px 0.75px 3.8px 0px rgba(50, 50, 50, 0.45);
|
||||
}
|
||||
#toggleSwitch:checked ~ .switchDot {
|
||||
transform: translateX(27px);
|
||||
}
|
||||
#toggleSwitch:checked ~ .switchBg.green {
|
||||
opacity: 1;
|
||||
}
|
||||
#toggleSwitch:checked ~ .switchBg.white {
|
||||
transition: opacity 0.2s step-end;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Container around the "Segment Starts Now" and "Submit Times" buttons
|
||||
* Notice that appears when whitelisting a channel, that recommends
|
||||
* enabling the "Force Channel Check Before Skipping" option
|
||||
*/
|
||||
#whitelistForceCheck {
|
||||
background-color: #fff3cd;
|
||||
padding: 10px 15px;
|
||||
display: block;
|
||||
color: #664d03;
|
||||
}
|
||||
#whitelistForceCheck:hover {
|
||||
background-color: #f2e4b7;
|
||||
}
|
||||
|
||||
/*
|
||||
* Submit box
|
||||
*/
|
||||
#mainControls {
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
margin: 16px;
|
||||
padding: 8px 12px;
|
||||
text-align: left;
|
||||
border-radius: 8px;
|
||||
border: 2px solid var(--sb-grey-bg-color);
|
||||
}
|
||||
.sponsorStartHint {
|
||||
display: block;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic buttons used for "Segment Starts Now" and "Submit Times"
|
||||
*/
|
||||
|
||||
.sbMediumButton {
|
||||
background-color: var(--sb-red-bg-color);
|
||||
border: 0;
|
||||
-moz-border-radius: 28px;
|
||||
-webkit-border-radius: 28px;
|
||||
border: none;
|
||||
font-size: 16px;
|
||||
padding: 8px 16px;
|
||||
border-radius: 28px;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
-moz-border-radius: 28px;
|
||||
-webkit-border-radius: 28px;
|
||||
color: var(--sb-main-fg-color);
|
||||
font-size: 16px;
|
||||
padding: 8px 37px;
|
||||
font-family: var(--sb-main-font-family);
|
||||
transition: 0.01s background-color;
|
||||
font-family: var(--sb-main-font-family);
|
||||
background-color: var(--sb-red-bg-color);
|
||||
}
|
||||
|
||||
.sbMediumButton:hover,
|
||||
.sbMediumButton:focus {
|
||||
outline: none;
|
||||
background-color: #ec1c1c;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.sbMediumButton:active {
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
|
||||
/*
|
||||
* "Submit Times" button
|
||||
*/
|
||||
|
||||
#submitTimes {
|
||||
margin-top: 12px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Heading utility class
|
||||
* Your Work box
|
||||
*/
|
||||
|
||||
.sbHeader {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
margin: 10px 0 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Side-by-side section of "Your Work"
|
||||
*/
|
||||
|
||||
.sbYourWorkCols {
|
||||
display: flex;
|
||||
margin: 0 20px 12px;
|
||||
margin: 16px;
|
||||
margin-bottom: 8px;
|
||||
border-radius: 8px;
|
||||
border: 2px solid var(--sb-grey-bg-color);
|
||||
}
|
||||
|
||||
.sbYourWorkCols > div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 50%;
|
||||
justify-content: center;
|
||||
border-top: 2px solid var(--sb-grey-bg-color);
|
||||
border-bottom: 2px solid var(--sb-grey-bg-color);
|
||||
}
|
||||
|
||||
/*
|
||||
* <button> elements that have icons
|
||||
*/
|
||||
|
||||
#setUsernameButton,
|
||||
#submitUsername,
|
||||
#copyUserID {
|
||||
background: transparent;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
padding: 0;
|
||||
color: var(--sb-main-fg-color);
|
||||
width: fit-content;
|
||||
.sbStatsSentence {
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent username from wrapping
|
||||
*/
|
||||
|
||||
#setUsernameButton {
|
||||
flex: 0 1;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set username button
|
||||
*/
|
||||
|
||||
#submitUsername {
|
||||
padding-left: 7px;
|
||||
.sbStatsSentence .sbExtraInfo {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
/*
|
||||
* Increase font size of username input and display
|
||||
*/
|
||||
|
||||
#usernameValue,
|
||||
#usernameInput,
|
||||
#sponsorTimesContributionsDisplay {
|
||||
font-size: 16px;
|
||||
flex: 1 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Left align "Username" and "Submissions" labels
|
||||
* Improve alignment of username and submissions
|
||||
*/
|
||||
|
||||
#usernameElement > div > p,
|
||||
#usernameElement,
|
||||
#sponsorTimesContributionsContainer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: start;
|
||||
}
|
||||
#usernameElement > span,
|
||||
#sponsorTimesContributionsContainer {
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable flexbox for buttons with SVG icon
|
||||
*/
|
||||
|
||||
#setUsernameContainer > button {
|
||||
display: flex;
|
||||
#sponsorTimesContributionsContainer {
|
||||
margin-left: 8px;
|
||||
padding-left: 8px;
|
||||
border-left: 2px solid var(--sb-grey-bg-color);
|
||||
}
|
||||
|
||||
/*
|
||||
* Improve position of "Copy User ID" button
|
||||
* Username
|
||||
*/
|
||||
|
||||
#usernameElement {
|
||||
padding: 8px;
|
||||
min-width: 50%;
|
||||
}
|
||||
#setUsernameContainer {
|
||||
display: flex;
|
||||
width: fit-content;
|
||||
}
|
||||
#setUsernameContainer > button {
|
||||
display: flex;
|
||||
}
|
||||
#setUsernameButton {
|
||||
margin-right: 5px;
|
||||
flex: 0 1;
|
||||
}
|
||||
#submitUsername {
|
||||
padding-left: 16px;
|
||||
}
|
||||
#copyUserID {
|
||||
width: 100%;
|
||||
flex: 0 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Container around username display and edit
|
||||
*/
|
||||
|
||||
#setUsernameContainer {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/*
|
||||
* Improve alignment of username and submissions
|
||||
*/
|
||||
|
||||
#usernameElement > div,
|
||||
#sponsorTimesContributionsContainer > div {
|
||||
display: flex;
|
||||
flex-flow: column nowrap;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
/*
|
||||
* Truncate username display
|
||||
*/
|
||||
|
||||
#usernameValue {
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
margin: 0 8px 0 0;
|
||||
max-width: 130px;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set username form container with "expanded" state
|
||||
*/
|
||||
|
||||
#setUsername {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#setUsername.SBExpanded {
|
||||
width: 200%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set username input
|
||||
*/
|
||||
|
||||
#usernameInput {
|
||||
background: transparent;
|
||||
padding: 2px;
|
||||
border: var(--sb-main-fg-color) 1px solid;
|
||||
color: var(--sb-main-fg-color);
|
||||
width: calc(100% - 24px);
|
||||
border: none;
|
||||
padding: 4px 8px;
|
||||
border-radius: 4px;
|
||||
width: calc(100% - 68px);
|
||||
text-overflow: ellipsis;
|
||||
color: var(--sb-main-fg-color);
|
||||
background: var(--sb-grey-bg-color);
|
||||
}
|
||||
|
||||
/*
|
||||
* Submissions
|
||||
*/
|
||||
#sponsorTimesContributionsContainer {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Footer
|
||||
*/
|
||||
|
||||
#sbFooter {
|
||||
margin-top: 10px;
|
||||
padding-bottom: 20px;
|
||||
padding: 8px 0;
|
||||
}
|
||||
#sbFooter a {
|
||||
transition: background 0.3s ease !important;
|
||||
color: var(--sb-main-fg-color);
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
border-radius: 4px;
|
||||
background: #333;
|
||||
cursor: pointer;
|
||||
padding: 4px 8px;
|
||||
font-weight: 500;
|
||||
margin: 2px 1px;
|
||||
}
|
||||
#sbFooter a:hover {
|
||||
background: #444;
|
||||
}
|
||||
|
||||
#sbFooter a {
|
||||
#sponsorTimesDonateContainer a {
|
||||
color: var(--sb-main-fg-color);
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/*
|
||||
* "Show Notice Again" button
|
||||
*/
|
||||
|
||||
#showNoticeAgain {
|
||||
background: transparent;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 5px;
|
||||
color: var(--sb-main-fg-color);
|
||||
cursor: pointer;
|
||||
margin-bottom: 20px;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic spacing classes
|
||||
*/
|
||||
|
||||
.u-mZ {
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic hide utility classes
|
||||
*/
|
||||
|
||||
#sponsorBlockPopupBody .hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@@ -8,9 +8,17 @@
|
||||
<link id="sponsorBlockStyleSheet" href="popup.css" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body id="sponsorBlockPopupBody">
|
||||
<body id="sponsorBlockPopupBody" style="visibility: hidden">
|
||||
<div id="sponsorblockPopup" class="sponsorBlockPageBody sb-preload">
|
||||
|
||||
<button id="sbCloseButton" title="__MSG_closePopup__" class="sbCloseButton hidden">
|
||||
<img src="icons/close.png" width="15" height="15">
|
||||
</button>
|
||||
|
||||
<div id="sbBetaServerWarning" class="hidden" title="__MSG_openOptionsPage__">
|
||||
__MSG_betaServerWarning__
|
||||
</div>
|
||||
|
||||
<header class="sbPopupLogo">
|
||||
<img src="icons/IconSponsorBlocker256px.png" alt="SponsorBlock" width="40" height="40" id="sponsorBlockPopupLogo">
|
||||
<p class="u-mZ">SponsorBlock</p>
|
||||
@@ -18,19 +26,21 @@
|
||||
|
||||
<div id="videoInfo">
|
||||
<!-- Loading text -->
|
||||
<p id="loadingIndicator" class="u-mZ">__MSG_noVideoID__</p>
|
||||
<p id="loadingIndicator" class="u-mZ grey-text">__MSG_noVideoID__</p>
|
||||
<!-- If the video was found in the database -->
|
||||
<p id="videoFound" class="u-mZ"></p>
|
||||
<p id="videoFound" class="u-mZ grey-text"></p>
|
||||
<button id="refreshSegmentsButton" title="__MSG_refreshSegments__">
|
||||
<img src="/icons/refresh.svg" alt="Refresh icon" id="refreshSegments" />
|
||||
</button>
|
||||
<!-- Video Segments -->
|
||||
<div id="issueReporterContainer">
|
||||
<div id="issueReporterTimeButtons"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Toggle Box -->
|
||||
<div class="sbControlsMenu">
|
||||
<label id="whitelistButton" for="whitelistToggle" class="hidden sbControlsMenu-item" title="__MSG_forceChannelCheckPopup__">
|
||||
<label id="whitelistButton" for="whitelistToggle" class="hidden sbControlsMenu-item">
|
||||
<input type="checkbox" style="display:none;" id="whitelistToggle">
|
||||
<svg viewBox="0 0 24 24" width="23" height="23" class="SBWhitelistIcon sbControlsMenu-itemIcon">
|
||||
<path d="M24 10H14V0h-4v10H0v4h10v10h4V14h10z" />
|
||||
@@ -56,31 +66,37 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<p id="whitelistForceCheck" class="u-mZ hidden">
|
||||
<a id="whitelistForceCheck" class="hidden">
|
||||
__MSG_forceChannelCheckPopup__
|
||||
</p>
|
||||
</a>
|
||||
|
||||
<!-- Submit box -->
|
||||
<div id="mainControls" style="display: none">
|
||||
<p class="sbHeader">
|
||||
__MSG_recordTimesDescription__
|
||||
</p>
|
||||
<sub style="margin-bottom: 12px;">__MSG_popupHint__</sub>
|
||||
<div>
|
||||
<button id="sponsorStart" class="sbMediumButton">__MSG_sponsorStart__</button>
|
||||
</div>
|
||||
<div id="submissionSection" style="display: none">
|
||||
<b style="display: block; margin-top: 12px;">__MSG_submissionEditHint__</b>
|
||||
<button id="submitTimes" class="sbMediumButton">__MSG_submitTimesButton__</button>
|
||||
<sub class="sponsorStartHint grey-text">__MSG_popupHint__</sub>
|
||||
<div align="center" style="margin: 8px 0;">
|
||||
<button id="sponsorStart" class="sbMediumButton" style="margin-right: 8px">__MSG_sponsorStart__</button>
|
||||
<button id="submitTimes" class="sbMediumButton" style="display: none;">__MSG_submitTimesButton__</button>
|
||||
</div>
|
||||
<span id="submissionHint" style="display: none;">__MSG_submissionEditHint__</span>
|
||||
</div>
|
||||
|
||||
<h1 class="recordingSubtitle sbHeader">__MSG_yourWork__</h1>
|
||||
<!-- Your Work box -->
|
||||
<div class="sbYourWorkCols">
|
||||
<div id="usernameElement">
|
||||
<p class="sbHeader" style="padding: 8px 16px;">
|
||||
__MSG_yourWork__
|
||||
</p>
|
||||
<div>
|
||||
<p class="u-mZ">__MSG_Username__:</p>
|
||||
<!-- Username -->
|
||||
<div id="usernameElement">
|
||||
<span class="u-mZ grey-text">__MSG_Username__:
|
||||
<!-- loading/errors -->
|
||||
<span id="setUsernameStatus" class="u-mZ white-text" style="display: none"></span>
|
||||
</span>
|
||||
<div id="setUsernameContainer">
|
||||
<p id="usernameValue" class="u-mZ"></p>
|
||||
<p id="usernameValue"></p>
|
||||
<button id="setUsernameButton" title="__MSG_setUsername__">
|
||||
<img src="/icons/pencil.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconEdit">
|
||||
</button>
|
||||
@@ -89,50 +105,53 @@
|
||||
</button>
|
||||
</div>
|
||||
<div id="setUsername" style="display: none">
|
||||
<div id="setUsernameStatusContainer" style="display: none">
|
||||
<p id="setUsernameStatus" class="u-mZ"></p>
|
||||
</div>
|
||||
<input id="usernameInput" placeholder="Username">
|
||||
<button id="submitUsername">
|
||||
<img src="/icons/check.svg" alt="__MSG_setUsername__" width="16" height="16" id="sbPopupIconCheck">
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Submissions -->
|
||||
<div id="sponsorTimesContributionsContainer" class="hidden">
|
||||
<div>
|
||||
<p class="u-mZ">__MSG_Submissions__:</p>
|
||||
<span id="sponsorTimesContributionsDisplay">
|
||||
0
|
||||
</span>
|
||||
</div>
|
||||
<p class="u-mZ grey-text">__MSG_Submissions__:</p>
|
||||
<span id="sponsorTimesContributionsDisplay">0</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p id="sponsorTimesViewsContainer" style="display: none" class="u-mZ">
|
||||
<p id="sponsorTimesViewsContainer" style="display: none" class="u-mZ sbStatsSentence">
|
||||
__MSG_savedPeopleFrom__
|
||||
<b><span id="sponsorTimesViewsDisplay">
|
||||
0
|
||||
</span></b>
|
||||
<b>
|
||||
<span id="sponsorTimesViewsDisplay">0</span>
|
||||
</b>
|
||||
<span id="sponsorTimesViewsDisplayEndWord">__MSG_Segments__</span>
|
||||
<br>
|
||||
(<b><span id="sponsorTimesOthersTimeSavedDisplay">0</span>
|
||||
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span></b>
|
||||
<span>__MSG_youHaveSavedTimeEnd__</span>).
|
||||
</p>
|
||||
<p id="sponsorTimesSkipsDoneContainer" style="display: none" class="u-mZ">
|
||||
__MSG_youHaveSkipped__
|
||||
<b><span id="sponsorTimesSkipsDoneDisplay">
|
||||
0
|
||||
</span></b>
|
||||
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
|
||||
(<b><span id="sponsorTimeSavedDisplay">
|
||||
0
|
||||
<br />
|
||||
<span class="sbExtraInfo">
|
||||
(
|
||||
<b>
|
||||
<span id="sponsorTimesOthersTimeSavedDisplay">0</span>
|
||||
<span id="sponsorTimesOthersTimeSavedEndWord">__MSG_minsLower__</span>
|
||||
</b>
|
||||
<span>__MSG_youHaveSavedTimeEnd__</span>
|
||||
)
|
||||
</span>
|
||||
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
|
||||
</p>
|
||||
<p id="sponsorTimesSkipsDoneContainer" style="display: none" class="u-mZ sbStatsSentence">
|
||||
__MSG_youHaveSkipped__
|
||||
<b>
|
||||
<span id="sponsorTimesSkipsDoneDisplay">0</span>
|
||||
</b>
|
||||
<span id="sponsorTimesSkipsDoneEndWord">__MSG_Segments__</span>
|
||||
<span class="sbExtraInfo">
|
||||
(
|
||||
<b>
|
||||
<span id="sponsorTimeSavedDisplay">0</span>
|
||||
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span>
|
||||
</b>
|
||||
)
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<footer id="sbFooter">
|
||||
<div id="sponsorTimesDonateContainer" style="display: none; align-items: center; justify-content: center;">
|
||||
<img class="sbHeart" src="/icons/heart.svg" alt="Heart icon" />
|
||||
<a id="sbConsiderDonateLink" href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener">
|
||||
@@ -141,13 +160,14 @@
|
||||
<img id="sbCloseDonate" src="/icons/close.png" alt="Close icon" height="8" style="padding-left: 5px; cursor: pointer;" />
|
||||
</div>
|
||||
|
||||
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a> |
|
||||
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
|
||||
<footer id="sbFooter">
|
||||
<a id="helpButton">__MSG_help__</a>
|
||||
<a href="https://sponsor.ajay.app" target="_blank" rel="noopener">__MSG_website__</a>
|
||||
<a href="https://sponsor.ajay.app/stats" target="_blank" rel="noopener">__MSG_viewLeaderboard__</a>
|
||||
<br />
|
||||
<a href="https://discord.gg/SponsorBlock" target="_blank" rel="noopener">Discord</a> |
|
||||
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a> |
|
||||
<a id="helpButton">__MSG_help__</a> |
|
||||
<a href="https://github.com/ajayyy/SponsorBlock" target="_blank" rel="noopener">GitHub</a>
|
||||
<a href="https://discord.gg/SponsorBlock" target="_blank" rel="noopener">Discord</a>
|
||||
<a href="https://matrix.to/#/#sponsor:ajay.app?via=ajay.app&via=matrix.org&via=mozilla.org" target="_blank" rel="noopener">Matrix</a>
|
||||
<a href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener" id="sbDonate">$</a>
|
||||
</footer>
|
||||
|
||||
|
||||
@@ -23,13 +23,36 @@ if (utils.isFirefox()) {
|
||||
});
|
||||
}
|
||||
|
||||
chrome.tabs.onUpdated.addListener(function(tabId) {
|
||||
function onTabUpdatedListener(tabId: number) {
|
||||
chrome.tabs.sendMessage(tabId, {
|
||||
message: 'update',
|
||||
}, () => void chrome.runtime.lastError ); // Suppress error on Firefox
|
||||
}
|
||||
|
||||
function onNavigationApiAvailableChange(changes: {[key: string]: chrome.storage.StorageChange}) {
|
||||
if (changes.navigationApiAvailable) {
|
||||
if (changes.navigationApiAvailable.newValue) {
|
||||
chrome.tabs.onUpdated.removeListener(onTabUpdatedListener);
|
||||
} else {
|
||||
chrome.tabs.onUpdated.addListener(onTabUpdatedListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If Navigation API is not supported, then background has to inform content script about video change.
|
||||
// This happens on Safari, Firefox, and Chromium 101 (inclusive) and below.
|
||||
chrome.tabs.onUpdated.addListener(onTabUpdatedListener);
|
||||
utils.wait(() => Config.local !== null).then(() => {
|
||||
if (Config.local.navigationApiAvailable) {
|
||||
chrome.tabs.onUpdated.removeListener(onTabUpdatedListener);
|
||||
}
|
||||
});
|
||||
|
||||
chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
if (!Config.configSyncListeners.includes(onNavigationApiAvailableChange)) {
|
||||
Config.configSyncListeners.push(onNavigationApiAvailableChange);
|
||||
}
|
||||
|
||||
chrome.runtime.onMessage.addListener(function (request, _, callback) {
|
||||
switch(request.message) {
|
||||
case "openConfig":
|
||||
chrome.tabs.create({url: chrome.runtime.getURL('options/options.html' + (request.hash ? '#' + request.hash : ''))});
|
||||
@@ -61,6 +84,21 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
|
||||
case "unregisterContentScript":
|
||||
unregisterFirefoxContentScript(request.id)
|
||||
return false;
|
||||
case "tabs": {
|
||||
chrome.tabs.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
chrome.tabs.sendMessage(
|
||||
tabs[0].id,
|
||||
request.data,
|
||||
(response) => {
|
||||
callback(response);
|
||||
}
|
||||
);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ export interface CategorySkipOptionsState {
|
||||
}
|
||||
|
||||
class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsProps, CategorySkipOptionsState> {
|
||||
setBarColorTimeout: NodeJS.Timeout;
|
||||
|
||||
constructor(props: CategorySkipOptionsProps) {
|
||||
super(props);
|
||||
@@ -172,6 +173,8 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
}
|
||||
|
||||
setColorState(event: React.FormEvent<HTMLInputElement>, preview: boolean): void {
|
||||
clearTimeout(this.setBarColorTimeout);
|
||||
|
||||
if (preview) {
|
||||
this.setState({
|
||||
previewColor: event.currentTarget.value
|
||||
@@ -188,7 +191,9 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
}
|
||||
|
||||
// Make listener get called
|
||||
this.setBarColorTimeout = setTimeout(() => {
|
||||
Config.config.barTypes = Config.config.barTypes;
|
||||
}, 50);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ export interface NoticeProps {
|
||||
|
||||
smaller?: boolean,
|
||||
limitWidth?: boolean,
|
||||
extraClass?: string,
|
||||
|
||||
// Callback for when this is closed
|
||||
closeListener: () => void,
|
||||
@@ -35,8 +36,6 @@ export interface NoticeProps {
|
||||
}
|
||||
|
||||
export interface NoticeState {
|
||||
noticeTitle: string,
|
||||
|
||||
maxCountdownTime: () => number,
|
||||
|
||||
countdownTime: number,
|
||||
@@ -54,9 +53,13 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
amountOfPreviousNotices: number;
|
||||
|
||||
parentRef: React.RefObject<HTMLDivElement>;
|
||||
|
||||
constructor(props: NoticeProps) {
|
||||
super(props);
|
||||
|
||||
this.parentRef = React.createRef();
|
||||
|
||||
const maxCountdownTime = () => {
|
||||
if (this.props.maxCountdownTime) return this.props.maxCountdownTime();
|
||||
else return Config.config.skipNoticeDuration;
|
||||
@@ -71,8 +74,6 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
// Setup state
|
||||
this.state = {
|
||||
noticeTitle: props.noticeTitle,
|
||||
|
||||
maxCountdownTime,
|
||||
|
||||
//the countdown until this notice closes
|
||||
@@ -97,9 +98,11 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
return (
|
||||
<div id={"sponsorSkipNotice" + this.idSuffix}
|
||||
className={"sponsorSkipObject sponsorSkipNoticeParent"
|
||||
+ (this.props.showInSecondSlot ? " secondSkipNotice" : "")}
|
||||
+ (this.props.showInSecondSlot ? " secondSkipNotice" : "")
|
||||
+ (this.props.extraClass ? ` ${this.props.extraClass}` : "")}
|
||||
onMouseEnter={(e) => this.onMouseEnter(e) }
|
||||
onMouseLeave={() => this.timerMouseLeave()}
|
||||
ref={this.parentRef}
|
||||
style={noticeStyle} >
|
||||
<div className={"sponsorSkipNoticeTableContainer"
|
||||
+ (this.props.fadeIn ? " sponsorSkipNoticeFadeIn" : "")
|
||||
@@ -123,7 +126,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
style={{float: "left"}}
|
||||
className="sponsorSkipMessage sponsorSkipObject">
|
||||
|
||||
{this.state.noticeTitle}
|
||||
{this.props.noticeTitle}
|
||||
</span>
|
||||
|
||||
{this.props.firstColumn}
|
||||
@@ -344,12 +347,6 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
if (!silent) this.props.closeListener();
|
||||
}
|
||||
|
||||
changeNoticeTitle(title: string): void {
|
||||
this.setState({
|
||||
noticeTitle: title
|
||||
});
|
||||
}
|
||||
|
||||
addNoticeInfoMessage(message: string, message2 = ""): void {
|
||||
//TODO: Replace
|
||||
|
||||
@@ -384,6 +381,10 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
document.querySelector("#sponsorSkipNotice" + this.idSuffix + " > tbody").insertBefore(thanksForVotingText2, document.getElementById("sponsorSkipNoticeSpacer" + this.idSuffix));
|
||||
}
|
||||
}
|
||||
|
||||
getElement(): React.RefObject<HTMLDivElement> {
|
||||
return this.parentRef;
|
||||
}
|
||||
}
|
||||
|
||||
export default NoticeComponent;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import * as React from "react";
|
||||
|
||||
export interface NoticeTextSelectionProps {
|
||||
icon?: string,
|
||||
text: string,
|
||||
idSuffix: string,
|
||||
onClick?: (event: React.MouseEvent) => unknown
|
||||
@@ -24,12 +25,21 @@ class NoticeTextSelectionComponent extends React.Component<NoticeTextSelectionPr
|
||||
}
|
||||
|
||||
return (
|
||||
<p id={"sponsorTimesInfoMessage" + this.props.idSuffix}
|
||||
<tr id={"sponsorTimesInfoMessage" + this.props.idSuffix}
|
||||
onClick={this.props.onClick}
|
||||
style={style}
|
||||
className="sponsorTimesInfoMessage">
|
||||
|
||||
<td>
|
||||
{this.props.icon ?
|
||||
<img src={chrome.runtime.getURL(this.props.icon)} className="sponsorTimesInfoIcon" />
|
||||
: null}
|
||||
|
||||
<span>
|
||||
{this.props.text}
|
||||
</p>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config"
|
||||
import { Category, ContentContainer, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
|
||||
import { Category, ContentContainer, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
|
||||
import NoticeComponent from "./NoticeComponent";
|
||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||
import Utils from "../utils";
|
||||
@@ -14,10 +14,17 @@ import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
|
||||
import PencilSvg from "../svg-icons/pencil_svg";
|
||||
import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
|
||||
|
||||
enum SkipButtonState {
|
||||
Undo, // Unskip
|
||||
Redo, // Reskip
|
||||
Start // Skip
|
||||
}
|
||||
|
||||
export interface SkipNoticeProps {
|
||||
segments: SponsorTime[];
|
||||
|
||||
autoSkip: boolean;
|
||||
startReskip?: boolean;
|
||||
// Contains functions and variables from the content script needed by the skip notice
|
||||
contentContainer: ContentContainer;
|
||||
|
||||
@@ -38,9 +45,9 @@ export interface SkipNoticeState {
|
||||
maxCountdownTime?: () => number;
|
||||
countdownText?: string;
|
||||
|
||||
skipButtonText?: string;
|
||||
skipButtonCallback?: (index: number) => void;
|
||||
showSkipButton?: boolean;
|
||||
skipButtonStates?: SkipButtonState[];
|
||||
skipButtonCallbacks?: Array<(buttonIndex: number, index: number, forceSeek: boolean) => void>;
|
||||
showSkipButton?: boolean[];
|
||||
|
||||
editing?: boolean;
|
||||
choosingCategory?: boolean;
|
||||
@@ -109,6 +116,15 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.unselectedColor = Config.config.colorPalette.white;
|
||||
this.lockedColor = Config.config.colorPalette.locked;
|
||||
|
||||
const isMuteSegment = this.segments[0].actionType === ActionType.Mute;
|
||||
const maxCountdownTime = isMuteSegment ? this.getFullDurationCountdown(0) : () => Config.config.skipNoticeDuration;
|
||||
|
||||
const defaultSkipButtonState = this.props.startReskip ? SkipButtonState.Redo : SkipButtonState.Undo;
|
||||
const skipButtonStates = [defaultSkipButtonState, isMuteSegment ? SkipButtonState.Start : defaultSkipButtonState];
|
||||
|
||||
const defaultSkipButtonCallback = this.props.startReskip ? this.reskip.bind(this) : this.unskip.bind(this);
|
||||
const skipButtonCallbacks = [defaultSkipButtonCallback, isMuteSegment ? this.reskip.bind(this) : defaultSkipButtonCallback];
|
||||
|
||||
// Setup state
|
||||
this.state = {
|
||||
noticeTitle,
|
||||
@@ -116,13 +132,13 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
messageOnClick: null,
|
||||
|
||||
//the countdown until this notice closes
|
||||
maxCountdownTime: () => Config.config.skipNoticeDuration,
|
||||
countdownTime: Config.config.skipNoticeDuration,
|
||||
maxCountdownTime,
|
||||
countdownTime: maxCountdownTime(),
|
||||
countdownText: null,
|
||||
|
||||
skipButtonText: this.getUnskipText(),
|
||||
skipButtonCallback: (index) => this.unskip(index),
|
||||
showSkipButton: true,
|
||||
skipButtonStates,
|
||||
skipButtonCallbacks,
|
||||
showSkipButton: [true, true],
|
||||
|
||||
editing: false,
|
||||
choosingCategory: false,
|
||||
@@ -141,7 +157,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
if (!this.autoSkip) {
|
||||
// Assume manual skip is only skipping 1 submission
|
||||
Object.assign(this.state, this.getUnskippedModeInfo(0, this.getSkipText()));
|
||||
Object.assign(this.state, this.getUnskippedModeInfo(null, 0, SkipButtonState.Start));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -154,8 +170,9 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
// If it started out as smaller, always keep the
|
||||
// skip button there
|
||||
const firstColumn = this.props.smaller ? (
|
||||
this.getSkipButton()
|
||||
const showFirstSkipButton = this.props.smaller || this.segments[0].actionType === ActionType.Mute;
|
||||
const firstColumn = showFirstSkipButton ? (
|
||||
this.getSkipButton(0)
|
||||
) : null;
|
||||
|
||||
return (
|
||||
@@ -247,10 +264,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
|
||||
{/* Unskip/Skip Button */}
|
||||
{!this.props.smaller ? this.getSkipButton() : null}
|
||||
{!this.props.smaller || this.segments[0].actionType === ActionType.Mute
|
||||
? this.getSkipButton(1) : null}
|
||||
|
||||
{/* Never show button if autoSkip is enabled */}
|
||||
{!this.autoSkip ? "" :
|
||||
{/* Never show button */}
|
||||
{!this.autoSkip || this.props.startReskip ? "" :
|
||||
<td className="sponsorSkipNoticeRightSection"
|
||||
key={1}>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
@@ -324,14 +342,17 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
];
|
||||
}
|
||||
|
||||
getSkipButton(): JSX.Element {
|
||||
if (this.state.showSkipButton && (this.segments.length > 1
|
||||
getSkipButton(buttonIndex: number): JSX.Element {
|
||||
if (this.state.showSkipButton[buttonIndex] && (this.segments.length > 1
|
||||
|| this.segments[0].actionType !== ActionType.Poi
|
||||
|| this.props.unskipTime)) {
|
||||
|
||||
const forceSeek = buttonIndex === 1 && this.segments[0].actionType === ActionType.Mute;
|
||||
|
||||
const style: React.CSSProperties = {
|
||||
marginLeft: "4px",
|
||||
color: (this.state.actionState === SkipNoticeAction.Unskip) ? this.selectedColor : this.unselectedColor
|
||||
color: ([SkipNoticeAction.Unskip0, SkipNoticeAction.Unskip1].includes(this.state.actionState))
|
||||
? this.selectedColor : this.unselectedColor
|
||||
};
|
||||
if (this.contentContainer().onMobileYouTube) {
|
||||
style.padding = "20px";
|
||||
@@ -343,8 +364,10 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={style}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + keybindToString(Config.config.skipKeybind) + ")" : "")}
|
||||
onClick={() => this.prepAction(buttonIndex === 1 ? SkipNoticeAction.Unskip1 : SkipNoticeAction.Unskip0)}>
|
||||
{this.getSkipButtonText(buttonIndex, forceSeek ? ActionType.Skip : null)
|
||||
+ (!forceSeek && this.state.showKeybindHint
|
||||
? " (" + keybindToString(Config.config.skipKeybind) + ")" : "")}
|
||||
</button>
|
||||
</span>
|
||||
);
|
||||
@@ -445,8 +468,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
case SkipNoticeAction.CopyDownvote:
|
||||
this.resetStateToStart(SkipNoticeAction.CopyDownvote, true);
|
||||
break;
|
||||
case SkipNoticeAction.Unskip:
|
||||
this.resetStateToStart(SkipNoticeAction.Unskip);
|
||||
case SkipNoticeAction.Unskip0:
|
||||
this.resetStateToStart(SkipNoticeAction.Unskip0);
|
||||
break;
|
||||
case SkipNoticeAction.Unskip1:
|
||||
this.resetStateToStart(SkipNoticeAction.Unskip1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -474,8 +500,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
case SkipNoticeAction.CopyDownvote:
|
||||
this.copyDownvote(index);
|
||||
break;
|
||||
case SkipNoticeAction.Unskip:
|
||||
this.unskipAction(index);
|
||||
case SkipNoticeAction.Unskip0:
|
||||
this.unskipAction(0, index, false);
|
||||
break;
|
||||
case SkipNoticeAction.Unskip1:
|
||||
this.unskipAction(1, index, true);
|
||||
break;
|
||||
default:
|
||||
this.resetStateToStart();
|
||||
@@ -537,8 +566,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
});
|
||||
}
|
||||
|
||||
unskipAction(index: number): void {
|
||||
this.state.skipButtonCallback(index);
|
||||
unskipAction(buttonIndex: number, index: number, forceSeek: boolean): void {
|
||||
this.state.skipButtonCallbacks[buttonIndex](buttonIndex, index, forceSeek);
|
||||
}
|
||||
|
||||
openEditingOptions(): void {
|
||||
@@ -565,28 +594,29 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
return this.props.contentContainer().lockedCategories.includes(category) ? "sponsorBlockLockedColor" : ""
|
||||
}
|
||||
|
||||
unskip(index: number): void {
|
||||
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime);
|
||||
unskip(buttonIndex: number, index: number, forceSeek: boolean): void {
|
||||
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime, forceSeek);
|
||||
|
||||
this.unskippedMode(index, this.getReskipText());
|
||||
this.unskippedMode(buttonIndex, index, SkipButtonState.Redo);
|
||||
}
|
||||
|
||||
reskip(index: number): void {
|
||||
this.contentContainer().reskipSponsorTime(this.segments[index]);
|
||||
reskip(buttonIndex: number, index: number, forceSeek: boolean): void {
|
||||
this.contentContainer().reskipSponsorTime(this.segments[index], forceSeek);
|
||||
|
||||
const skipButtonStates = this.state.skipButtonStates;
|
||||
skipButtonStates[buttonIndex] = SkipButtonState.Undo;
|
||||
|
||||
const skipButtonCallbacks = this.state.skipButtonCallbacks;
|
||||
skipButtonCallbacks[buttonIndex] = this.unskip.bind(this);
|
||||
|
||||
const newState: SkipNoticeState = {
|
||||
skipButtonText: this.getUnskipText(),
|
||||
skipButtonCallback: this.unskip.bind(this),
|
||||
skipButtonStates,
|
||||
skipButtonCallbacks,
|
||||
|
||||
maxCountdownTime: () => Config.config.skipNoticeDuration,
|
||||
countdownTime: Config.config.skipNoticeDuration
|
||||
};
|
||||
|
||||
// See if the title should be changed
|
||||
if (!this.autoSkip) {
|
||||
newState.noticeTitle = chrome.i18n.getMessage("noticeTitle");
|
||||
}
|
||||
|
||||
//reset countdown
|
||||
this.setState(newState, () => {
|
||||
this.noticeRef.current.resetCountdown();
|
||||
@@ -594,30 +624,54 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
|
||||
/** Sets up notice to be not skipped yet */
|
||||
unskippedMode(index: number, buttonText: string): void {
|
||||
unskippedMode(buttonIndex: number, index: number, skipButtonState: SkipButtonState): void {
|
||||
//setup new callback and reset countdown
|
||||
this.setState(this.getUnskippedModeInfo(index, buttonText), () => {
|
||||
this.setState(this.getUnskippedModeInfo(buttonIndex, index, skipButtonState), () => {
|
||||
this.noticeRef.current.resetCountdown();
|
||||
});
|
||||
}
|
||||
|
||||
getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
|
||||
getUnskippedModeInfo(buttonIndex: number, index: number, skipButtonState: SkipButtonState): SkipNoticeState {
|
||||
const changeCountdown = this.segments[index].actionType !== ActionType.Poi;
|
||||
|
||||
const maxCountdownTime = changeCountdown ? () => {
|
||||
const maxCountdownTime = changeCountdown ?
|
||||
this.getFullDurationCountdown(index) : this.state.maxCountdownTime;
|
||||
|
||||
const skipButtonStates = this.state.skipButtonStates;
|
||||
const skipButtonCallbacks = this.state.skipButtonCallbacks;
|
||||
if (buttonIndex === null) {
|
||||
for (let i = 0; i < this.segments.length; i++) {
|
||||
skipButtonStates[i] = skipButtonState;
|
||||
skipButtonCallbacks[i] = this.reskip.bind(this);
|
||||
}
|
||||
} else {
|
||||
skipButtonStates[buttonIndex] = skipButtonState;
|
||||
skipButtonCallbacks[buttonIndex] = this.reskip.bind(this);
|
||||
|
||||
if (buttonIndex === 1) {
|
||||
// Trigger both to move at once
|
||||
skipButtonStates[0] = SkipButtonState.Redo;
|
||||
skipButtonCallbacks[0] = this.reskip.bind(this);
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
skipButtonStates,
|
||||
skipButtonCallbacks,
|
||||
// change max duration to however much of the sponsor is left
|
||||
maxCountdownTime,
|
||||
countdownTime: maxCountdownTime(),
|
||||
showSkipButton: buttonIndex === 1 ? [true, true] : this.state.showSkipButton
|
||||
} as SkipNoticeState;
|
||||
}
|
||||
|
||||
getFullDurationCountdown(index: number): () => number {
|
||||
return () => {
|
||||
const sponsorTime = this.segments[index];
|
||||
const duration = Math.round((sponsorTime.segment[1] - this.contentContainer().v.currentTime) * (1 / this.contentContainer().v.playbackRate));
|
||||
|
||||
return Math.max(duration, Config.config.skipNoticeDuration);
|
||||
} : this.state.maxCountdownTime;
|
||||
|
||||
return {
|
||||
skipButtonText: buttonText,
|
||||
skipButtonCallback: (index) => this.reskip(index),
|
||||
// change max duration to however much of the sponsor is left
|
||||
maxCountdownTime: maxCountdownTime,
|
||||
countdownTime: maxCountdownTime()
|
||||
} as SkipNoticeState;
|
||||
};
|
||||
}
|
||||
|
||||
afterVote(segment: SponsorTime, type: number, category: Category): void {
|
||||
@@ -690,12 +744,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
unmutedListener(): void {
|
||||
unmutedListener(time: number): void {
|
||||
if (this.props.segments.length === 1
|
||||
&& this.props.segments[0].actionType === ActionType.Mute
|
||||
&& this.contentContainer().v.currentTime >= this.props.segments[0].segment[1]) {
|
||||
&& time >= this.props.segments[0].segment[1]) {
|
||||
this.setState({
|
||||
showSkipButton: false
|
||||
showSkipButton: [false, true]
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -710,8 +764,20 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
});
|
||||
}
|
||||
|
||||
private getUnskipText(): string {
|
||||
switch (this.props.segments[0].actionType) {
|
||||
private getSkipButtonText(buttonIndex: number, forceType?: ActionType): string {
|
||||
switch (this.state.skipButtonStates[buttonIndex]) {
|
||||
case SkipButtonState.Undo:
|
||||
return this.getUndoText(forceType);
|
||||
case SkipButtonState.Redo:
|
||||
return this.getRedoText(forceType);
|
||||
case SkipButtonState.Start:
|
||||
return this.getStartText(forceType);
|
||||
}
|
||||
}
|
||||
|
||||
private getUndoText(forceType?: ActionType): string {
|
||||
const actionType = forceType || this.segments[0].actionType;
|
||||
switch (actionType) {
|
||||
case ActionType.Mute: {
|
||||
return chrome.i18n.getMessage("unmute");
|
||||
}
|
||||
@@ -722,8 +788,9 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
private getReskipText(): string {
|
||||
switch (this.props.segments[0].actionType) {
|
||||
private getRedoText(forceType?: ActionType): string {
|
||||
const actionType = forceType || this.segments[0].actionType;
|
||||
switch (actionType) {
|
||||
case ActionType.Mute: {
|
||||
return chrome.i18n.getMessage("mute");
|
||||
}
|
||||
@@ -734,8 +801,9 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
private getSkipText(): string {
|
||||
switch (this.props.segments[0].actionType) {
|
||||
private getStartText(forceType?: ActionType): string {
|
||||
const actionType = forceType || this.segments[0].actionType;
|
||||
switch (actionType) {
|
||||
case ActionType.Mute: {
|
||||
return chrome.i18n.getMessage("mute");
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ export interface SponsorTimeEditProps {
|
||||
|
||||
submissionNotice: SubmissionNoticeComponent;
|
||||
categoryList?: Category[];
|
||||
categoryChangeListener?: (index: number, category: Category) => void;
|
||||
}
|
||||
|
||||
export interface SponsorTimeEditState {
|
||||
@@ -365,9 +366,10 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
|
||||
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
|
||||
const chosenCategory = event.target.value as Category;
|
||||
|
||||
// See if show more categories was pressed
|
||||
if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
|
||||
const chosenCategory = event.target.value;
|
||||
event.target.value = DEFAULT_CATEGORY;
|
||||
|
||||
// Alert that they have to enable this category first
|
||||
@@ -381,8 +383,12 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
|
||||
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
|
||||
this.handleReplacingLostTimes(event.target.value as Category, sponsorTime.actionType, sponsorTime);
|
||||
this.handleReplacingLostTimes(chosenCategory, sponsorTime.actionType, sponsorTime);
|
||||
this.saveEditTimes();
|
||||
|
||||
if (this.props.categoryChangeListener) {
|
||||
this.props.categoryChangeListener(this.props.index, chosenCategory);
|
||||
}
|
||||
}
|
||||
|
||||
actionTypeSelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
|
||||
@@ -532,6 +538,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
const index = this.props.index;
|
||||
|
||||
const skipTime = sponsorTimes[index].segment[0];
|
||||
// If segment starts at 0:00, start playback at the end of the segment
|
||||
if (skipTime === 0) {
|
||||
this.props.contentContainer().previewTime(sponsorTimes[index].segment[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
let seekTime = 2;
|
||||
if (ctrlPressed) seekTime = 0.5;
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
import * as React from "react";
|
||||
import Config from "../config"
|
||||
import { ContentContainer } from "../types";
|
||||
import GenericNotice from "../render/GenericNotice";
|
||||
import { Category, ContentContainer } from "../types";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
|
||||
import NoticeComponent from "./NoticeComponent";
|
||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||
import SponsorTimeEditComponent from "./SponsorTimeEditComponent";
|
||||
import { getGuidelineInfo } from "../utils/constants";
|
||||
|
||||
export interface SubmissionNoticeProps {
|
||||
// Contains functions and variables from the content script needed by the skip notice
|
||||
@@ -32,6 +35,8 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
|
||||
videoObserver: MutationObserver;
|
||||
|
||||
guidelinesReminder: GenericNotice;
|
||||
|
||||
constructor(props: SubmissionNoticeProps) {
|
||||
super(props);
|
||||
this.noticeRef = React.createRef();
|
||||
@@ -128,6 +133,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
index={i}
|
||||
contentContainer={this.props.contentContainer}
|
||||
submissionNotice={this}
|
||||
categoryChangeListener={this.categoryChangeListener.bind(this)}
|
||||
ref={timeRef}>
|
||||
</SponsorTimeEditComponent>
|
||||
);
|
||||
@@ -154,9 +160,10 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
}
|
||||
|
||||
cancel(): void {
|
||||
this.guidelinesReminder?.close();
|
||||
this.noticeRef.current.close(true);
|
||||
|
||||
this.contentContainer().resetSponsorSubmissionNotice();
|
||||
this.contentContainer().resetSponsorSubmissionNotice(false);
|
||||
|
||||
this.props.closeListener();
|
||||
}
|
||||
@@ -190,6 +197,45 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
|
||||
this.cancel();
|
||||
}
|
||||
|
||||
categoryChangeListener(index: number, category: Category): void {
|
||||
const dialogWidth = this.noticeRef?.current?.getElement()?.current?.offsetWidth;
|
||||
if (category !== "chooseACategory" && Config.config.showCategoryGuidelines
|
||||
&& this.contentContainer().v.offsetWidth > dialogWidth * 2) {
|
||||
const options = {
|
||||
title: chrome.i18n.getMessage(`category_${category}`),
|
||||
textBoxes: getGuidelineInfo(category),
|
||||
buttons: [{
|
||||
name: chrome.i18n.getMessage("FullDetails"),
|
||||
listener: () => window.open(CompileConfig.wikiLinks[category])
|
||||
},
|
||||
{
|
||||
name: chrome.i18n.getMessage("Hide"),
|
||||
listener: () => {
|
||||
Config.config.showCategoryGuidelines = false;
|
||||
this.guidelinesReminder?.close();
|
||||
this.guidelinesReminder = null;
|
||||
}
|
||||
}],
|
||||
timed: false,
|
||||
style: {
|
||||
right: `${dialogWidth + 10}px`,
|
||||
},
|
||||
extraClass: "sb-guidelines-notice"
|
||||
};
|
||||
|
||||
if (options.textBoxes) {
|
||||
if (this.guidelinesReminder) {
|
||||
this.guidelinesReminder.update(options);
|
||||
} else {
|
||||
this.guidelinesReminder = new GenericNotice(null, "GuidelinesReminder", options);
|
||||
}
|
||||
} else {
|
||||
this.guidelinesReminder?.close();
|
||||
this.guidelinesReminder = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default SubmissionNoticeComponent;
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
import * as React from "react";
|
||||
import Config from "../config";
|
||||
import { Category, SegmentUUID, SponsorTime } from "../types";
|
||||
|
||||
export interface TooltipProps {
|
||||
text: string;
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import * as CompileConfig from "../config.json";
|
||||
import * as invidiousList from "../ci/invidiouslist.json";
|
||||
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes, Keybind, HashedValue, VideoID, SponsorHideType } from "./types";
|
||||
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, Keybind, HashedValue, VideoID, SponsorHideType } from "./types";
|
||||
import { keybindEquals } from "./utils/configUtils";
|
||||
|
||||
interface SBConfig {
|
||||
userID: string,
|
||||
isVip: boolean,
|
||||
lastIsVipUpdate: number,
|
||||
/* Contains unsubmitted segments that the user has created. */
|
||||
unsubmittedSegments: Record<string, SponsorTime[]>,
|
||||
defaultCategory: Category,
|
||||
@@ -56,6 +55,7 @@ interface SBConfig {
|
||||
scrollToEditTimeUpdate: boolean,
|
||||
categoryPillUpdate: boolean,
|
||||
darkMode: boolean,
|
||||
showCategoryGuidelines: boolean,
|
||||
|
||||
// Used to cache calculated text color info
|
||||
categoryPillColors: {
|
||||
@@ -102,9 +102,11 @@ export type VideoDownvotes = { segments: { uuid: HashedValue, hidden: SponsorHid
|
||||
interface SBStorage {
|
||||
/* VideoID prefixes to UUID prefixes */
|
||||
downvotedSegments: Record<VideoID & HashedValue, VideoDownvotes>,
|
||||
navigationApiAvailable: boolean,
|
||||
}
|
||||
|
||||
export interface SBObject {
|
||||
configLocalListeners: Array<(changes: StorageChangesObject) => unknown>;
|
||||
configSyncListeners: Array<(changes: StorageChangesObject) => unknown>;
|
||||
syncDefaults: SBConfig;
|
||||
localDefaults: SBStorage;
|
||||
@@ -114,17 +116,18 @@ export interface SBObject {
|
||||
local: SBStorage;
|
||||
forceSyncUpdate(prop: string): void;
|
||||
forceLocalUpdate(prop: string): void;
|
||||
resetToDefault(): void;
|
||||
}
|
||||
|
||||
const Config: SBObject = {
|
||||
/**
|
||||
* Callback function when an option is updated
|
||||
*/
|
||||
configLocalListeners: [],
|
||||
configSyncListeners: [],
|
||||
syncDefaults: {
|
||||
userID: null,
|
||||
isVip: false,
|
||||
lastIsVipUpdate: 0,
|
||||
unsubmittedSegments: {},
|
||||
defaultCategory: "chooseACategory" as Category,
|
||||
whitelistedChannels: [],
|
||||
@@ -168,6 +171,7 @@ const Config: SBObject = {
|
||||
scrollToEditTimeUpdate: false, // false means the tooltip will be shown
|
||||
categoryPillUpdate: false,
|
||||
darkMode: true,
|
||||
showCategoryGuidelines: true,
|
||||
|
||||
categoryPillColors: {},
|
||||
|
||||
@@ -284,14 +288,16 @@ const Config: SBObject = {
|
||||
}
|
||||
},
|
||||
localDefaults: {
|
||||
downvotedSegments: {}
|
||||
downvotedSegments: {},
|
||||
navigationApiAvailable: null
|
||||
},
|
||||
cachedSyncConfig: null,
|
||||
cachedLocalStorage: null,
|
||||
config: null,
|
||||
local: null,
|
||||
forceSyncUpdate,
|
||||
forceLocalUpdate
|
||||
forceLocalUpdate,
|
||||
resetToDefault
|
||||
};
|
||||
|
||||
// Function setup
|
||||
@@ -310,6 +316,10 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
|
||||
for (const key in changes) {
|
||||
Config.cachedLocalStorage[key] = changes[key].newValue;
|
||||
}
|
||||
|
||||
for (const callback of Config.configLocalListeners) {
|
||||
callback(changes);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -370,8 +380,20 @@ function configProxy(): { sync: SBConfig, local: SBStorage } {
|
||||
}
|
||||
|
||||
function forceSyncUpdate(prop: string): void {
|
||||
const value = Config.cachedSyncConfig[prop];
|
||||
if (prop === "unsubmittedSegments") {
|
||||
// Early to be safe
|
||||
if (JSON.stringify(value).length + prop.length > 8000) {
|
||||
for (const key in value) {
|
||||
if (!value[key] || value[key].length <= 0) {
|
||||
delete value[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
chrome.storage.sync.set({
|
||||
[prop]: Config.cachedSyncConfig[prop]
|
||||
[prop]: value
|
||||
});
|
||||
}
|
||||
|
||||
@@ -487,6 +509,10 @@ function migrateOldSyncFormats(config: SBConfig) {
|
||||
if (!config["supportInvidious"] && config["invidiousInstances"].length !== invidiousList.length) {
|
||||
config["invidiousInstances"] = invidiousList;
|
||||
}
|
||||
|
||||
if (config["lastIsVipUpdate"]) {
|
||||
chrome.storage.sync.remove("lastIsVipUpdate");
|
||||
}
|
||||
}
|
||||
|
||||
async function setupConfig() {
|
||||
@@ -520,6 +546,16 @@ function addDefaults() {
|
||||
}
|
||||
}
|
||||
|
||||
function resetToDefault() {
|
||||
chrome.storage.sync.set({
|
||||
...Config.syncDefaults,
|
||||
userID: Config.config.userID,
|
||||
minutesSaved: Config.config.minutesSaved,
|
||||
skipCount: Config.config.skipCount,
|
||||
sponsorTimesContributed: Config.config.sponsorTimesContributed
|
||||
});
|
||||
}
|
||||
|
||||
// Sync config
|
||||
setupConfig();
|
||||
|
||||
|
||||
388
src/content.ts
@@ -5,8 +5,6 @@ import { ContentContainer, Keybind } from "./types";
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
|
||||
import runThePopup from "./popup";
|
||||
|
||||
import PreviewBar, {PreviewBarSegment} from "./js-components/previewBar";
|
||||
import SkipNotice from "./render/SkipNotice";
|
||||
import SkipNoticeComponent from "./components/SkipNoticeComponent";
|
||||
@@ -20,6 +18,7 @@ import { isSafari, keybindEquals } from "./utils/configUtils";
|
||||
import { CategoryPill } from "./render/CategoryPill";
|
||||
import { AnimationUtils } from "./utils/animationUtils";
|
||||
import { GenericUtils } from "./utils/genericUtils";
|
||||
import { logDebug } from "./utils/logger";
|
||||
|
||||
// Hack to get the CSS loaded on permission-based sites (Invidious)
|
||||
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
|
||||
@@ -45,6 +44,8 @@ let lastKnownVideoTime: { videoTime: number, preciseTime: number } = {
|
||||
videoTime: null,
|
||||
preciseTime: null
|
||||
};
|
||||
// It resumes with a slightly later time on chromium
|
||||
let lastTimeFromWaitingEvent = null;
|
||||
|
||||
// Skips are scheduled to ensure precision.
|
||||
// Skips are rescheduled every seeking event.
|
||||
@@ -63,6 +64,7 @@ let videoMutationObserver: MutationObserver = null;
|
||||
const videosWithEventListeners: HTMLVideoElement[] = [];
|
||||
const controlsWithEventListeners: HTMLElement[] = []
|
||||
|
||||
// This misleading variable name will be fixed soon
|
||||
let onInvidious;
|
||||
let onMobileYouTube;
|
||||
|
||||
@@ -193,14 +195,14 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
break;
|
||||
case "whitelistChange":
|
||||
channelWhitelisted = request.value;
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
sponsorsLookup();
|
||||
|
||||
break;
|
||||
case "submitTimes":
|
||||
submitSponsorTimes();
|
||||
break;
|
||||
case "refreshSegments":
|
||||
sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({
|
||||
sponsorsLookup(false).then(() => sendResponse({
|
||||
found: sponsorDataFound,
|
||||
sponsorTimes: sponsorTimes,
|
||||
onMobileYouTube
|
||||
@@ -215,8 +217,27 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type);
|
||||
updatePreviewBar();
|
||||
break;
|
||||
|
||||
case "closePopup":
|
||||
closeInfoMenu();
|
||||
break;
|
||||
case "copyToClipboard":
|
||||
navigator.clipboard.writeText(request.text);
|
||||
break;
|
||||
case "keydown":
|
||||
document.dispatchEvent(new KeyboardEvent('keydown', {
|
||||
key: request.key,
|
||||
keyCode: request.keyCode,
|
||||
code: request.code,
|
||||
which: request.which,
|
||||
shiftKey: request.shiftKey,
|
||||
ctrlKey: request.ctrlKey,
|
||||
altKey: request.altKey,
|
||||
metaKey: request.metaKey
|
||||
}));
|
||||
break;
|
||||
}
|
||||
|
||||
sendResponse({});
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -232,6 +253,9 @@ function contentConfigUpdateListener(changes: StorageChangesObject) {
|
||||
case "hideDeleteButtonPlayerControls":
|
||||
updateVisibilityOfPlayerControlsButton()
|
||||
break;
|
||||
case "categorySelections":
|
||||
sponsorsLookup();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -269,6 +293,7 @@ function resetValues() {
|
||||
switchingVideos = false;
|
||||
} else {
|
||||
switchingVideos = true;
|
||||
logDebug("Setting switching videos to true (reset data)");
|
||||
}
|
||||
|
||||
firstEvent = true;
|
||||
@@ -286,7 +311,7 @@ function resetValues() {
|
||||
|
||||
async function videoIDChange(id) {
|
||||
//if the id has not changed return unless the video element has changed
|
||||
if (sponsorVideoID === id && isVisible(video)) return;
|
||||
if (sponsorVideoID === id && (isVisible(video) || !video)) return;
|
||||
|
||||
//set the global videoID
|
||||
sponsorVideoID = id;
|
||||
@@ -313,9 +338,6 @@ async function videoIDChange(id) {
|
||||
}
|
||||
}
|
||||
|
||||
// Get new video info
|
||||
// getVideoInfo(); // Seems to have been replaced
|
||||
|
||||
// Update whitelist data when the video data is loaded
|
||||
whitelistCheck();
|
||||
|
||||
@@ -385,18 +407,32 @@ function handleMobileControlsMutations(): void {
|
||||
function createPreviewBar(): void {
|
||||
if (previewBar !== null) return;
|
||||
|
||||
const progressElementSelectors = [
|
||||
const progressElementOptions = [{
|
||||
// For mobile YouTube
|
||||
".progress-bar-background",
|
||||
// For YouTube
|
||||
".ytp-progress-bar-container",
|
||||
".no-model.cue-range-markers",
|
||||
selector: ".progress-bar-background",
|
||||
isVisibleCheck: true
|
||||
}, {
|
||||
// For new mobile YouTube (#1287)
|
||||
selector: ".ytm-progress-bar",
|
||||
isVisibleCheck: true
|
||||
}, {
|
||||
// For Desktop YouTube
|
||||
selector: ".ytp-progress-bar-container",
|
||||
isVisibleCheck: true
|
||||
}, {
|
||||
// For Desktop YouTube
|
||||
selector: ".no-model.cue-range-marker",
|
||||
isVisibleCheck: true
|
||||
}, {
|
||||
// For Invidious/VideoJS
|
||||
".vjs-progress-holder"
|
||||
selector: ".vjs-progress-holder",
|
||||
isVisibleCheck: false
|
||||
}
|
||||
];
|
||||
|
||||
for (const selector of progressElementSelectors) {
|
||||
const el = findValidElement(document.querySelectorAll(selector));
|
||||
for (const option of progressElementOptions) {
|
||||
const allElements = document.querySelectorAll(option.selector) as NodeListOf<HTMLElement>;
|
||||
const el = option.isVisibleCheck ? findValidElement(allElements) : allElements[0];
|
||||
|
||||
if (el) {
|
||||
previewBar = new PreviewBar(el, onMobileYouTube, onInvidious);
|
||||
@@ -428,6 +464,8 @@ function videoOnReadyListener(): void {
|
||||
}
|
||||
|
||||
function cancelSponsorSchedule(): void {
|
||||
logDebug("Pausing skipping");
|
||||
|
||||
if (currentSkipSchedule !== null) {
|
||||
clearTimeout(currentSkipSchedule);
|
||||
currentSkipSchedule = null;
|
||||
@@ -450,20 +488,18 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
// Reset lastCheckVideoTime
|
||||
lastCheckVideoTime = -1;
|
||||
lastCheckTime = 0;
|
||||
logDebug("[SB] Ad playing, pausing skipping");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
logDebug(`Considering to start skipping: ${!video}, ${video?.paused}`);
|
||||
|
||||
if (!video || video.paused) return;
|
||||
if (currentTime === undefined || currentTime === null) {
|
||||
const virtualTime = lastKnownVideoTime.videoTime ?
|
||||
(performance.now() - lastKnownVideoTime.preciseTime) / 1000 + lastKnownVideoTime.videoTime : null;
|
||||
if (!utils.isFirefox() && !isSafari() && virtualTime && Math.abs(virtualTime - video.currentTime) < 0.6){
|
||||
currentTime = virtualTime;
|
||||
} else {
|
||||
currentTime = video.currentTime;
|
||||
}
|
||||
currentTime = getVirtualTime();
|
||||
}
|
||||
lastTimeFromWaitingEvent = null;
|
||||
|
||||
if (videoMuted && !inMuteSegment(currentTime)) {
|
||||
video.muted = false;
|
||||
@@ -471,7 +507,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
|
||||
for (const notice of skipNotices) {
|
||||
// So that the notice can hide buttons
|
||||
notice.unmutedListener();
|
||||
notice.unmutedListener(currentTime);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -483,6 +519,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
|
||||
const skipInfo = getNextSkipIndex(currentTime, includeIntersectingSegments, includeNonIntersectingSegments);
|
||||
|
||||
logDebug(`Ready to start skipping: ${skipInfo.index} at ${currentTime}`);
|
||||
if (skipInfo.index === -1) return;
|
||||
|
||||
const currentSkip = skipInfo.array[skipInfo.index];
|
||||
@@ -503,18 +540,21 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
}
|
||||
}
|
||||
|
||||
logDebug(`Next step in starting skipping: ${!shouldSkip(currentSkip)}, ${!sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment)}`);
|
||||
|
||||
// Don't skip if this category should not be skipped
|
||||
if (!shouldSkip(currentSkip) && !sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment)) return;
|
||||
|
||||
const skipBuffer = 0.003;
|
||||
const skippingFunction = (forceVideoTime?: number) => {
|
||||
let forcedSkipTime: number = null;
|
||||
let forcedIncludeIntersectingSegments = false;
|
||||
let forcedIncludeNonIntersectingSegments = true;
|
||||
|
||||
if (incorrectVideoCheck(videoID, currentSkip)) return;
|
||||
forceVideoTime ||= video.currentTime;
|
||||
forceVideoTime ||= Math.max(video.currentTime, getVirtualTime());
|
||||
|
||||
if (forceVideoTime >= skipTime[0] && forceVideoTime < skipTime[1]) {
|
||||
if (forceVideoTime >= skipTime[0] - skipBuffer && forceVideoTime < skipTime[1]) {
|
||||
skipToTime({
|
||||
v: video,
|
||||
skipTime,
|
||||
@@ -535,14 +575,16 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
startSponsorSchedule(forcedIncludeIntersectingSegments, forcedSkipTime, forcedIncludeNonIntersectingSegments);
|
||||
};
|
||||
|
||||
if (timeUntilSponsor <= 0) {
|
||||
skippingFunction();
|
||||
if (timeUntilSponsor < skipBuffer) {
|
||||
skippingFunction(currentTime);
|
||||
} else {
|
||||
const delayTime = timeUntilSponsor * 1000 * (1 / video.playbackRate);
|
||||
if (delayTime < 300) {
|
||||
// For Firefox, 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 startVideoTime = Math.max(currentTime, video.currentTime);
|
||||
logDebug(`Starting setInterval skipping ${video.currentTime} to skip at ${skipTime[0]}`);
|
||||
|
||||
currentSkipInterval = setInterval(() => {
|
||||
const intervalDuration = performance.now() - startIntervalTime;
|
||||
if (intervalDuration >= delayTime || video.currentTime >= skipTime[0]) {
|
||||
@@ -557,12 +599,26 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
}
|
||||
}, 1);
|
||||
} else {
|
||||
logDebug(`Starting timeout to skip ${video.currentTime} to skip at ${skipTime[0]}`);
|
||||
|
||||
// Schedule for right before to be more precise than normal timeout
|
||||
currentSkipSchedule = setTimeout(skippingFunction, Math.max(0, delayTime - 100));
|
||||
currentSkipSchedule = setTimeout(skippingFunction, Math.max(0, delayTime - 150));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function getVirtualTime(): number {
|
||||
const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime ?
|
||||
(performance.now() - lastKnownVideoTime.preciseTime) / 1000 + lastKnownVideoTime.videoTime : null);
|
||||
|
||||
if ((lastTimeFromWaitingEvent || !utils.isFirefox())
|
||||
&& !isSafari() && virtualTime && Math.abs(virtualTime - video.currentTime) < 0.6) {
|
||||
return virtualTime;
|
||||
} else {
|
||||
return video.currentTime;
|
||||
}
|
||||
}
|
||||
|
||||
function inMuteSegment(currentTime: number): boolean {
|
||||
const checkFunction = (segment) => segment.actionType === ActionType.Mute && segment.segment[0] <= currentTime && segment.segment[1] > currentTime;
|
||||
return sponsorTimes?.some(checkFunction) || sponsorTimesSubmitting.some(checkFunction);
|
||||
@@ -633,6 +689,8 @@ function setupVideoListeners() {
|
||||
if (!Config.config.disableSkipping) {
|
||||
switchingVideos = false;
|
||||
|
||||
let startedWaiting = false;
|
||||
|
||||
video.addEventListener('play', () => {
|
||||
// If it is not the first event, then the only way to get to 0 is if there is a seek event
|
||||
// This check makes sure that changing the video resolution doesn't cause the extension to think it
|
||||
@@ -644,6 +702,8 @@ function setupVideoListeners() {
|
||||
|
||||
if (switchingVideos) {
|
||||
switchingVideos = false;
|
||||
logDebug("Setting switching videos to false");
|
||||
|
||||
// If already segments loaded before video, retry to skip starting segments
|
||||
if (sponsorTimes) startSkipScheduleCheckingForStartSponsors();
|
||||
}
|
||||
@@ -664,6 +724,12 @@ function setupVideoListeners() {
|
||||
video.addEventListener('playing', () => {
|
||||
updateVirtualTime();
|
||||
|
||||
if (startedWaiting) {
|
||||
startedWaiting = false;
|
||||
logDebug(`[SB] Playing event after buffering: ${Math.abs(lastCheckVideoTime - video.currentTime) > 0.3
|
||||
|| (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)}`);
|
||||
}
|
||||
|
||||
// Make sure it doesn't get double called with the play event
|
||||
if (Math.abs(lastCheckVideoTime - video.currentTime) > 0.3
|
||||
|| (lastCheckVideoTime !== video.currentTime && Date.now() - lastCheckTime > 2000)) {
|
||||
@@ -680,6 +746,7 @@ function setupVideoListeners() {
|
||||
lastCheckVideoTime = video.currentTime;
|
||||
|
||||
updateVirtualTime();
|
||||
lastTimeFromWaitingEvent = null;
|
||||
|
||||
startSponsorSchedule();
|
||||
}
|
||||
@@ -696,11 +763,17 @@ function setupVideoListeners() {
|
||||
videoTime: null,
|
||||
preciseTime: null
|
||||
}
|
||||
lastTimeFromWaitingEvent = video.currentTime;
|
||||
|
||||
cancelSponsorSchedule();
|
||||
};
|
||||
video.addEventListener('pause', paused);
|
||||
video.addEventListener('waiting', paused);
|
||||
video.addEventListener('pause', () => paused());
|
||||
video.addEventListener('waiting', () => {
|
||||
logDebug("[SB] Not skipping due to buffering");
|
||||
startedWaiting = true;
|
||||
|
||||
paused();
|
||||
});
|
||||
|
||||
startSponsorSchedule();
|
||||
}
|
||||
@@ -738,11 +811,11 @@ function setupCategoryPill() {
|
||||
categoryPill.attachToPage(onMobileYouTube, onInvidious, voteAsync);
|
||||
}
|
||||
|
||||
async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
async function sponsorsLookup(keepOldSubmissions = true) {
|
||||
if (!video || !isVisible(video)) refreshVideoAttachments();
|
||||
//there is still no video here
|
||||
if (!video) {
|
||||
setTimeout(() => sponsorsLookup(id), 100);
|
||||
setTimeout(() => sponsorsLookup(), 100);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -756,7 +829,7 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
if (hashParams.requiredSegment) extraRequestData.requiredSegment = hashParams.requiredSegment;
|
||||
|
||||
// Check for hashPrefix setting
|
||||
const hashPrefix = (await utils.getHash(id, 1)).slice(0, 4) as VideoID & HashedValue;
|
||||
const hashPrefix = (await utils.getHash(sponsorVideoID, 1)).slice(0, 4) as VideoID & HashedValue;
|
||||
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories,
|
||||
actionTypes: getEnabledActionTypes(),
|
||||
@@ -766,7 +839,7 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
|
||||
if (response?.ok) {
|
||||
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
|
||||
?.filter((video) => video.videoID === id)
|
||||
?.filter((video) => video.videoID === sponsorVideoID)
|
||||
?.map((video) => video.segments)[0];
|
||||
if (!recievedSegments || !recievedSegments.length) {
|
||||
// return if no video found
|
||||
@@ -826,7 +899,7 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
|
||||
//update the preview bar
|
||||
//leave the type blank for now until categories are added
|
||||
if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(video.duration))) {
|
||||
if (lastPreviewBarUpdate == sponsorVideoID || (lastPreviewBarUpdate == null && !isNaN(video.duration))) {
|
||||
//set it now
|
||||
//otherwise the listener can handle it
|
||||
updatePreviewBar();
|
||||
@@ -835,7 +908,9 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
retryFetch();
|
||||
}
|
||||
|
||||
lookupVipInformation(id);
|
||||
if (Config.config.isVip) {
|
||||
lockedCategoriesLookup();
|
||||
}
|
||||
}
|
||||
|
||||
function getEnabledActionTypes(): ActionType[] {
|
||||
@@ -850,46 +925,13 @@ function getEnabledActionTypes(): ActionType[] {
|
||||
return actionTypes;
|
||||
}
|
||||
|
||||
function lookupVipInformation(id: string): void {
|
||||
updateVipInfo().then((isVip) => {
|
||||
if (isVip) {
|
||||
lockedCategoriesLookup(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function updateVipInfo(): Promise<boolean> {
|
||||
const currentTime = Date.now();
|
||||
const lastUpdate = Config.config.lastIsVipUpdate;
|
||||
if (currentTime - lastUpdate > 1000 * 60 * 60 * 72) { // 72 hours
|
||||
Config.config.lastIsVipUpdate = currentTime;
|
||||
|
||||
const response = await utils.asyncRequestToServer("GET", "/api/isUserVIP", { userID: Config.config.userID});
|
||||
|
||||
if (response.ok) {
|
||||
let isVip = false;
|
||||
try {
|
||||
const vipResponse = JSON.parse(response.responseText)?.vip;
|
||||
if (typeof(vipResponse) === "boolean") {
|
||||
isVip = vipResponse;
|
||||
}
|
||||
} catch (e) { } //eslint-disable-line no-empty
|
||||
|
||||
Config.config.isVip = isVip;
|
||||
return isVip;
|
||||
}
|
||||
}
|
||||
|
||||
return Config.config.isVip;
|
||||
}
|
||||
|
||||
async function lockedCategoriesLookup(id: string): Promise<void> {
|
||||
const hashPrefix = (await utils.getHash(id, 1)).slice(0, 4);
|
||||
async function lockedCategoriesLookup(): Promise<void> {
|
||||
const hashPrefix = (await utils.getHash(sponsorVideoID, 1)).slice(0, 4);
|
||||
const response = await utils.asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
|
||||
|
||||
if (response.ok) {
|
||||
try {
|
||||
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === id)[0]?.categories;
|
||||
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === sponsorVideoID)[0]?.categories;
|
||||
if (Array.isArray(categoriesResponse)) {
|
||||
lockedCategories = categoriesResponse;
|
||||
}
|
||||
@@ -904,7 +946,7 @@ function retryFetch(): void {
|
||||
|
||||
setTimeout(() => {
|
||||
if (sponsorVideoID && sponsorTimes?.length === 0) {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
sponsorsLookup();
|
||||
}
|
||||
}, 10000 + Math.random() * 30000);
|
||||
}
|
||||
@@ -920,12 +962,10 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
// See if there are any starting sponsors
|
||||
let startingSegmentTime = getStartTimeFromUrl(document.URL) || -1;
|
||||
let found = false;
|
||||
let startingSegment: SponsorTime = null;
|
||||
for (const time of sponsorTimes) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& time.actionType !== ActionType.Poi) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
@@ -935,7 +975,6 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& time.actionType !== ActionType.Poi) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
@@ -973,34 +1012,14 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the video info for the current tab from YouTube
|
||||
*
|
||||
* TODO: Replace
|
||||
*/
|
||||
async function getVideoInfo(): Promise<void> {
|
||||
const result = await utils.asyncRequestToCustomServer("GET", "https://www.youtube.com/get_video_info?video_id=" + sponsorVideoID + "&html5=1&c=TVHTML5&cver=7.20190319");
|
||||
|
||||
if (result.ok) {
|
||||
const decodedData = decodeURIComponent(result.responseText).match(/player_response=([^&]*)/)[1];
|
||||
if (!decodedData) {
|
||||
console.error("[SB] Failed at getting video info from YouTube.");
|
||||
console.error("[SB] Data returned from YouTube: " + result.responseText);
|
||||
return;
|
||||
}
|
||||
|
||||
videoInfo = JSON.parse(decodedData);
|
||||
}
|
||||
}
|
||||
|
||||
function getYouTubeVideoID(document: Document): string | boolean {
|
||||
const url = document.URL;
|
||||
// clips should never skip, going from clip to full video has no indications.
|
||||
if (url.includes("youtube.com/clip/")) return false;
|
||||
// skip to document and don't hide if on /embed/
|
||||
if (url.includes("/embed/") && url.includes("youtube.com")) return getYouTubeVideoIDFromDocument(document, false);
|
||||
// skip to URL if matches youtube watch or invidious or matches youtube pattern
|
||||
if ((!url.includes("youtube.com")) || url.includes("/watch") || url.includes("/shorts/") || url.includes("playlist")) return getYouTubeVideoIDFromURL(url);
|
||||
// skip to document and don't hide if on /embed/
|
||||
if (url.includes("/embed/")) return getYouTubeVideoIDFromDocument(document, false);
|
||||
// skip to document if matches pattern
|
||||
if (url.includes("/channel/") || url.includes("/user/") || url.includes("/c/")) return getYouTubeVideoIDFromDocument(document);
|
||||
// not sure, try URL then document
|
||||
@@ -1041,7 +1060,9 @@ function getYouTubeVideoIDFromURL(url: string): string | boolean {
|
||||
utils.wait(() => Config.config !== null).then(() => videoIDChange(getYouTubeVideoIDFromURL(url)));
|
||||
}
|
||||
|
||||
return false
|
||||
return false;
|
||||
} else {
|
||||
onInvidious = false;
|
||||
}
|
||||
|
||||
//Get ID from searchParam
|
||||
@@ -1120,11 +1141,12 @@ function updatePreviewBar(): void {
|
||||
async function whitelistCheck() {
|
||||
const whitelistedChannels = Config.config.whitelistedChannels;
|
||||
|
||||
const getChannelID = () => videoInfo?.videoDetails?.channelId
|
||||
?? document.querySelector(".ytd-channel-name a")?.getAttribute("href")?.replace(/\/.+\//, "") // YouTube
|
||||
?? document.querySelector(".ytp-title-channel-logo")?.getAttribute("href")?.replace(/https:\/.+\//, "") // YouTube Embed
|
||||
?? document.querySelector("a > .channel-profile")?.parentElement?.getAttribute("href")?.replace(/\/.+\//, "") // Invidious
|
||||
?? document.querySelector("a.slim-owner-icon-and-title")?.getAttribute("href")?.replace(/\/.+\//, ""); // Mobile YouTube
|
||||
const getChannelID = () =>
|
||||
(document.querySelector("a.ytd-video-owner-renderer") // YouTube
|
||||
?? document.querySelector("a.ytp-title-channel-logo") // YouTube Embed
|
||||
?? document.querySelector(".channel-profile #channel-name")?.parentElement.parentElement // Invidious
|
||||
?? document.querySelector("a.slim-owner-icon-and-title")) // Mobile YouTube
|
||||
?.getAttribute("href")?.match(/\/(?:channel|c|user)\/(UC[a-zA-Z0-9_-]{22}|[a-zA-Z0-9_-]+)/)?.[1];
|
||||
|
||||
try {
|
||||
await utils.wait(() => !!getChannelID(), 6000, 20);
|
||||
@@ -1132,14 +1154,12 @@ async function whitelistCheck() {
|
||||
channelIDInfo = {
|
||||
status: ChannelIDStatus.Found,
|
||||
id: getChannelID().match(/^\/?([^\s/]+)/)[0]
|
||||
}
|
||||
};
|
||||
} catch (e) {
|
||||
channelIDInfo = {
|
||||
status: ChannelIDStatus.Failed,
|
||||
id: null
|
||||
}
|
||||
|
||||
return;
|
||||
};
|
||||
}
|
||||
|
||||
//see if this is a whitelisted channel
|
||||
@@ -1378,12 +1398,17 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
if (openNotice) {
|
||||
//send out the message saying that a sponsor message was skipped
|
||||
if (!Config.config.dontShowNotice || !autoSkip) {
|
||||
const newSkipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer, unskipTime);
|
||||
if (onMobileYouTube || Config.config.skipKeybind == null) newSkipNotice.setShowKeybindHint(false);
|
||||
skipNotices.push(newSkipNotice);
|
||||
|
||||
createSkipNotice(skippingSegments, autoSkip, unskipTime, false);
|
||||
} else if (autoSkip) {
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
activeSkipKeybindElement = newSkipNotice;
|
||||
activeSkipKeybindElement = {
|
||||
setShowKeybindHint: () => {}, //eslint-disable-line @typescript-eslint/no-empty-function
|
||||
toggleSkip: () => {
|
||||
unskipSponsorTime(skippingSegments[0], unskipTime);
|
||||
|
||||
createSkipNotice(skippingSegments, autoSkip, unskipTime, true);
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1392,19 +1417,38 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
if (autoSkip) sendTelemetryAndCount(skippingSegments, skipTime[1] - skipTime[0], true);
|
||||
}
|
||||
|
||||
function unskipSponsorTime(segment: SponsorTime, unskipTime: number = null) {
|
||||
function createSkipNotice(skippingSegments: SponsorTime[], autoSkip: boolean, unskipTime: number, startReskip: boolean) {
|
||||
for (const skipNotice of skipNotices) {
|
||||
if (skippingSegments.length === skipNotice.segments.length
|
||||
&& skippingSegments.every((segment) => skipNotice.segments.some((s) => s.UUID === segment.UUID))) {
|
||||
// Skip notice already exists
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const newSkipNotice = new SkipNotice(skippingSegments, autoSkip, skipNoticeContentContainer, unskipTime, startReskip);
|
||||
if (onMobileYouTube || Config.config.skipKeybind == null) newSkipNotice.setShowKeybindHint(false);
|
||||
skipNotices.push(newSkipNotice);
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
activeSkipKeybindElement = newSkipNotice;
|
||||
}
|
||||
|
||||
function unskipSponsorTime(segment: SponsorTime, unskipTime: number = null, forceSeek = false) {
|
||||
if (segment.actionType === ActionType.Mute) {
|
||||
video.muted = false;
|
||||
videoMuted = false;
|
||||
} else {
|
||||
}
|
||||
|
||||
if (forceSeek || segment.actionType === ActionType.Skip) {
|
||||
//add a tiny bit of time to make sure it is not skipped again
|
||||
video.currentTime = unskipTime ?? segment.segment[0] + 0.001;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function reskipSponsorTime(segment: SponsorTime) {
|
||||
if (segment.actionType === ActionType.Mute) {
|
||||
function reskipSponsorTime(segment: SponsorTime, forceSeek = false) {
|
||||
if (segment.actionType === ActionType.Mute && !forceSeek) {
|
||||
video.muted = true;
|
||||
videoMuted = true;
|
||||
} else {
|
||||
@@ -1590,7 +1634,7 @@ function startOrEndTimingNewSegment() {
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
// Make sure they know if someone has already submitted something it while they were watching
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
sponsorsLookup();
|
||||
|
||||
updateEditButtonsOnPlayer();
|
||||
updateSponsorTimesSubmitting(false);
|
||||
@@ -1660,35 +1704,16 @@ function openInfoMenu() {
|
||||
//hide info button
|
||||
if (playerButtons.info) playerButtons.info.button.style.display = "none";
|
||||
|
||||
sendRequestToCustomServer('GET', chrome.extension.getURL("popup.html"), function(xmlhttp) {
|
||||
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
|
||||
|
||||
const popup = document.createElement("div");
|
||||
popup.id = "sponsorBlockPopupContainer";
|
||||
|
||||
let htmlData = xmlhttp.responseText;
|
||||
// Hack to replace head data (title, favicon)
|
||||
htmlData = htmlData.replace(/<head>[\S\s]*<\/head>/gi, "");
|
||||
// Hack to replace body and html tag with div
|
||||
htmlData = htmlData.replace(/<body/gi, "<div");
|
||||
htmlData = htmlData.replace(/<\/body/gi, "</div");
|
||||
htmlData = htmlData.replace(/<html/gi, "<div");
|
||||
htmlData = htmlData.replace(/<\/html/gi, "</div");
|
||||
|
||||
popup.innerHTML = htmlData;
|
||||
|
||||
//close button
|
||||
const closeButton = document.createElement("button");
|
||||
const closeButtonIcon = document.createElement("img");
|
||||
closeButtonIcon.src = chrome.extension.getURL("icons/close.png");
|
||||
closeButtonIcon.width = 15;
|
||||
closeButtonIcon.height = 15;
|
||||
closeButton.appendChild(closeButtonIcon);
|
||||
closeButton.setAttribute("title", chrome.i18n.getMessage("closePopup"));
|
||||
closeButton.classList.add("sbCloseButton");
|
||||
closeButton.addEventListener("click", closeInfoMenu);
|
||||
|
||||
//add the close button
|
||||
popup.prepend(closeButton);
|
||||
const frame = document.createElement("iframe");
|
||||
frame.width = "374";
|
||||
frame.height = "500";
|
||||
frame.addEventListener("load", () => frame.contentWindow.postMessage("", "*"));
|
||||
frame.src = chrome.extension.getURL("popup.html");
|
||||
popup.appendChild(frame);
|
||||
|
||||
const parentNodes = document.querySelectorAll("#secondary");
|
||||
let parentNode = null;
|
||||
@@ -1702,31 +1727,7 @@ function openInfoMenu() {
|
||||
parentNode = document.getElementById("watch7-sidebar-contents");
|
||||
}
|
||||
|
||||
//make the logo source not 404
|
||||
//query selector must be used since getElementByID doesn't work on a node and this isn't added to the document yet
|
||||
const logo = <HTMLImageElement> popup.querySelector("#sponsorBlockPopupLogo");
|
||||
const settings = <HTMLImageElement> popup.querySelector("#sbPopupIconSettings");
|
||||
const edit = <HTMLImageElement> popup.querySelector("#sbPopupIconEdit");
|
||||
const copy = <HTMLImageElement> popup.querySelector("#sbPopupIconCopyUserID");
|
||||
const check = <HTMLImageElement> popup.querySelector("#sbPopupIconCheck");
|
||||
const refreshSegments = <HTMLImageElement> popup.querySelector("#refreshSegments");
|
||||
const heart = <HTMLImageElement> popup.querySelector(".sbHeart");
|
||||
const close = <HTMLImageElement> popup.querySelector("#sbCloseDonate");
|
||||
logo.src = chrome.extension.getURL("icons/IconSponsorBlocker256px.png");
|
||||
settings.src = chrome.extension.getURL("icons/settings.svg");
|
||||
edit.src = chrome.extension.getURL("icons/pencil.svg");
|
||||
copy.src = chrome.extension.getURL("icons/clipboard.svg");
|
||||
check.src = chrome.extension.getURL("icons/check.svg");
|
||||
heart.src = chrome.extension.getURL("icons/heart.svg");
|
||||
close.src = chrome.extension.getURL("icons/close.png");
|
||||
refreshSegments.src = chrome.extension.getURL("icons/refresh.svg");
|
||||
|
||||
parentNode.insertBefore(popup, parentNode.firstChild);
|
||||
|
||||
//run the popup init script
|
||||
runThePopup(messageListener);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function closeInfoMenu() {
|
||||
@@ -1878,8 +1879,8 @@ function dontShowNoticeAgain() {
|
||||
/**
|
||||
* Helper method for the submission notice to clear itself when it closes
|
||||
*/
|
||||
function resetSponsorSubmissionNotice() {
|
||||
submissionNotice?.close();
|
||||
function resetSponsorSubmissionNotice(callRef = true) {
|
||||
submissionNotice?.close(callRef);
|
||||
submissionNotice = null;
|
||||
}
|
||||
|
||||
@@ -2087,25 +2088,6 @@ function addCSS() {
|
||||
}
|
||||
}
|
||||
|
||||
function sendRequestToCustomServer(type, fullAddress, callback) {
|
||||
const xmlhttp = new XMLHttpRequest();
|
||||
|
||||
xmlhttp.open(type, fullAddress, true);
|
||||
|
||||
if (callback != undefined) {
|
||||
xmlhttp.onreadystatechange = function () {
|
||||
callback(xmlhttp, false);
|
||||
};
|
||||
|
||||
xmlhttp.onerror = function() {
|
||||
callback(xmlhttp, true);
|
||||
};
|
||||
}
|
||||
|
||||
//submit this request
|
||||
xmlhttp.send();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the isAdPlaying flag and hide preview bar/controls if ad is playing
|
||||
*/
|
||||
@@ -2119,14 +2101,15 @@ function updateAdFlag(): void {
|
||||
}
|
||||
|
||||
function showTimeWithoutSkips(skippedDuration: number): void {
|
||||
if (onMobileYouTube || onInvidious) return;
|
||||
if (onInvidious) return;
|
||||
|
||||
if (isNaN(skippedDuration) || skippedDuration < 0) {
|
||||
skippedDuration = 0;
|
||||
}
|
||||
|
||||
// YouTube player time display
|
||||
const display = document.querySelector(".ytp-time-display.notranslate");
|
||||
const displayClass = onMobileYouTube ? "ytm-time-display" : "ytp-time-display.notranslate"
|
||||
const display = document.querySelector(`.${displayClass}`);
|
||||
if (!display) return;
|
||||
|
||||
const durationID = "sponsorBlockDurationAfterSkips";
|
||||
@@ -2136,7 +2119,7 @@ function showTimeWithoutSkips(skippedDuration: number): void {
|
||||
if (duration === null) {
|
||||
duration = document.createElement('span');
|
||||
duration.id = durationID;
|
||||
duration.classList.add("ytp-time-duration");
|
||||
duration.classList.add(displayClass);
|
||||
|
||||
display.appendChild(duration);
|
||||
}
|
||||
@@ -2177,3 +2160,18 @@ function checkForPreloadedSegment() {
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
}
|
||||
}
|
||||
|
||||
// Register listener for URL change via Navigation API
|
||||
const navigationApiAvailable = "navigation" in window;
|
||||
if (navigationApiAvailable) {
|
||||
// TODO: Remove type cast once type declarations are updated
|
||||
(window as unknown as { navigation: EventTarget }).navigation.addEventListener("navigate", () => videoIDChange(getYouTubeVideoID(document)));
|
||||
}
|
||||
|
||||
// Record availability of Navigation API
|
||||
utils.wait(() => Config.local !== null).then(() => {
|
||||
if (Config.local.navigationApiAvailable !== navigationApiAvailable) {
|
||||
Config.local.navigationApiAvailable = navigationApiAvailable;
|
||||
Config.forceLocalUpdate("navigationApiAvailable");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
import Config from "./config";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
import { localizeHtmlPage } from "./utils/pageUtils";
|
||||
import { GenericUtils } from "./utils/genericUtils";
|
||||
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
localizeHtmlPage();
|
||||
|
||||
await utils.wait(() => Config.config !== null);
|
||||
await GenericUtils.wait(() => Config.config !== null);
|
||||
|
||||
if (!Config.config.darkMode) {
|
||||
document.documentElement.setAttribute("data-theme", "light");
|
||||
|
||||
@@ -144,8 +144,10 @@ class PreviewBar {
|
||||
this.parent = parent;
|
||||
|
||||
if (this.onMobileYouTube) {
|
||||
if (parent.classList.contains("progress-bar-background")) {
|
||||
parent.style.backgroundColor = "rgba(255, 255, 255, 0.3)";
|
||||
parent.style.opacity = "1";
|
||||
}
|
||||
|
||||
this.container.style.transform = "none";
|
||||
} else if (!this.onInvidious) {
|
||||
|
||||
@@ -2,10 +2,7 @@ import Config from "../config";
|
||||
import { SponsorTime } from "../types";
|
||||
import { getSkippingText } from "../utils/categoryUtils";
|
||||
import { keybindToString } from "../utils/configUtils";
|
||||
|
||||
import Utils from "../utils";
|
||||
import { AnimationUtils } from "../utils/animationUtils";
|
||||
const utils = new Utils();
|
||||
|
||||
export interface SkipButtonControlBarProps {
|
||||
skip: (segment: SponsorTime) => void;
|
||||
@@ -151,7 +148,7 @@ export class SkipButtonControlBar {
|
||||
}
|
||||
|
||||
disableText(): void {
|
||||
if (Config.config.hideVideoPlayerControls || Config.config.hideSkipButtonPlayerControls) {
|
||||
if (Config.config.hideSkipButtonPlayerControls) {
|
||||
this.disable();
|
||||
return;
|
||||
}
|
||||
@@ -172,10 +169,10 @@ export class SkipButtonControlBar {
|
||||
const overlay = document.getElementById("player-control-overlay");
|
||||
|
||||
if (overlay && this.enabled) {
|
||||
if (overlay?.classList?.contains("pointer-events-off")) {
|
||||
this.hideButton();
|
||||
} else {
|
||||
if (overlay?.classList?.contains("fadein")) {
|
||||
this.showButton();
|
||||
} else {
|
||||
this.hideButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -220,4 +217,3 @@ export class SkipButtonControlBar {
|
||||
this.container.style.left = this.left + "px";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,8 @@ interface DefaultMessage {
|
||||
| "getChannelID"
|
||||
| "isChannelWhitelisted"
|
||||
| "submitTimes"
|
||||
| "refreshSegments";
|
||||
| "refreshSegments"
|
||||
| "closePopup";
|
||||
}
|
||||
|
||||
interface BoolValueMessage {
|
||||
@@ -41,7 +42,24 @@ interface HideSegmentMessage {
|
||||
UUID: SegmentUUID;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage | SubmitVoteMessage | HideSegmentMessage);
|
||||
interface CopyToClipboardMessage {
|
||||
message: "copyToClipboard";
|
||||
text: string;
|
||||
}
|
||||
|
||||
interface KeyDownMessage {
|
||||
message: "keydown";
|
||||
key: string;
|
||||
keyCode: number;
|
||||
code: string;
|
||||
which: number;
|
||||
shiftKey: boolean;
|
||||
ctrlKey: boolean;
|
||||
altKey: boolean;
|
||||
metaKey: boolean;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage | SubmitVoteMessage | HideSegmentMessage | CopyToClipboardMessage | KeyDownMessage);
|
||||
|
||||
export interface IsInfoFoundMessageResponse {
|
||||
found: boolean;
|
||||
|
||||
@@ -12,13 +12,14 @@ import Utils from "./utils";
|
||||
import CategoryChooser from "./render/CategoryChooser";
|
||||
import KeybindComponent from "./components/KeybindComponent";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
import { localizeHtmlPage } from "./utils/pageUtils";
|
||||
const utils = new Utils();
|
||||
let embed = false;
|
||||
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
localizeHtmlPage();
|
||||
|
||||
// selected tab
|
||||
if (location.hash != "") {
|
||||
@@ -232,12 +233,22 @@ async function init() {
|
||||
}
|
||||
case "button-press": {
|
||||
const actionButton = optionsElements[i].querySelector(".trigger-button");
|
||||
const confirmMessage = optionsElements[i].getAttribute("data-confirm-message");
|
||||
|
||||
actionButton.addEventListener("click", () => {
|
||||
if (confirmMessage !== null && !confirm(chrome.i18n.getMessage(confirmMessage))) {
|
||||
return;
|
||||
}
|
||||
switch (optionsElements[i].getAttribute("data-sync")) {
|
||||
case "copyDebugInformation":
|
||||
actionButton.addEventListener("click", copyDebugOutputToClipboard);
|
||||
copyDebugOutputToClipboard();
|
||||
break;
|
||||
case "resetToDefault":
|
||||
Config.resetToDefault();
|
||||
window.location.reload();
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Config from "./config";
|
||||
import Utils from "./utils";
|
||||
import { localizeHtmlPage } from "./utils/pageUtils";
|
||||
const utils = new Utils();
|
||||
|
||||
// This is needed, if Config is not imported before Utils, things break.
|
||||
@@ -9,7 +10,7 @@ Config.config;
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
localizeHtmlPage();
|
||||
|
||||
const domains = document.location.hash.replace("#", "").split(",");
|
||||
|
||||
|
||||
181
src/popup.ts
@@ -6,6 +6,7 @@ import { Message, MessageResponse, IsInfoFoundMessageResponse } from "./messageT
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
import { AnimationUtils } from "./utils/animationUtils";
|
||||
import { GenericUtils } from "./utils/genericUtils";
|
||||
import { localizeHtmlPage } from "./utils/pageUtils";
|
||||
const utils = new Utils();
|
||||
|
||||
interface MessageListener {
|
||||
@@ -22,13 +23,15 @@ class MessageHandler {
|
||||
sendMessage(id: number, request: Message, callback?) {
|
||||
if (this.messageListener) {
|
||||
this.messageListener(request, null, callback);
|
||||
} else {
|
||||
} else if (chrome.tabs) {
|
||||
chrome.tabs.sendMessage(id, request, callback);
|
||||
} else {
|
||||
chrome.runtime.sendMessage({ message: "tabs", data: request }, callback);
|
||||
}
|
||||
}
|
||||
|
||||
query(config, callback) {
|
||||
if (this.messageListener) {
|
||||
if (this.messageListener || !chrome.tabs) {
|
||||
// Send back dummy info
|
||||
callback([{
|
||||
url: document.URL,
|
||||
@@ -41,15 +44,17 @@ class MessageHandler {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// To prevent clickjacking
|
||||
let allowPopup = window === window.top;
|
||||
window.addEventListener("message", async (e) => {
|
||||
if (e.source !== window.parent) return;
|
||||
if (e.origin.endsWith('.youtube.com')) return allowPopup = true;
|
||||
});
|
||||
|
||||
//make this a function to allow this to run on the content page
|
||||
async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
const messageHandler = new MessageHandler(messageListener);
|
||||
|
||||
utils.localizeHtmlPage();
|
||||
|
||||
await utils.wait(() => Config.config !== null);
|
||||
localizeHtmlPage();
|
||||
|
||||
type InputPageElements = {
|
||||
whitelistToggle?: HTMLInputElement,
|
||||
@@ -58,6 +63,15 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
};
|
||||
type PageElements = { [key: string]: HTMLElement } & InputPageElements
|
||||
|
||||
/** If true, the content script is in the process of creating a new segment. */
|
||||
let creatingSegment = false;
|
||||
|
||||
//the start and end time pairs (2d)
|
||||
let sponsorTimes: SponsorTime[] = [];
|
||||
|
||||
//current video ID of this tab
|
||||
let currentVideoID = null;
|
||||
|
||||
const PageElements: PageElements = {};
|
||||
|
||||
[
|
||||
@@ -92,7 +106,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
// Username
|
||||
"setUsernameContainer",
|
||||
"setUsernameButton",
|
||||
"setUsernameStatusContainer",
|
||||
"setUsernameStatus",
|
||||
"setUsernameStatus",
|
||||
"setUsername",
|
||||
"usernameInput",
|
||||
@@ -100,7 +114,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
"submitUsername",
|
||||
"sbPopupIconCopyUserID",
|
||||
// More
|
||||
"submissionSection",
|
||||
"submissionHint",
|
||||
"mainControls",
|
||||
"loadingIndicator",
|
||||
"videoFound",
|
||||
@@ -111,15 +125,38 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
"sbDonate",
|
||||
"sponsorTimesDonateContainer",
|
||||
"sbConsiderDonateLink",
|
||||
"sbCloseDonate"
|
||||
"sbCloseDonate",
|
||||
"sbBetaServerWarning",
|
||||
"sbCloseButton"
|
||||
].forEach(id => PageElements[id] = document.getElementById(id));
|
||||
|
||||
getSegmentsFromContentScript(false);
|
||||
await utils.wait(() => Config.config !== null && allowPopup, 5000, 5);
|
||||
document.querySelector("body").style.removeProperty("visibility");
|
||||
|
||||
PageElements.sbCloseButton.addEventListener("click", () => {
|
||||
sendTabMessage({
|
||||
message: "closePopup"
|
||||
});
|
||||
});
|
||||
|
||||
if (window !== window.top) {
|
||||
PageElements.sbCloseButton.classList.remove("hidden");
|
||||
}
|
||||
|
||||
// Hide donate button if wanted (Safari, or user choice)
|
||||
if (!showDonationLink()) {
|
||||
PageElements.sbDonate.style.display = "none";
|
||||
}
|
||||
PageElements.sbDonate.addEventListener("click", () => Config.config.donateClicked = Config.config.donateClicked + 1);
|
||||
|
||||
if (Config.config.testingServer) {
|
||||
PageElements.sbBetaServerWarning.classList.remove("hidden");
|
||||
PageElements.sbBetaServerWarning.addEventListener("click", function () {
|
||||
openOptionsAt("advanced");
|
||||
});
|
||||
}
|
||||
|
||||
//setup click listeners
|
||||
PageElements.sponsorStart.addEventListener("click", sendSponsorStartMessage);
|
||||
PageElements.whitelistToggle.addEventListener("change", function () {
|
||||
@@ -141,16 +178,37 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.optionsButton.addEventListener("click", openOptions);
|
||||
PageElements.helpButton.addEventListener("click", openHelp);
|
||||
PageElements.refreshSegmentsButton.addEventListener("click", refreshSegments);
|
||||
PageElements.sbPopupIconCopyUserID.addEventListener("click", async () => navigator.clipboard.writeText(await utils.getHash(Config.config.userID)));
|
||||
PageElements.sbPopupIconCopyUserID.addEventListener("click", async () => copyToClipboard(await utils.getHash(Config.config.userID)));
|
||||
|
||||
/** If true, the content script is in the process of creating a new segment. */
|
||||
let creatingSegment = false;
|
||||
// Forward click events
|
||||
if (window !== window.top) {
|
||||
document.addEventListener("keydown", (e) => {
|
||||
const target = e.target as HTMLElement;
|
||||
if (target.tagName === "INPUT"
|
||||
|| target.tagName === "TEXTAREA"
|
||||
|| e.key === "ArrowUp"
|
||||
|| e.key === "ArrowDown") {
|
||||
return;
|
||||
}
|
||||
|
||||
//the start and end time pairs (2d)
|
||||
let sponsorTimes: SponsorTime[] = [];
|
||||
if (e.key === " ") {
|
||||
// No scrolling
|
||||
e.preventDefault();
|
||||
}
|
||||
|
||||
//current video ID of this tab
|
||||
let currentVideoID = null;
|
||||
sendTabMessage({
|
||||
message: "keydown",
|
||||
key: e.key,
|
||||
keyCode: e.keyCode,
|
||||
code: e.code,
|
||||
which: e.which,
|
||||
shiftKey: e.shiftKey,
|
||||
ctrlKey: e.ctrlKey,
|
||||
altKey: e.altKey,
|
||||
metaKey: e.metaKey
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
//show proper disable skipping button
|
||||
const disableSkipping = Config.config.disableSkipping;
|
||||
@@ -167,7 +225,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.showNoticeAgain.style.display = "unset";
|
||||
}
|
||||
|
||||
utils.sendRequestToServer("GET", "/api/userInfo?value=userName&value=viewCount&value=minutesSaved&userID=" + Config.config.userID, (res) => {
|
||||
utils.sendRequestToServer("GET", "/api/userInfo?value=userName&value=viewCount&value=minutesSaved&value=vip&userID=" + Config.config.userID, (res) => {
|
||||
if (res.status === 200) {
|
||||
const userInfo = JSON.parse(res.responseText);
|
||||
PageElements.usernameValue.innerText = userInfo.userName;
|
||||
@@ -194,6 +252,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}
|
||||
PageElements.sponsorTimesOthersTimeSavedDisplay.innerText = getFormattedHours(minutesSaved);
|
||||
}
|
||||
|
||||
Config.config.isVip = userInfo.vip;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -229,8 +289,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
// Must be delayed so it only happens once loaded
|
||||
setTimeout(() => PageElements.sponsorblockPopup.classList.remove("preload"), 250);
|
||||
|
||||
getSegmentsFromContentScript(false);
|
||||
|
||||
function showDonateWidget(viewCount: number) {
|
||||
if (Config.config.showDonationLink && Config.config.donateClicked <= 0 && Config.config.showPopupDonationCount < 5
|
||||
&& viewCount < 50000 && !Config.config.isVip && Config.config.skipCount > 10) {
|
||||
@@ -262,13 +320,14 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
});
|
||||
}
|
||||
|
||||
function loadTabData(tabs, updating: boolean): void {
|
||||
async function loadTabData(tabs, updating: boolean): Promise<void> {
|
||||
if (!currentVideoID) {
|
||||
//this isn't a YouTube video then
|
||||
displayNoVideo();
|
||||
return;
|
||||
}
|
||||
|
||||
await utils.wait(() => Config.config !== null, 5000, 10);
|
||||
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] ?? [];
|
||||
updateSegmentEditingUI();
|
||||
|
||||
@@ -296,7 +355,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//if request is undefined, then the page currently being browsed is not YouTube
|
||||
if (request != undefined) {
|
||||
//remove loading text
|
||||
PageElements.mainControls.style.display = "flex";
|
||||
PageElements.mainControls.style.display = "block";
|
||||
if (request.onMobileYouTube) PageElements.mainControls.classList.add("hidden");
|
||||
PageElements.whitelistButton.classList.remove("hidden");
|
||||
PageElements.loadingIndicator.style.display = "none";
|
||||
@@ -426,8 +485,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
segmentTimeFromToNode.style.margin = "5px";
|
||||
|
||||
segmentSummary.appendChild(categoryColorCircle);
|
||||
segmentSummary.appendChild(textNode);
|
||||
// for inline-styling purposes
|
||||
const labelContainer = document.createElement("div");
|
||||
labelContainer.appendChild(categoryColorCircle);
|
||||
|
||||
const span = document.createElement('span');
|
||||
span.className = "summaryLabel";
|
||||
span.appendChild(textNode);
|
||||
labelContainer.appendChild(span);
|
||||
// for inline-styling purposes
|
||||
|
||||
segmentSummary.appendChild(labelContainer);
|
||||
segmentSummary.appendChild(segmentTimeFromToNode);
|
||||
|
||||
const votingButtons = document.createElement("details");
|
||||
@@ -436,17 +504,19 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//thumbs up and down buttons
|
||||
const voteButtonsContainer = document.createElement("div");
|
||||
voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID;
|
||||
voteButtonsContainer.setAttribute("align", "center");
|
||||
voteButtonsContainer.classList.add("sbVoteButtonsContainer");
|
||||
|
||||
const upvoteButton = document.createElement("img");
|
||||
upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID;
|
||||
upvoteButton.className = "voteButton";
|
||||
upvoteButton.title = chrome.i18n.getMessage("upvote");
|
||||
upvoteButton.src = chrome.runtime.getURL("icons/thumbs_up.svg");
|
||||
upvoteButton.addEventListener("click", () => vote(1, UUID));
|
||||
|
||||
const downvoteButton = document.createElement("img");
|
||||
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
|
||||
downvoteButton.className = "voteButton";
|
||||
downvoteButton.title = chrome.i18n.getMessage("downvote");
|
||||
downvoteButton.src = locked && isVip ? chrome.runtime.getURL("icons/thumbs_down_locked.svg") : chrome.runtime.getURL("icons/thumbs_down.svg");
|
||||
downvoteButton.addEventListener("click", () => vote(0, UUID));
|
||||
|
||||
@@ -454,8 +524,9 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
uuidButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
|
||||
uuidButton.className = "voteButton";
|
||||
uuidButton.src = chrome.runtime.getURL("icons/clipboard.svg");
|
||||
uuidButton.title = chrome.i18n.getMessage("copySegmentID");
|
||||
uuidButton.addEventListener("click", () => {
|
||||
navigator.clipboard.writeText(UUID);
|
||||
copyToClipboard(UUID);
|
||||
const stopAnimation = AnimationUtils.applyLoadingAnimation(uuidButton, 0.3);
|
||||
stopAnimation();
|
||||
});
|
||||
@@ -463,6 +534,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
const hideButton = document.createElement("img");
|
||||
hideButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
|
||||
hideButton.className = "voteButton";
|
||||
hideButton.title = chrome.i18n.getMessage("hideSegment");
|
||||
if (segmentTimes[i].hidden === SponsorHideType.Hidden) {
|
||||
hideButton.src = chrome.runtime.getURL("icons/not_visible.svg");
|
||||
} else {
|
||||
@@ -548,7 +620,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
function updateSegmentEditingUI() {
|
||||
PageElements.sponsorStart.innerText = chrome.i18n.getMessage(creatingSegment ? "sponsorEnd" : "sponsorStart");
|
||||
|
||||
PageElements.submissionSection.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
||||
PageElements.submitTimes.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
||||
PageElements.submissionHint.style.display = sponsorTimes && sponsorTimes.length > 0 ? "unset" : "none";
|
||||
}
|
||||
|
||||
//make the options div visible
|
||||
@@ -564,6 +637,22 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
chrome.runtime.sendMessage({ "message": "openHelp" });
|
||||
}
|
||||
|
||||
function sendTabMessage(data: Message): Promise<unknown> {
|
||||
return new Promise((resolve) => {
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
data,
|
||||
(response) => resolve(response)
|
||||
);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
//make the options username setting option visible
|
||||
function setUsernameButton() {
|
||||
PageElements.usernameInput.value = PageElements.usernameValue.innerText;
|
||||
@@ -575,7 +664,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.setUsername.style.display = "flex";
|
||||
PageElements.setUsername.classList.add("SBExpanded");
|
||||
|
||||
PageElements.setUsernameStatusContainer.style.display = "none";
|
||||
PageElements.setUsernameStatus.style.display = "none";
|
||||
|
||||
PageElements.sponsorTimesContributionsContainer.classList.add("hidden");
|
||||
}
|
||||
@@ -583,7 +672,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//submit the new username
|
||||
function submitUsername() {
|
||||
//add loading indicator
|
||||
PageElements.setUsernameStatusContainer.style.display = "unset";
|
||||
PageElements.setUsernameStatus.style.display = "unset";
|
||||
PageElements.setUsernameStatus.innerText = chrome.i18n.getMessage("Loading");
|
||||
|
||||
utils.sendRequestToServer("POST", "/api/setUsername?userID=" + Config.config.userID + "&username=" + PageElements.usernameInput.value, function (response) {
|
||||
@@ -596,7 +685,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.setUsername.classList.remove("SBExpanded");
|
||||
PageElements.usernameValue.innerText = PageElements.usernameInput.value;
|
||||
|
||||
PageElements.setUsernameStatusContainer.style.display = "none";
|
||||
PageElements.setUsernameStatus.style.display = "none";
|
||||
|
||||
PageElements.sponsorTimesContributionsContainer.classList.remove("hidden");
|
||||
} else {
|
||||
@@ -625,6 +714,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
thanksForVotingText.innerText = message;
|
||||
}
|
||||
|
||||
function removeVoteMessage(UUID) {
|
||||
const voteButtonsContainer = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID);
|
||||
voteButtonsContainer.style.display = "block";
|
||||
|
||||
const voteStatusContainer = document.getElementById("sponsorTimesVoteStatusContainer" + UUID);
|
||||
voteStatusContainer.style.display = "none";
|
||||
|
||||
const thanksForVotingText = document.getElementById("sponsorTimesThanksForVotingText" + UUID);
|
||||
thanksForVotingText.removeAttribute("innerText");
|
||||
}
|
||||
|
||||
function vote(type, UUID) {
|
||||
//add loading info
|
||||
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
|
||||
@@ -648,6 +748,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
} else if (response.successType == -1) {
|
||||
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
|
||||
}
|
||||
setTimeout(() => removeVoteMessage(UUID), 1500);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -683,6 +784,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.unwhitelistChannel.style.display = "unset";
|
||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.add("rotated");
|
||||
|
||||
//show 'consider force channel check' alert
|
||||
if (!Config.config.forceChannelCheck) PageElements.whitelistForceCheck.classList.remove("hidden");
|
||||
|
||||
//save this
|
||||
@@ -730,6 +832,9 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.unwhitelistChannel.style.display = "none";
|
||||
document.querySelectorAll('.SBWhitelistIcon')[0].classList.remove("rotated");
|
||||
|
||||
//hide 'consider force channel check' alert
|
||||
PageElements.whitelistForceCheck.classList.add("hidden");
|
||||
|
||||
//save this
|
||||
Config.config.whitelistedChannels = whitelistedChannels;
|
||||
|
||||
@@ -787,6 +892,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
hiddenButton.style.display = "none";
|
||||
}
|
||||
|
||||
function copyToClipboard(text: string): void {
|
||||
if (window === window.top) {
|
||||
window.navigator.clipboard.writeText(text);
|
||||
} else {
|
||||
sendTabMessage({
|
||||
message: "copyToClipboard",
|
||||
text
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts time in minutes to 2d 5h 25.1
|
||||
* If less than 1 hour, just returns minutes
|
||||
@@ -804,9 +920,4 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//end of function
|
||||
}
|
||||
|
||||
if (chrome.tabs != undefined) {
|
||||
//this means it is actually opened in the popup
|
||||
runThePopup();
|
||||
}
|
||||
|
||||
export default runThePopup;
|
||||
|
||||
@@ -13,12 +13,19 @@ export interface ButtonListener {
|
||||
listener: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void
|
||||
}
|
||||
|
||||
export interface TextBox {
|
||||
icon: string,
|
||||
text: string
|
||||
}
|
||||
|
||||
export interface NoticeOptions {
|
||||
title: string,
|
||||
textBoxes?: string[],
|
||||
textBoxes?: TextBox[],
|
||||
buttons?: ButtonListener[],
|
||||
fadeIn?: boolean,
|
||||
timed?: boolean
|
||||
style?: React.CSSProperties;
|
||||
extraClass?: string;
|
||||
}
|
||||
|
||||
export default class GenericNotice {
|
||||
@@ -27,9 +34,11 @@ export default class GenericNotice {
|
||||
|
||||
noticeElement: HTMLDivElement;
|
||||
noticeRef: React.MutableRefObject<NoticeComponent>;
|
||||
idSuffix: string;
|
||||
|
||||
constructor(contentContainer: ContentContainer, idSuffix: string, options: NoticeOptions) {
|
||||
this.noticeRef = React.createRef();
|
||||
this.idSuffix = idSuffix;
|
||||
|
||||
this.contentContainer = contentContainer;
|
||||
|
||||
@@ -40,39 +49,47 @@ export default class GenericNotice {
|
||||
|
||||
referenceNode.prepend(this.noticeElement);
|
||||
|
||||
this.update(options);
|
||||
}
|
||||
|
||||
update(options: NoticeOptions): void {
|
||||
ReactDOM.render(
|
||||
<NoticeComponent
|
||||
noticeTitle={options.title}
|
||||
idSuffix={idSuffix}
|
||||
idSuffix={this.idSuffix}
|
||||
fadeIn={options.fadeIn ?? true}
|
||||
timed={options.timed ?? true}
|
||||
ref={this.noticeRef}
|
||||
style={options.style}
|
||||
extraClass={options.extraClass}
|
||||
closeListener={() => this.close()} >
|
||||
|
||||
{this.getMessageBox(idSuffix, options.textBoxes)}
|
||||
{this.getMessageBox(this.idSuffix, options.textBoxes)}
|
||||
|
||||
<tr id={"sponsorSkipNoticeSpacer" + idSuffix}
|
||||
<tr id={"sponsorSkipNoticeSpacer" + this.idSuffix}
|
||||
className="sponsorBlockSpacer">
|
||||
</tr>
|
||||
|
||||
<div className="sponsorSkipNoticeRightSection"
|
||||
<tr className="sponsorSkipNoticeRightSection"
|
||||
style={{position: "relative"}}>
|
||||
|
||||
<td>
|
||||
{this.getButtons(options.buttons)}
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</NoticeComponent>,
|
||||
this.noticeElement
|
||||
);
|
||||
}
|
||||
|
||||
getMessageBox(idSuffix: string, textBoxes: string[]): JSX.Element[] {
|
||||
getMessageBox(idSuffix: string, textBoxes: TextBox[]): JSX.Element[] {
|
||||
if (textBoxes) {
|
||||
const result = [];
|
||||
for (let i = 0; i < textBoxes.length; i++) {
|
||||
result.push(
|
||||
<NoticeTextSelectionComponent idSuffix={idSuffix}
|
||||
key={i}
|
||||
text={textBoxes[i]} />
|
||||
icon={textBoxes[i].icon}
|
||||
text={textBoxes[i].text} />
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ class SkipNotice {
|
||||
|
||||
skipNoticeRef: React.MutableRefObject<SkipNoticeComponent>;
|
||||
|
||||
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer, unskipTime: number = null) {
|
||||
constructor(segments: SponsorTime[], autoSkip = false, contentContainer: ContentContainer, unskipTime: number = null, startReskip = false) {
|
||||
this.skipNoticeRef = React.createRef();
|
||||
|
||||
this.segments = segments;
|
||||
@@ -44,6 +44,7 @@ class SkipNotice {
|
||||
ReactDOM.render(
|
||||
<SkipNoticeComponent segments={segments}
|
||||
autoSkip={autoSkip}
|
||||
startReskip={startReskip}
|
||||
contentContainer={contentContainer}
|
||||
ref={this.skipNoticeRef}
|
||||
closeListener={() => this.close()}
|
||||
@@ -70,11 +71,11 @@ class SkipNotice {
|
||||
}
|
||||
|
||||
toggleSkip(): void {
|
||||
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip);
|
||||
this.skipNoticeRef?.current?.prepAction(SkipNoticeAction.Unskip0);
|
||||
}
|
||||
|
||||
unmutedListener(): void {
|
||||
this.skipNoticeRef?.current?.unmutedListener();
|
||||
unmutedListener(time: number): void {
|
||||
this.skipNoticeRef?.current?.unmutedListener(time);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ class SubmissionNotice {
|
||||
contentContainer={contentContainer}
|
||||
callback={callback}
|
||||
ref={this.noticeRef}
|
||||
closeListener={() => this.close()} />,
|
||||
closeListener={() => this.close(false)} />,
|
||||
this.noticeElement
|
||||
);
|
||||
}
|
||||
@@ -44,7 +44,8 @@ class SubmissionNotice {
|
||||
this.noticeRef.current.forceUpdate();
|
||||
}
|
||||
|
||||
close(): void {
|
||||
close(callRef = true): void {
|
||||
if (callRef) this.noticeRef.current.cancel();
|
||||
ReactDOM.unmountComponentAtNode(this.noticeElement);
|
||||
|
||||
this.noticeElement.remove();
|
||||
|
||||
@@ -6,17 +6,17 @@ export interface ContentContainer {
|
||||
(): {
|
||||
vote: (type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent) => void,
|
||||
dontShowNoticeAgain: () => void,
|
||||
unskipSponsorTime: (segment: SponsorTime, unskipTime: number) => void,
|
||||
unskipSponsorTime: (segment: SponsorTime, unskipTime: number, forceSeek?: boolean) => void,
|
||||
sponsorTimes: SponsorTime[],
|
||||
sponsorTimesSubmitting: SponsorTime[],
|
||||
skipNotices: SkipNotice[],
|
||||
v: HTMLVideoElement,
|
||||
sponsorVideoID,
|
||||
reskipSponsorTime: (segment: SponsorTime) => void,
|
||||
reskipSponsorTime: (segment: SponsorTime, forceSeek?: boolean) => void,
|
||||
updatePreviewBar: () => void,
|
||||
onMobileYouTube: boolean,
|
||||
sponsorSubmissionNotice: SubmissionNotice,
|
||||
resetSponsorSubmissionNotice: () => void,
|
||||
resetSponsorSubmissionNotice: (callRef?: boolean) => void,
|
||||
updateEditButtonsOnPlayer: () => void,
|
||||
previewTime: (time: number, unpause?: boolean) => void,
|
||||
videoInfo: VideoInfo,
|
||||
|
||||
25
src/utils.ts
@@ -256,31 +256,6 @@ export default class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
localizeHtmlPage(): void {
|
||||
//Localize by replacing __MSG_***__ meta tags
|
||||
const localizedMessage = this.getLocalizedMessage(document.title);
|
||||
if (localizedMessage) document.title = localizedMessage;
|
||||
const objects = document.getElementsByClassName("sponsorBlockPageBody")[0].children;
|
||||
for (let j = 0; j < objects.length; j++) {
|
||||
const obj = objects[j];
|
||||
const localizedMessage = this.getLocalizedMessage(obj.innerHTML.toString());
|
||||
if (localizedMessage) obj.innerHTML = localizedMessage;
|
||||
}
|
||||
}
|
||||
|
||||
getLocalizedMessage(text: string): string | false {
|
||||
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
|
||||
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "<")
|
||||
.replace(/"/g, """).replace(/\n/g, "<br/>") : "";
|
||||
});
|
||||
|
||||
if(valNewH != text) {
|
||||
return valNewH;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {String[]} Domains in regex form
|
||||
*/
|
||||
|
||||
141
src/utils/constants.ts
Normal file
@@ -0,0 +1,141 @@
|
||||
import { TextBox } from "../render/GenericNotice";
|
||||
import { Category } from "../types";
|
||||
|
||||
export function getGuidelineInfo(category: Category): TextBox[] {
|
||||
switch (category) {
|
||||
case "sponsor":
|
||||
return [{
|
||||
icon: "icons/money.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "selfpromo":
|
||||
return [{
|
||||
icon: "icons/money.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/campaign.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "exclusive_access":
|
||||
return [{
|
||||
icon: "icons/money.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}];
|
||||
case "interaction":
|
||||
return [{
|
||||
icon: "icons/lightbulb.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/lightbulb.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "intro":
|
||||
return [{
|
||||
icon: "icons/check-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "outro":
|
||||
return [{
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "preview":
|
||||
return [{
|
||||
icon: "icons/check-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/check-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "filler":
|
||||
return [{
|
||||
icon: "icons/stopwatch.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/stopwatch.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/close-smaller.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
|
||||
}, {
|
||||
icon: "icons/segway.png",
|
||||
text: chrome.i18n.getMessage(`generic_guideline1`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "music_offtopic":
|
||||
return [{
|
||||
icon: "icons/music-note.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/music-note.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/right-arrow.svg",
|
||||
text: chrome.i18n.getMessage(`generic_guideline2`)
|
||||
}];
|
||||
case "poi_highlight":
|
||||
return [{
|
||||
icon: "icons/star.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline1`)
|
||||
}, {
|
||||
icon: "icons/bolt.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline2`)
|
||||
}, {
|
||||
icon: "icons/bolt.svg",
|
||||
text: chrome.i18n.getMessage(`category_${category}_guideline3`)
|
||||
}];
|
||||
}
|
||||
}
|
||||
12
src/utils/logger.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
window["SBLogs"] = {
|
||||
debug: [],
|
||||
warn: []
|
||||
};
|
||||
|
||||
export function logDebug(message: string) {
|
||||
window["SBLogs"].debug.push(`[${new Date().toISOString()}] ${message}`);
|
||||
}
|
||||
|
||||
export function logWarn(message: string) {
|
||||
window["SBLogs"].warn.push(`[${new Date().toISOString()}] ${message}`);
|
||||
}
|
||||
@@ -7,7 +7,8 @@ export enum SkipNoticeAction {
|
||||
Downvote,
|
||||
CategoryVote,
|
||||
CopyDownvote,
|
||||
Unskip
|
||||
Unskip0,
|
||||
Unskip1
|
||||
}
|
||||
|
||||
export function downvoteButtonColor(segments: SponsorTime[], actionState: SkipNoticeAction, downvoteType: SkipNoticeAction): string {
|
||||
|
||||
@@ -62,3 +62,26 @@ export function getHashParams(): Record<string, unknown> {
|
||||
|
||||
return {};
|
||||
}
|
||||
|
||||
export function localizeHtmlPage(): void {
|
||||
//Localize by replacing __MSG_***__ meta tags
|
||||
const localizedTitle = getLocalizedMessage(document.title);
|
||||
if (localizedTitle) document.title = localizedTitle;
|
||||
|
||||
const body = document.querySelector(".sponsorBlockPageBody");
|
||||
const localizedMessage = getLocalizedMessage(body.innerHTML.toString());
|
||||
if (localizedMessage) body.innerHTML = localizedMessage;
|
||||
}
|
||||
|
||||
export function getLocalizedMessage(text: string): string | false {
|
||||
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
|
||||
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "<")
|
||||
.replace(/"/g, """).replace(/\n/g, "<br/>") : "";
|
||||
});
|
||||
|
||||
if (valNewH != text) {
|
||||
return valNewH;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
import { Builder, By, until, WebDriver } from "selenium-webdriver";
|
||||
import { Builder, By, until, WebDriver, WebElement } from "selenium-webdriver";
|
||||
import * as Chrome from "selenium-webdriver/chrome";
|
||||
import * as Path from "path";
|
||||
|
||||
import * as fs from "fs";
|
||||
|
||||
test("Selenium Chrome test", async () => {
|
||||
let driver;
|
||||
let driver: WebDriver;
|
||||
try {
|
||||
driver = await setup();
|
||||
} catch (e) {
|
||||
@@ -27,6 +29,22 @@ test("Selenium Chrome test", async () => {
|
||||
await setSegmentActionType(driver, 0, 1, false);
|
||||
await editSegments(driver, 0, "0:05.000", "0:13.211", "5", "7.5", "0:05.000 to 0:07.500", false);
|
||||
await muteSkipSegment(driver, 5, 7.5);
|
||||
|
||||
// Full video
|
||||
await setSegmentActionType(driver, 0, 2, false);
|
||||
await driver.wait(until.elementIsNotVisible(await getDisplayTimeBox(driver, 0)));
|
||||
|
||||
await toggleWhitelist(driver);
|
||||
await toggleWhitelist(driver);
|
||||
|
||||
} catch (e) {
|
||||
// Save file incase there is a layout change
|
||||
const source = await driver.getPageSource();
|
||||
|
||||
fs.mkdirSync("./test-results");
|
||||
fs.writeFileSync("./test-results/source.html", source);
|
||||
|
||||
throw e;
|
||||
} finally {
|
||||
await driver.quit();
|
||||
}
|
||||
@@ -37,6 +55,8 @@ async function setup(): Promise<WebDriver> {
|
||||
options.addArguments("--load-extension=" + Path.join(__dirname, "../dist/"));
|
||||
options.addArguments("--mute-audio");
|
||||
options.addArguments("--disable-features=PreloadMediaEngagementData, MediaEngagementBypassAutoplayPolicies");
|
||||
options.addArguments("--headless=chrome");
|
||||
options.addArguments("--window-size=1920,1080");
|
||||
|
||||
const driver = await new Builder().forBrowser("chrome").setChromeOptions(options).build();
|
||||
driver.manage().setTimeouts({
|
||||
@@ -57,7 +77,7 @@ async function waitForInstall(driver: WebDriver, startingTab = 0): Promise<void>
|
||||
|
||||
async function goToVideo(driver: WebDriver, videoId: string): Promise<void> {
|
||||
await driver.get("https://www.youtube.com/watch?v=" + videoId);
|
||||
await driver.wait(until.elementIsVisible(await driver.findElement(By.className("ytd-video-primary-info-renderer"))));
|
||||
await driver.wait(until.elementIsVisible(await driver.findElement(By.css(".ytd-video-primary-info-renderer, #above-the-fold"))));
|
||||
}
|
||||
|
||||
async function createSegment(driver: WebDriver, startTime: string, endTime: string, expectedDisplayedTime: string): Promise<void> {
|
||||
@@ -90,8 +110,7 @@ async function editSegments(driver: WebDriver, index: number, expectedStartTimeB
|
||||
}
|
||||
|
||||
let editButton = await driver.findElement(By.id("sponsorTimeEditButtonSubmissionNotice" + index));
|
||||
let sponsorTimeDisplays = await driver.findElements(By.className("sponsorTimeDisplay"));
|
||||
let sponsorTimeDisplay = sponsorTimeDisplays[index];
|
||||
const sponsorTimeDisplay = await getDisplayTimeBox(driver, index);
|
||||
await sponsorTimeDisplay.click();
|
||||
// Ensure edit time appears
|
||||
await driver.findElement(By.id("submittingTime0SubmissionNotice" + index));
|
||||
@@ -100,22 +119,39 @@ async function editSegments(driver: WebDriver, index: number, expectedStartTimeB
|
||||
await editButton.click();
|
||||
await editButton.click();
|
||||
|
||||
const startTimeBox = await driver.findElement(By.id("submittingTime0SubmissionNotice" + index));
|
||||
expect((await startTimeBox.getAttribute("value"))).toBe(expectedStartTimeBox);
|
||||
const startTimeBox = await getStartTimeBox(driver, index, expectedStartTimeBox);
|
||||
await startTimeBox.clear();
|
||||
await startTimeBox.sendKeys(startTime);
|
||||
|
||||
const endTimeBox = await driver.findElement(By.id("submittingTime1SubmissionNotice" + index));
|
||||
expect((await endTimeBox.getAttribute("value"))).toBe(expectedEndTimeBox);
|
||||
const endTimeBox = await getEndTimeBox(driver, index, expectedEndTimeBox);
|
||||
await endTimeBox.clear();
|
||||
await endTimeBox.sendKeys(endTime);
|
||||
|
||||
editButton = await driver.findElement(By.id("sponsorTimeEditButtonSubmissionNotice" + index));
|
||||
await editButton.click();
|
||||
|
||||
sponsorTimeDisplays = await driver.findElements(By.className("sponsorTimeDisplay"));
|
||||
sponsorTimeDisplay = sponsorTimeDisplays[index];
|
||||
await driver.wait(until.elementTextIs(sponsorTimeDisplay, expectedDisplayedTime));
|
||||
await getDisplayTimeBox(driver, index, expectedDisplayedTime);
|
||||
}
|
||||
|
||||
async function getStartTimeBox(driver: WebDriver, index: number, expectedStartTimeBox: string): Promise<WebElement> {
|
||||
const startTimeBox = await driver.findElement(By.id("submittingTime0SubmissionNotice" + index));
|
||||
expect((await startTimeBox.getAttribute("value"))).toBe(expectedStartTimeBox);
|
||||
return startTimeBox;
|
||||
}
|
||||
|
||||
async function getEndTimeBox(driver: WebDriver, index: number, expectedEndTimeBox: string): Promise<WebElement> {
|
||||
const endTimeBox = await driver.findElement(By.id("submittingTime1SubmissionNotice" + index));
|
||||
expect((await endTimeBox.getAttribute("value"))).toBe(expectedEndTimeBox);
|
||||
return endTimeBox;
|
||||
}
|
||||
|
||||
async function getDisplayTimeBox(driver: WebDriver, index: number, expectedDisplayedTime?: string): Promise<WebElement> {
|
||||
const sponsorTimeDisplay = (await driver.findElements(By.className("sponsorTimeDisplay")))[index];
|
||||
if (expectedDisplayedTime) {
|
||||
driver.wait(until.elementTextIs(sponsorTimeDisplay, expectedDisplayedTime));
|
||||
}
|
||||
|
||||
return sponsorTimeDisplay;
|
||||
}
|
||||
|
||||
async function setSegmentCategory(driver: WebDriver, index: number, categoryIndex: number, openSubmitBox: boolean): Promise<void> {
|
||||
@@ -163,3 +199,30 @@ async function muteSkipSegment(driver: WebDriver, startTime: number, endTime: nu
|
||||
expect(await video.getAttribute("muted")).toBeNull(); // Default is null for some reason
|
||||
await driver.executeScript("document.querySelector('video').pause()");
|
||||
}
|
||||
|
||||
async function toggleWhitelist(driver: WebDriver): Promise<void> {
|
||||
const popupButton = await driver.findElement(By.id("infoButton"));
|
||||
if ((await popupButton.getCssValue("display")) !== "none") {
|
||||
await driver.actions().move({ origin: popupButton }).perform();
|
||||
await popupButton.click();
|
||||
}
|
||||
|
||||
const popupFrame = await driver.findElement(By.css("#sponsorBlockPopupContainer iframe"));
|
||||
await driver.switchTo().frame(popupFrame);
|
||||
|
||||
const whitelistButton = await driver.findElement(By.id("whitelistButton"));
|
||||
await driver.wait(until.elementIsVisible(whitelistButton));
|
||||
|
||||
const whitelistText = await driver.findElement(By.id("whitelistChannel"));
|
||||
const whitelistDisplayed = await whitelistText.isDisplayed();
|
||||
|
||||
await whitelistButton.click();
|
||||
if (whitelistDisplayed) {
|
||||
const unwhitelistText = await driver.findElement(By.id("unwhitelistChannel"));
|
||||
await driver.wait(until.elementIsVisible(unwhitelistText));
|
||||
} else {
|
||||
await driver.wait(until.elementIsVisible(whitelistText));
|
||||
}
|
||||
|
||||
await driver.switchTo().defaultContent();
|
||||
}
|
||||
@@ -1,11 +1,15 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
const webpack = require("webpack");
|
||||
const path = require('path');
|
||||
const CopyPlugin = require('copy-webpack-plugin');
|
||||
const BuildManifest = require('./webpack.manifest');
|
||||
const srcDir = '../src/';
|
||||
const fs = require("fs");
|
||||
import webpack from "webpack"
|
||||
import path from "path"
|
||||
import { fileURLToPath } from "url"
|
||||
import CopyPlugin from "copy-webpack-plugin"
|
||||
import BuildManifest from "./webpack.manifest.cjs";
|
||||
const srcDir = "../src/";
|
||||
import fs from "fs";
|
||||
import ForkTsCheckerWebpackPlugin from "fork-ts-checker-webpack-plugin";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url)
|
||||
const __dirname = path.dirname(__filename)
|
||||
|
||||
const edgeLanguages = [
|
||||
"de",
|
||||
@@ -23,7 +27,7 @@ const edgeLanguages = [
|
||||
"zh_CN"
|
||||
]
|
||||
|
||||
module.exports = env => ({
|
||||
export default env => ({
|
||||
entry: {
|
||||
popup: path.join(__dirname, srcDir + 'popup.ts'),
|
||||
background: path.join(__dirname, srcDir + 'background.ts'),
|
||||
@@ -45,8 +49,12 @@ module.exports = env => ({
|
||||
rules: [
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
use: 'ts-loader',
|
||||
exclude: /node_modules/
|
||||
loader: 'ts-loader',
|
||||
exclude: /node_modules/,
|
||||
options: {
|
||||
// disable type checker for user in fork plugin
|
||||
transpileOnly: true
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -54,6 +62,8 @@ module.exports = env => ({
|
||||
extensions: ['.ts', '.tsx', '.js']
|
||||
},
|
||||
plugins: [
|
||||
// fork TS checker
|
||||
new ForkTsCheckerWebpackPlugin(),
|
||||
// exclude locale files in moment
|
||||
new CopyPlugin({
|
||||
patterns: [
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const merge = require('webpack-merge');
|
||||
const common = require('./webpack.common.js');
|
||||
import { merge } from "webpack-merge";
|
||||
import common from './webpack.common.js';
|
||||
|
||||
module.exports = env => merge(common(env), {
|
||||
export default env => merge(common(env), {
|
||||
devtool: 'inline-source-map',
|
||||
mode: 'development'
|
||||
});
|
||||
@@ -1,8 +1,7 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const merge = require('webpack-merge');
|
||||
const common = require('./webpack.common.js');
|
||||
import { merge } from "webpack-merge";
|
||||
import common from './webpack.common.js';
|
||||
|
||||
module.exports = env => {
|
||||
export default env => {
|
||||
let mode = "production";
|
||||
env.mode = mode;
|
||||
|
||||
|
||||