mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-06 11:37:02 +03:00
Compare commits
130 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
84a234f9b6 | ||
|
|
fd5ab9f153 | ||
|
|
30fe40a523 | ||
|
|
6e23650a99 | ||
|
|
d6a0029b85 | ||
|
|
f25f986200 | ||
|
|
8843fb767e | ||
|
|
3a17299610 | ||
|
|
a2a5d27900 | ||
|
|
eb9e2d8726 | ||
|
|
ddc34bacc7 | ||
|
|
60b0a59ba1 | ||
|
|
c9903b5926 | ||
|
|
db7251cbfb | ||
|
|
fcf42560bf | ||
|
|
036b3967a9 | ||
|
|
e622ee725c | ||
|
|
5ace92dc8b | ||
|
|
bb490bf7ad | ||
|
|
4cc248eb17 | ||
|
|
2e8ce93c1d | ||
|
|
4fc9856e34 | ||
|
|
f92e3dbc9a | ||
|
|
7f75929d81 | ||
|
|
43699c1875 | ||
|
|
6128d37ac2 | ||
|
|
c64c5125fb | ||
|
|
cbb8d48820 | ||
|
|
008079c74c | ||
|
|
e65642237f | ||
|
|
84d4c9da4c | ||
|
|
e623af859f | ||
|
|
8c60f25d4a | ||
|
|
7896b474db | ||
|
|
4d60dec7f9 | ||
|
|
53d0ac8677 | ||
|
|
e4ba67999c | ||
|
|
0b6ade4a1d | ||
|
|
816e9a78be | ||
|
|
ccb0e8bed9 | ||
|
|
459de6654a | ||
|
|
8b6f0d8a2e | ||
|
|
cf792e849f | ||
|
|
fce82b48b0 | ||
|
|
3d2fe8c409 | ||
|
|
f513c3b8cb | ||
|
|
c66e624c16 | ||
|
|
ddca15ca01 | ||
|
|
199ccb1b12 | ||
|
|
552b33104b | ||
|
|
57b952f64c | ||
|
|
6867fa88d3 | ||
|
|
93af8d966b | ||
|
|
32fa9c3398 | ||
|
|
4a8e769596 | ||
|
|
9c836a89a3 | ||
|
|
b21b6edb0c | ||
|
|
ca49b48814 | ||
|
|
2b9a93deb0 | ||
|
|
d9dede6578 | ||
|
|
2a8a9ba667 | ||
|
|
1bd7c6a33a | ||
|
|
f5301fc374 | ||
|
|
159e7598d7 | ||
|
|
2bd1688d8d | ||
|
|
26143460b7 | ||
|
|
2575141d35 | ||
|
|
48124e56d6 | ||
|
|
e8307a2af7 | ||
|
|
d01ed86803 | ||
|
|
628c978286 | ||
|
|
a0ba496d83 | ||
|
|
0ac4ef7a4b | ||
|
|
ba2efe59cb | ||
|
|
88f61cf292 | ||
|
|
86e5ef7523 | ||
|
|
0451dcd975 | ||
|
|
ba7d46dd73 | ||
|
|
1115ffd8cf | ||
|
|
fa926ef686 | ||
|
|
22fcea99f5 | ||
|
|
876b55dcc1 | ||
|
|
6d0d533fa7 | ||
|
|
9457aff44f | ||
|
|
193374db30 | ||
|
|
2a7f08f360 | ||
|
|
b02e4c1b4f | ||
|
|
8922c6cb67 | ||
|
|
f555a8e7bb | ||
|
|
aac2572b4e | ||
|
|
56e7dc842e | ||
|
|
8452bfb32a | ||
|
|
c49ebbe371 | ||
|
|
e87ec3842b | ||
|
|
595cb84941 | ||
|
|
8d5f244d2f | ||
|
|
8455ac8b39 | ||
|
|
666aaab7f2 | ||
|
|
963ead0a30 | ||
|
|
28a711de75 | ||
|
|
1fca10a1c1 | ||
|
|
96cefeaaf3 | ||
|
|
23a6940894 | ||
|
|
7f2b1c60c7 | ||
|
|
c542cd9f73 | ||
|
|
7e091d1c67 | ||
|
|
6a07a9f693 | ||
|
|
c34d1e0bc1 | ||
|
|
b4c8e54d3e | ||
|
|
b83426caba | ||
|
|
9da99688d3 | ||
|
|
9bcee6afce | ||
|
|
1b5d7ccf3e | ||
|
|
41a8b2718a | ||
|
|
002f22c040 | ||
|
|
bf735f47b0 | ||
|
|
e4aa7efd3c | ||
|
|
b210b22af3 | ||
|
|
059a674ae1 | ||
|
|
881cea4f6d | ||
|
|
5dd78e1cb3 | ||
|
|
83db64d084 | ||
|
|
ed17d4859f | ||
|
|
dc560cd73e | ||
|
|
90eaab4e50 | ||
|
|
3b54fde3f9 | ||
|
|
46e515b130 | ||
|
|
9a9e564dbf | ||
|
|
4971824067 | ||
|
|
dface28c84 |
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
||||
|
||||
# Create Beta artifacts (Builds with the name changed to beta)
|
||||
- name: Create Chrome Beta artifacts
|
||||
run: npm run build:chrome -- --env.stream=beta
|
||||
run: npm run build:chrome -- --env stream=beta
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ChromeExtensionBeta
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
args: zip -qq -r ./builds/ChromeExtensionBeta.zip ./dist
|
||||
|
||||
- name: Create Firefox Beta artifacts
|
||||
run: npm run build:firefox -- --env.stream=beta
|
||||
run: npm run build:firefox -- --env stream=beta
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: FirefoxExtensionBeta
|
||||
|
||||
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
||||
|
||||
# Create Beta artifacts (Builds with the name changed to beta)
|
||||
- name: Create Chrome Beta artifacts
|
||||
run: npm run build:chrome -- --env.stream=beta
|
||||
run: npm run build:chrome -- --env stream=beta
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ChromeExtensionBeta
|
||||
@@ -112,7 +112,7 @@ jobs:
|
||||
|
||||
# Firefox Beta
|
||||
- name: Create Firefox Beta artifacts
|
||||
run: npm run build:firefox -- --env.stream=beta
|
||||
run: npm run build:firefox -- --env stream=beta
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: FirefoxExtensionBeta
|
||||
|
||||
34
.github/workflows/update-oss-attribution.yml
vendored
Normal file
34
.github/workflows/update-oss-attribution.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
||||
name: update oss attributions
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
paths:
|
||||
- 'package.json'
|
||||
- 'package-lock.json'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
update-oss:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '16'
|
||||
- name: Install and generate attribution
|
||||
run: |
|
||||
npm ci
|
||||
npm i -g oss-attribution-generator
|
||||
generate-attribution
|
||||
mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt
|
||||
|
||||
- name: Create pull request to update list
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
commit-message: Update OSS Attribution
|
||||
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
|
||||
branch: ci/oss_attribution
|
||||
title: Update OSS Attribution
|
||||
body: Automated OSS Attribution update
|
||||
4
.github/workflows/updateInvidous.yml
vendored
4
.github/workflows/updateInvidous.yml
vendored
@@ -12,7 +12,9 @@ jobs:
|
||||
uses: actions/checkout@v2
|
||||
- name: Download instance list
|
||||
run: |
|
||||
wget https://api.invidious.io/instances.json -O data.json
|
||||
wget https://api.invidious.io/instances.json -O ci/data.json
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
- name: "Run CI"
|
||||
run: npm run ci:invidious
|
||||
|
||||
|
||||
11
README.md
11
README.md
@@ -82,17 +82,6 @@ Known chromium bug: Extension is not loaded properly on first start. Visit `chro
|
||||
|
||||
For Firefox for Android, use `npm run dev:firefox-android -- --adb-device <ip-address of the device>`. See the [Firefox documentation](https://extensionworkshop.com/documentation/develop/developing-extensions-for-firefox-for-android/#debug-your-extension) for more information.
|
||||
|
||||
### Attribution Generation
|
||||
|
||||
If you contribute and add a dependency, update the attribution file using the following steps:
|
||||
|
||||
Make sure the attribution generator is installed: `npm i -g oss-attribution-generator`
|
||||
|
||||
```bash
|
||||
generate-attribution
|
||||
mv ./oss-attribution/attribution.txt ./public/oss-attribution/attribution.txt
|
||||
```
|
||||
|
||||
# Credit
|
||||
|
||||
The awesome [Invidious API](https://docs.invidious.io/API.md) was previously used, and the server is now using [NewLeaf](https://git.sr.ht/~cadence/NewLeaf) as a to get video info from YouTube.
|
||||
|
||||
@@ -8,12 +8,12 @@ import { writeFile, existsSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
|
||||
// import file from https://api.invidious.io/instances.json
|
||||
if (!existsSync('./data.json')) {
|
||||
if (!existsSync(join(__dirname, "data.json"))) {
|
||||
process.exit(1);
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
import * as data from "./data.json";
|
||||
import * as data from "../ci/data.json";
|
||||
|
||||
type instanceMap = {
|
||||
name: string,
|
||||
|
||||
@@ -1 +1 @@
|
||||
["yewtu.be","invidious.snopyta.org","vid.puffyan.us","invidious.kavin.rocks","invidio.xamh.de","invidious-us.kavin.rocks","inv.riverside.rocks","vid.mint.lgbt","youtube.076.ne.jp","invidious.namazso.eu"]
|
||||
["yewtu.be","invidious.snopyta.org","vid.puffyan.us","invidious.kavin.rocks","invidio.xamh.de","inv.riverside.rocks","invidious.osi.kr","inv.cthd.icu","yt.artemislena.eu","youtube.076.ne.jp","invidious.namazso.eu"]
|
||||
@@ -13,7 +13,7 @@
|
||||
"preview": ["skip", "mute"],
|
||||
"filler": ["skip", "mute"],
|
||||
"music_offtopic": ["skip"],
|
||||
"poi_highlight": ["skip"]
|
||||
"poi_highlight": ["poi"]
|
||||
},
|
||||
"wikiLinks": {
|
||||
"sponsor": "https://wiki.sponsor.ajay.app/w/Sponsor",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "4.0.4",
|
||||
"version": "4.1.4",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"homepage_url": "https://sponsor.ajay.app",
|
||||
@@ -47,6 +47,9 @@
|
||||
"icons/beep.ogg",
|
||||
"icons/pause.svg",
|
||||
"icons/stop.svg",
|
||||
"icons/heart.svg",
|
||||
"icons/visible.svg",
|
||||
"icons/not_visible.svg",
|
||||
"icons/PlayerInfoIconSponsorBlocker.svg",
|
||||
"icons/PlayerDeleteIconSponsorBlocker.svg",
|
||||
"popup.html",
|
||||
|
||||
File diff suppressed because one or more lines are too long
23913
package-lock.json
generated
23913
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
86
package.json
86
package.json
@@ -4,38 +4,36 @@
|
||||
"description": "",
|
||||
"main": "background.js",
|
||||
"dependencies": {
|
||||
"@types/react": "^16.9.22",
|
||||
"@types/react-dom": "^16.9.5",
|
||||
"@types/selenium-webdriver": "^4.0.15",
|
||||
"babel": "^6.23.0",
|
||||
"babel-core": "^6.26.3",
|
||||
"babel-loader": "^8.0.6",
|
||||
"babel-preset-env": "^1.7.0",
|
||||
"concurrently": "^5.1.0",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/chrome": "0.0.91",
|
||||
"@types/firefox-webext-browser": "70.0.1",
|
||||
"@types/jest": "^24.0.23",
|
||||
"@types/jquery": "^3.3.31",
|
||||
"@typescript-eslint/eslint-plugin": "^4.9.1",
|
||||
"@typescript-eslint/parser": "^4.9.1",
|
||||
"chromedriver": "^92.0.0",
|
||||
"copy-webpack-plugin": "^6.4.1",
|
||||
"eslint": "^7.15.0",
|
||||
"eslint-plugin-react": "^7.21.5",
|
||||
"jest": "^27.0.6",
|
||||
"rimraf": "^3.0.0",
|
||||
"selenium-webdriver": "^4.0.0-beta.4",
|
||||
"ts-jest": "^27.0.3",
|
||||
"ts-loader": "^6.2.1",
|
||||
"typescript": "~4.3",
|
||||
"web-ext": "^6.2.0",
|
||||
"webpack": "~4.46.0",
|
||||
"webpack-cli": "~3.3.10",
|
||||
"webpack-merge": "~4.2.2"
|
||||
"@types/chrome": "^0.0.178",
|
||||
"@types/firefox-webext-browser": "^94.0.1",
|
||||
"@types/jest": "^27.4.0",
|
||||
"@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",
|
||||
"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",
|
||||
"webpack-cli": "^4.9.2",
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"scripts": {
|
||||
"web-run": "npm run web-run:chrome",
|
||||
@@ -44,16 +42,16 @@
|
||||
"web-run:firefox-android": "cd dist && web-ext run -t firefox-android --firefox-apk org.mozilla.fenix",
|
||||
"web-run:chrome": "cd dist && web-ext run --start-url https://chrome.google.com/webstore/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm -t chromium",
|
||||
"build": "npm run build:chrome",
|
||||
"build:chrome": "webpack --env.browser=chrome --config webpack/webpack.prod.js",
|
||||
"build:firefox": "webpack --env.browser=firefox --config webpack/webpack.prod.js",
|
||||
"build:safari": "webpack --env.browser=safari --config webpack/webpack.prod.js",
|
||||
"build:edge": "webpack --env.browser=edge --config webpack/webpack.prod.js",
|
||||
"build:chrome": "webpack --env browser=chrome --config webpack/webpack.prod.js",
|
||||
"build:firefox": "webpack --env browser=firefox --config webpack/webpack.prod.js",
|
||||
"build:safari": "webpack --env browser=safari --config webpack/webpack.prod.js",
|
||||
"build:edge": "webpack --env browser=edge --config webpack/webpack.prod.js",
|
||||
"build:dev": "npm run build:dev:chrome",
|
||||
"build:dev:chrome": "webpack --env.browser=chrome --config webpack/webpack.dev.js",
|
||||
"build:dev:firefox": "webpack --env.browser=firefox --config webpack/webpack.dev.js",
|
||||
"build:dev:chrome": "webpack --env browser=chrome --config webpack/webpack.dev.js",
|
||||
"build:dev:firefox": "webpack --env browser=firefox --config webpack/webpack.dev.js",
|
||||
"build:watch": "npm run build:watch:chrome",
|
||||
"build:watch:chrome": "webpack --env.browser=chrome --config webpack/webpack.dev.js --watch",
|
||||
"build:watch:firefox": "webpack --env.browser=firefox --config webpack/webpack.dev.js --watch",
|
||||
"build:watch:chrome": "webpack --env browser=chrome --config webpack/webpack.dev.js --watch",
|
||||
"build:watch:firefox": "webpack --env browser=firefox --config webpack/webpack.dev.js --watch",
|
||||
"ci:invidious": "ts-node ci/invidiousCI.ts",
|
||||
"dev": "npm run build:dev && concurrently \"npm run web-run\" \"npm run build:watch\"",
|
||||
"dev:firefox": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox\" \"npm run build:watch:firefox\"",
|
||||
@@ -64,6 +62,22 @@
|
||||
"lint": "eslint src",
|
||||
"lint:fix": "eslint src --fix"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12.20.0"
|
||||
},
|
||||
"funding": [{
|
||||
"type": "individual",
|
||||
"url": "hhttps://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"
|
||||
|
||||
@@ -87,5 +87,124 @@
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "تحديث الأجزاء"
|
||||
},
|
||||
"Username": {
|
||||
"message": "اسم المستخدم"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "نجح طلب الإذن!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "فشل طلب الإذن ، هل نقرت على رفض؟"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "خاطئ/التوقيت غير صحيح"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"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"
|
||||
},
|
||||
"Donate": {
|
||||
"message": "تبرع"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "إخفاء رابط التبرع"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "الوضع الداكن في صفحة الخيارات"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "التعديل"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "هذا بطيء جداً"
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "هل يمكنني الحصول على نسخة من قاعدة البيانات؟ ماذا يحدث إذا اختفيت؟"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "قاعدة البيانات عامة ومتاحة على"
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "الأخبار وكيف تم صنعها"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "أين يمكنني الحصول على شفرة المصدر؟"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "معرفة المزيد"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "افتح صفحة ويكي هذه الفئة."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "نسخ وتصويت معارض"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "متابعة التصويت"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "استخدم عجلة الماوس أثناء التمرير فوق مربع التعديل لضبط الوقت بسرعة. يمكن استخدام مجموعات مفتاح ctrl أو Shift لضبط التغييرات."
|
||||
},
|
||||
"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": "هذا اختصار يوتيوب مدمج. هل أنت متأكد أنك تريد استخدامه؟"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Активиране проследяването на броя пропускания в раздели „Инкогнито“"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Съхраняване на отрицателните гласове за сегменти"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Всички сегменти, за които гласувате против, ще останат скрити дори след опресняване"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Внимание: Деактивирането на това ще изтрие всички по-рано запазени отрицателни гласове"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Заявка по префикс на хеш"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Задайте клавиш за пропускане на сегмент"
|
||||
"message": "Пропускане на сегмент",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Задайте клавиш за начало/край на сегмент"
|
||||
"message": "Начало/край на сегмент",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Задайте клавиш за изпращане"
|
||||
"message": "Изпращане на сегментите",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Изберете клавиш, като го натиснете"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Клавишът е зададен за: "
|
||||
"message": "Изберете клавиш, като го натиснете, заедно с всички клавишни модификатори, които искате да използвате."
|
||||
},
|
||||
"0": {
|
||||
"message": "Времето за изчакване на връзката изтече. Проверете връзката си с интернет. Ако вашият интернет работи, вероятно сървърът е претоварен или не работи."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Пропуснали сте "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Спестили сте "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "минута"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "часа"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Спестили сте на хората"
|
||||
"message": "Спестили сте на хората",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " от живота им"
|
||||
"message": " от живота им",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Проверете status.sponsor.ajay.app за състоянието на сървъра."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Създаден от"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". В момента е настроено на:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Поддръжка на YouTube-сайтове на трети страни"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Следното предложение е по-кратко от опцията за минимална продължителност. Това може да означава, че вече е изпратено и просто е игнорирано поради тази опция. Наистина ли искате да го изпратите?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Не е разрешено изпращането по време на активен поток на живо или премиера. Моля, изчакайте, докато приключи, след което опреснете страницата и проверете дали сегментите са все още валидни."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Показване на бутона за качване"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Импортиране/експортиране на всички опции"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Редактиране/копиране"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Записване във файл"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Зареждане от файл"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Това е цялата ви конфигурация в JSON. Това включва вашия userID, така че се уверете, че споделяте това разумно."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Информацията за отстраняване на грешки е копирана в клипборда. Чувствайте се свободни да премахнете всяка информация, която предпочитате да не споделяте. Запазете това в текстов файл или го поставете в доклада за грешки."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Клавишът"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "е обвързан с друго действие. Моля, изберете друг клавиш."
|
||||
"message": "Тази клавишна комбинация е свързана с друго действие. Моля, изберете друга."
|
||||
},
|
||||
"to": {
|
||||
"message": "до",
|
||||
@@ -578,7 +592,7 @@
|
||||
"message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Пълнеж извън темата"
|
||||
"message": "Пълнеж/Шеги"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Съпътстващи сцени, добавени само за пълнеж или хумор, които не са необходими за разбирането на основното съдържание на видеоклипа. Това не трябва да включва сегменти, предоставящи контекст или справочни данни."
|
||||
@@ -641,9 +655,6 @@
|
||||
"message": "Показване на икона, когато видеоклипът е изцяло реклама",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Вашият цвят не е форматиран правилно. Трябва да бъде 3- или 6-цифрен шестнадесетичен код с „#“ в началото."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Цвят на неизпратен сегмент",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,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, ако мислите така, направете коментар тук:"
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Дарение"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Помогнете с финансиране на разработката"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Скриване на връзката за дарение"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Тъмен режим на страницата с опции"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Благодарим ви, че инсталирахте SponsorBlock."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"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. Наистина ли искате да я използвате?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Povolit sledování počtu přeskočení v soukromých/anonymních oknech"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Ukládat hlasy proti segmentům"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Jakékoli segmenty, proti kterým budete hlasovat, zůstanou skryté i po obnovení karty"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Varování: Zakázání této možnosti odstraní všechny dříve uložené hlasy proti"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Dotaz podle hash předpony"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Nastavit klávesu pro přeskočení segmentu"
|
||||
"message": "Přeskočit segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Nastavte klávesu pro spuštění/zastavení segmentu"
|
||||
"message": "Začít/ukončit segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Nastavte klávesu pro odeslání"
|
||||
"message": "Odeslat segmenty",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Nastavte klávesu jejím zadáním"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Klávesa byla nastavena na: "
|
||||
"message": "Vyberte klávesu jejím zadáním a zvolte si modifikátory, které chcete použít."
|
||||
},
|
||||
"0": {
|
||||
"message": "Vypršel časový limit připojení. Zkontrolujte vaše připojení k internetu. Pokud váš internet funguje, server je nejspíš přetížený nebo spadnul."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Přeskočili jste "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Ušetřili jste si "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minutu"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "hodin"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Ušetřili jste lidem"
|
||||
"message": "Ušetřili jste lidem",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " jejich života"
|
||||
"message": " jejich života",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Podívejte se na status.sponsor.ajay.app pro stav serverů."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Vytvořil"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Je momentálně nastaveno na:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Podpora pro weby YouTube třetích stran"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Váš příspěvek je kratší než vaše možnost nejkratší doby trvání. To by mohlo znamenat, že někdo segment již odeslal, a je jenom ignorován kvůli této možnosti. Opravdu chcete odeslat váš příspěvek?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Odesílání na aktivním streamu nebo premiéře. Počkejte prosím, než skončí, poté obnovte stránku a ověřte, zda jsou segmenty stále platné."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Zobrazit tlačítko Nahrát"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importovat / exportovat všechny možnosti"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Upravit/kopírovat"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Uložit do souboru"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Načíst ze souboru"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Toto je celá vaše konfigurace ve formátu JSON. Zahrnuje vaše userID, takže s ní nakládejte opatrně."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Ladící informace byly zkopírovány do schránky. Můžete odstranit jakékoli informace, které raději nechcete sdílet. Uložte text do textového souboru nebo vložte do chybového hlášení."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Klávesa"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "je přiřazena k jiné akci. Zvolte prosím jinou klávesu."
|
||||
"message": "Tato zkratka je vázána na jinou akci. Vyberte prosím jinou."
|
||||
},
|
||||
"to": {
|
||||
"message": "do",
|
||||
@@ -578,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Výplň"
|
||||
"message": "Výplň/vtipy"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Výplňové scény přidané jen jako přídavek nebo humor, které nejsou vyžadovány pro pochopení hlavního obsahu videa. Toto by nemělo zahrnovat segmenty poskytující kontext nebo podrobnosti na pozadí."
|
||||
@@ -641,9 +655,6 @@
|
||||
"message": "Zobrazit ikonu, když je celé video reklama",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Vaše barva má nesprávný formát. Měl by to být 3 nebo 6 znaků dlouhý HEX kód s křížkem na začátku."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Barva neodeslaného segmentu",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "skryté: moc krátké"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "ručně skryto"
|
||||
},
|
||||
"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 kanálu ještě není načteno. Pokud používáte vložené video, zkuste místo toho použít domovskou stránku YouTube. Toto může být také způsobeno změnami v rozložení YouTube, pokud si myslíte, že tomu tak bude, zanechte zde komentář:"
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Přispět"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Pomozte s financováním vývoje"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Skrýt odkaz na přispění"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Tmavý režim na stránce možností"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Děkujeme za instalaci SponsorBlocku."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Chování",
|
||||
"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": "Rozhraní",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "Klávesové zkratky",
|
||||
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabBackup": {
|
||||
"message": "Záloha/obnovení",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Různé",
|
||||
"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": "Vzhled oznámení o přeskočení",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Odebrat",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Nenastaveno"
|
||||
},
|
||||
"change": {
|
||||
"message": "Změnit"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Toto je vestavěná zkratka YouTube. Opravdu ji chcete použít?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,19 +263,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Indstil tast for at springe et segment over"
|
||||
"message": "Spring segment over",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Indstil tast til start/stop segment tastaturbinding"
|
||||
"message": "Start/stop segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Indstil tast til indsendelse tastaturbinding"
|
||||
"message": "Indsend segmenter",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Vælg en tast ved at skrive den"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tastaturbindingen er blevet sat til: "
|
||||
"message": "Velg en tast ved at trykke på den og vælg de modificeringstaster du ønsker at bruge."
|
||||
},
|
||||
"0": {
|
||||
"message": "Forbindelsestimeout. Tjek din internetforbindelse. Hvis dit internet fungerer, er serveren sandsynligvis overbelastet eller nede."
|
||||
@@ -302,6 +302,10 @@
|
||||
"mute": {
|
||||
"message": "Gør Tavs"
|
||||
},
|
||||
"full": {
|
||||
"message": "Fuld Video",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Spring {0} over?"
|
||||
},
|
||||
@@ -345,9 +349,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Du har sprunget over "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Du har gemt dig selv "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minut"
|
||||
},
|
||||
@@ -361,10 +362,12 @@
|
||||
"message": "timer"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Du har sparret folk"
|
||||
"message": "Du har sparret folk",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " af deres liv"
|
||||
"message": " af deres liv",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Tjek status.sponsor.ajay.app for serverstatus."
|
||||
@@ -384,9 +387,6 @@
|
||||
"createdBy": {
|
||||
"message": "Oprettet Af"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Det er i øjeblikket sat til:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Understøtter tredjeparts YouTube sider"
|
||||
},
|
||||
@@ -436,6 +436,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Den følgende indsendelse er kortere end din minimums varighed indstilling. Dette kan betyde, at den allerede er indsendt, og bare bliver ignoreret på grund af denne indstilling. Er du sikker på, at du vil indsende?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Indendeslse på en aktiv livestream eller premiere er ikke tilladt. Vent venligst indtil den er færdig og opdater derefter siden og bekræft, at segmenterne stadig er gyldige."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Vis Upload-Knap"
|
||||
},
|
||||
@@ -463,6 +466,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importer/Eksporter Alle Indstillinger"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Rediger/kopier"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Gem til fil"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Indlæs fra fil"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Dette er hele din konfiguration i JSON. Dette inkluderer dit bruger-ID, så sørg for at dele dette med omtanke."
|
||||
},
|
||||
@@ -511,11 +523,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Fejlfindingsinformationen er blevet kopieret til klippebordet. Du er velkommen til at fjerne alle oplysninger, du helst ikke vil dele. Gem dette i en tekstfil eller indsæt i fejlrapporten."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Tasten"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "er bundet til en anden handling. Venligst vælg en anden nøgle."
|
||||
"message": "Denne genvej er budnet til en anden handling. Vælg venligst en anden."
|
||||
},
|
||||
"to": {
|
||||
"message": "til",
|
||||
@@ -533,6 +542,16 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Ligesom \"sponsor\" bortset fra ubetalt- eller selfmarkedsføring. Dette inkluderer sektioner om merchandise, donationer eller oplysninger om hvem, de har samarbejdet med."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Eksklusiv Adgang"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Kun til mærkning af hele videor. Bruges, når en video viser et produkt, tjeneste eller sted, som de har modtaget gratis eller subsidieret adgang til."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Denne video viser et produkt, tjeneste eller et sted, som de har modtaget gratis eller subsidieret adgang til",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Påmindelse Om Interaktion (Abonnement)"
|
||||
},
|
||||
@@ -563,9 +582,6 @@
|
||||
"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"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -614,14 +630,18 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Vis I Søgebar"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Vis Etiket"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Spring automatisk over alle segmenter, når der er et ikke-musik-segment"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Tillad segmenter som dæmper lyden i stedet for at springe over"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Din farve er formateret forkert. Det skal være en 3-6 cifret hex-kode med et nummerskilt i begyndelsen."
|
||||
"fullVideoSegments": {
|
||||
"message": "Vis et ikon, når en video udelukkende er en reklame",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Ikke-Indsendt Farve",
|
||||
@@ -737,6 +757,12 @@
|
||||
"message": "Forstået",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Dette segment er stort. Hvis hele videon handler om et emne, så skift fra \"Skip\" til \"Fuld Video\". Se retningslinjerne for mere information."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Hele denne video er mærket som denne kategori og er for tæt integreret til at være i stand til at adskille"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Fravælg alle fremtidige eksperimenter",
|
||||
"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."
|
||||
@@ -757,6 +783,9 @@
|
||||
"hideDonationLink": {
|
||||
"message": "Skjul Donationslink"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Mørk Tilstand På Indstillingssiden"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Tak for at installere SponsorBlock."
|
||||
},
|
||||
@@ -835,6 +864,9 @@
|
||||
"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."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Ny! Se når en video er helt sponsoreret eller selvpromoverende"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
@@ -842,5 +874,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "t",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Adfærd",
|
||||
"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": "Grænseflade",
|
||||
"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": "Tastaturgenveje",
|
||||
"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": "Sikkerhedskopier/Gendan",
|
||||
"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": "Diverse",
|
||||
"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": "Spring meddelelsesvisning over",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Adskil",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Ikke indstillet"
|
||||
},
|
||||
"change": {
|
||||
"message": "Skift"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dette er en indbygget Youtube-genvej. Er du sikker på, at du vil bruge den?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
"message": "Abbrechen"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Laden..."
|
||||
"message": "Lädt..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Verstecken"
|
||||
@@ -183,7 +183,7 @@
|
||||
"message": "Versteckt die Schaltflächen im YouTube-Videoplayer, um Segmente einzusenden."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "\"Zum Highlight springen\"-Knopf im Player behalten"
|
||||
"message": "\"Zum Highlight springen\"-Button im Player behalten"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Zeige Info-Knopf im Youtube-Videoplayer"
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktiviere den Übersprungen Zähler in Privaten/Incognito Tabs"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Speichere Abschnitts-downvotes"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Alle Segmente welche du negativ bewertest werden versteckt, selbst nach einer aktualisierung"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Warnung: Das deaktivieren wird alle vorher gespeicherten Downvotes löschen"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Abfrage nach Hash-Präfix"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Taste zum Überspringen eines Segments festlegen"
|
||||
"message": "Segment überspringen",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Taste für das Starten/Stoppen eines Segments festlegen"
|
||||
"message": "Starte/Stoppe Segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Taste für das Einsenden festlegen"
|
||||
"message": "Segmente senden",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Zum Festlegen eine Taste drücken"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Die Taste wurde festgelegt auf: "
|
||||
"message": "Wähle eine Taste durch Eingeben aus, und wähle (optional) gewünschte Hilfstasten."
|
||||
},
|
||||
"0": {
|
||||
"message": "Zeitüberschreibung. Überprüfe deine Internetverbindung. Bist du mit dem Internet verbunden, ist der Server wahrscheinlich offline."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Du übersprangst "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": " und erspartest dir damit "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "Minute"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "Stunden"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Du erspartest anderen"
|
||||
"message": "Du erspartest anderen",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " ihres Lebens"
|
||||
"message": " ihres Lebens",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Du kannst den Serverstatus auf https://status.sponsor.ajay.app überprüfen."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Erstellt von"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Aktuelle Einstellung:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Drittanbieter YouTube-Sites unterstützen"
|
||||
},
|
||||
@@ -432,14 +437,17 @@
|
||||
"message": "Videosegmente, die kürzer als der festgelegte Wert sind, werden nicht übersprungen oder im Player angezeigt."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Benachrichtigungsdauer überspringen (Sekunden):"
|
||||
"message": "Dauer der Überspringenbenachrichtigung (Sekunden):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Die Überspringen Benachrichtigung wird mindestens so lange angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein."
|
||||
"message": "Die überspringen Benachrichtigung wird mindestens für so viele Sekunden angezeigt. Für manuelles Überspringen kann sie länger sichtbar sein."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Die folgende Einreichung ist kürzer als deine Mindestdauer. Das könnte bedeuten, dass dieses Videosegment bereits eingereicht wurde und aufgrund dieser Option einfach ignoriert wird. Bist du dir sicher, dass du es übermitteln möchtest?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Das Einreichen eines aktiven Livestreams oder Premiere ist nicht erlaubt. Bitte warte bis es zu ende ist, lade die Seite neu und überprüfe, dass die Segmente noch immer korrekt sind."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Upload-Knopf anzeigen"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Import/Export aller Einstellungen"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Bearbeiten/kopieren"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Als Datei speichern"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Aus Datei laden"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Dies ist deine gesamte Konfiguration im JSON-Format. Da diese auch deine Benutzer-ID enthält, solltest du dir genau überlegen, mit wem du diese teilen möchtest."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Die Debug-Informationen wurden in die Zwischenablage kopiert. Du kannst alle Informationen entfernen, die du nicht teilen möchtest. Verwende einen Texteditor um die Informationen in einer Textdatei zu speichern (um diese ggf. einem Fehlerbericht hinzuzufügen)."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Die Taste"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "wird bereits für eine andere Aktion verwendet. Bitte wähle eine andere Taste."
|
||||
"message": "Diese Verknüpfung ist an eine andere Aktion gebunden. Bitte wählen Sie eine andere."
|
||||
},
|
||||
"to": {
|
||||
"message": "bis",
|
||||
@@ -544,7 +558,7 @@
|
||||
"message": "Nur für das Kennzeichnen ganzer Videos. Wird verwendet wenn ein Video ein Produkt, eine Dienstleistung oder einen Ort präsentiert, zu welchem sie freien oder subventionierten Zugriff erhalten haben."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Dieses Video präsentiert ein Produkt, eine Dienstleistung oder einen Ort, zu welchem sie freien oder subventionierten Zigriff erhalten haben",
|
||||
"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_interaction": {
|
||||
@@ -578,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Füller/Nebensächliches"
|
||||
"message": "Füller/Witze"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Nebensächliche Szenen, die nur als Füller oder Witz dienen und nicht benötigt sind um den Hauptinhalt des Videos zu verstehen. Dies bezieht sich nicht auf Segmente, die Kontext oder Hintergrunddetails liefern."
|
||||
@@ -638,12 +652,9 @@
|
||||
"message": "Segmente zulassen, die den Ton ausschalten anstatt zu überspringen"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "Zeige an, wenn das gesamte Video Werbung ist",
|
||||
"message": "Zeige ein Icon, wenn ein ganzes Video Werbung ist",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Die Farbe ist falsch formatiert. Sie sollte ein 3-6-stelliger Hex-Code mit einer Raute am Anfang sein."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Nicht eingereichte Farbe",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "Ausgeblendet: zu kurz"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "Manuell versteckt"
|
||||
},
|
||||
"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 ist noch nicht geladen. Falls es sich um ein eingebettetes Video handelt, probiere stattdessen die YouTube-Homepage. Dies könnte auch durch Änderungen im YouTube-Layout verursacht werden. Sollte das der Fall sein, kannst du es hier vermerken:"
|
||||
@@ -762,7 +776,7 @@
|
||||
"message": "Dieses Segment ist lang. Wenn das gesamte Video nur ein Thema behandelt, wechsle von \"Überspringen\" zu \"Ganzes Video\". Erfahre mehr in den Richtlinien."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Das gesamte Video ist dieser Kategorie zugeordnet, da diese zu sehr im Video eingebaut ist, um einzelne Segmente zu erstellen"
|
||||
"message": "Das gesamte Video fällt unter diese Kategorie und ist zu stark integriert, um es zu trennen"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Aus allen zukünftigen Experimenten abmelden",
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Spenden"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Hilf beim finanzieren der Entwicklung"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Verstecke Spendenlink"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Dunkler Modus auf der Optionsseite"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Danke fürs installieren von SponsorBlock."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "S",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Verhalten",
|
||||
"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": "Aussehen",
|
||||
"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": "Tastenkürzel",
|
||||
"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": "Sichern/Wiederherstellen",
|
||||
"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": "Verschiedenes",
|
||||
"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": "Überspringen-Benachrichtigungs aussehen",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Aufheben",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Nicht gesetzt"
|
||||
},
|
||||
"change": {
|
||||
"message": "Ändern"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dies ist ein vorhandenes YouTube-Kürzel. Sind Sie sicher, dass Sie diese verwenden möchten?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
{
|
||||
"fullName": {
|
||||
"message": "SponsorBlock for YouTube - Skip Sponsorships",
|
||||
"message": "SponsorBlock για το YouTube - Παραλείπει Χορηγίες",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Παράλειψη χορηγιών, επαιτείας συνδρομής και άλλων στα βίντεο του YouTube. Αναφέρετε χορηγούς σε βίντεο που βλέπετε για να εξοικονομήσετε τον χρόνο άλλων.",
|
||||
"message": "Παράλειψη χορηγιών, έκκλησης συνδρομής και πολλά περισσότερα στα βίντεο του YouTube. Αναφέρετε χορηγίες σε βίντεο που βλέπετε για να κερδίσετε χρόνο στους υπολοίπους.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Ο διακομιστής είπε πως το αίτημα αυτό ήταν άκυρο"
|
||||
"message": "Ο διακομιστής ανέφερε πως αυτό το αίτημα δεν είναι έγκυρο"
|
||||
},
|
||||
"429": {
|
||||
"message": "Έχετε υποβάλει πάρα πολλές ώρες χορηγών για αυτό το βίντεο, είστε σίγουροι ότι υπάρχουν τόσες πολλές;"
|
||||
"message": "Έχετε υποβάλει πολλά τμήματα χορηγιών για αυτό το βίντεο, είστε σίγουροι ότι υπάρχουν τόσα πολλά;"
|
||||
},
|
||||
"409": {
|
||||
"message": "Αυτό έχει ήδη υποβληθεί"
|
||||
"message": "Αυτό έχει ήδη υποβληθεί στο παρελθόν"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Το κανάλι προστέθηκε στην λίστα επιτρεπόμενων!"
|
||||
"message": "Το κανάλι προστέθηκε στη λίστα αποδοχής!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "τμήμα"
|
||||
@@ -26,31 +26,70 @@
|
||||
"message": "τμήματα"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Κάντε upvote αυτήν την υποβολή"
|
||||
"message": "Θετική ψήφος για αυτήν την υποβολή"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Αναφορά"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Αναφέρετε αυτή την υποβολή σαν λανθασμένη."
|
||||
"message": "Αναφορά αυτής της υποβολής ως λανθασμένης."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Παράβλεψη"
|
||||
},
|
||||
"Loading": {
|
||||
"message": "Φόρτωση..."
|
||||
"message": "Φόρτωση…"
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Να μην εμφανίζεται ποτέ"
|
||||
"message": "Να μην ξαναεμφανιστεί"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Πατήστε αναίρεση παράλειψης για να επιστρέψετε όπου βρισκόσασταν."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Αναίρεση παράλειψης"
|
||||
},
|
||||
"reskip": {
|
||||
"message": "Παράλειψη ξανά"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Αναίρεση σίγασης"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Σε παύση"
|
||||
},
|
||||
"manualPaused": {
|
||||
"message": "Λήξη χρονομέτρου"
|
||||
"message": "Λήξη Χρονομέτρου"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Για να επεξεργαστείτε ή να διαγράψετε τα τμήματα ξεχωριστά, ανοίξτε το αναδυόμενο παράθυρο πατώντας το κουμπί πληροφορίες (i) ή πατώντας το εικονίδιο της επέκτασης στην πάνω δεξιά γωνία του προγράμματος περιήγησης σας."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Θέλετε σίγουρα να εκκαθαρίσετε τη φόρμα;\n\n"
|
||||
"message": "Θέλετε σίγουρα να σβήσετε τη φόρμα υποβολής τμημάτων;\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Παρουσιάστηκε ένα σφάλμα κατά την υποβολή των τμημάτων χορηγιών, παρακαλώ προσπαθήστε ξανά αργότερα."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Υπάρχουν τμήματα στη βάση δεδομένων για αυτό το βίντεο!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Δε βρέθηκαν τμήματα στη βάση δεδομένων"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Το τμήμα ξεκινάει εδώ"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Το τμήμα τελειώνει εδώ"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Ακύρωση δημιουργίας τμήματος"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Δε βρέθηκε βίντεο YouTube.\nΑν αυτό δεν είναι σωστό, παρακαλώ ανανεώστε την καρτέλα."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Ανανέωση των δεδομένων των τμημάτων"
|
||||
},
|
||||
"success": {
|
||||
"message": "Επιτυχία!"
|
||||
@@ -58,11 +97,154 @@
|
||||
"voted": {
|
||||
"message": "Ψηφίστηκε!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Φαίνεται ότι ο διακομιστής έχει πέσει. Παρακαλώ επικοινωνήστε με τον προγραμματιστή αμέσως."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Παρουσιάστηκε σφάλμα σύνδεσης. Κωδικός σφάλματος: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Καθαρισμός τμημάτων"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Εμφάνιση του αναδυόμενου παραθύρου του SponsorBlock"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Κλείσιμο αναδυόμενου παραθύρου"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Υποβολή Τμημάτων"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Είσαστε σίγουροι για την υποβολή σας;"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Λίστα αποδοχής καναλιών"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Αφαίρεση καναλιού από τη λίστα αποδοχής"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Ψηφίστε για κάποιο τμήμα"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Υποβολές"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Έχετε γλιτώσει τον κόσμο από "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Πίνακας βαθμολογίας"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Υποβολή"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Η επεξεργασία τμήματος θα εμφανιστεί αφότου πατήσετε υποβολή",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Συμβουλή: Μπορείτε να ρυθμίσετε συντομεύσεις πλήκτρων για υποβολή στις ρυθμίσεις"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Σβήσιμο τμημάτων"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Υποβολή τμημάτων"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Χρησιμοποιείται στη δημόσια σελίδα στατιστικών για να αναδειχθεί πόσο έχετε συμβάλει. Δείτε το"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Όνομα χρήστη"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Ορισμός ονόματος χρήστη"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Αντιγραφή δημόσιου αναγνωριστικού"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Μπείτε στον επίσημο διακομιστή μας στο Discord για ανατροφοδότηση και προτάσεις!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Απόκρυψη"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Επιλογές"
|
||||
"message": "Ρυθμίσεις"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Εμφάνιση Κουμπιών στην οθόνη αναπαραγωγής YouTube"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Απόκρυψη Κουμπιών από την οθόνη αναπαραγωγής YouTube"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Αυτό αποκρύπτει τα κουμπιά που εμφανίζονται στο πρόγραμμα αναπαραγωγής YouTube ώστε να υποβάλετε τμήματα προς παράλειψη."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Διατήρηση του κουμπιού παράλειψης προς την καλύτερη στιγμή στο πρόγραμμα αναπαραγωγής"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Εμφάνιση κουμπιού «πληροφορίες» στο πρόγραμμα αναπαραγωγής YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Απόκρυψη κουμπιού «πληροφορίες» από το πρόγραμμα αναπαραγωγής YouTube"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Αυτόματη απόκρυψη του κουμπιού «Πληροφορίες»"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Απόκρυψη κουμπιού «διαγραφή» από το πρόγραμμα αναπαραγωγής YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Εμφάνιση κουμπιού «διαγραφή» στο πρόγραμμα αναπαραγωγής YouTube"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Ενεργοποίηση του μετρητή παραλείψεων"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Αυτή η δυνατότητα ανιχνεύει ποια τμήματα έχετε παραλείψει, ώστε να ξέρουν εκείνοι που τα υπέβαλαν, πόσο έχουν βοηθήσει τους συνανθρώπους τους, και χρησιμοποιείται ως μέτρηση μαζί με τις θετικές ψήφους, ώστε να βεβαιωθεί η βάση δεδομένων πως δεν είναι ανεπιθύμητο τμήμα. Κάθε φορά που παραλείπετε κάποιο τμήμα ή επέκταση το στέλνει στον διακομιστή. Ελπίζουμε οι περισσότεροι χρήστες να μην αλλάξουν αυτή τη ρύθμιση, ώστε ο αριθμός μη προβολής τμημάτων να είναι ακριβής. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Ενεργοποίηση του μετρητή παραλείψεων σε καρτέλες Ιδιωτικής/Ανώνυμης περιήγησης"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Αιτήματα μέσω προθέματος Hash"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Αντί να ζητάτε τα τμήματα από τον διακομιστή μέσω ολόκληρης της ταυτότητας του βίντεο, στέλνονται μόνο οι πρώτοι 4 κομμένοι χαρακτήρες από την ταυτότητα του βίντεο. Ο διακομιστής στέλνει πίσω δεδομένα για όλα τα βίντεο με παρόμοιους κομμένους χαρακτήρες."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Επανάληψη αναζήτησης τμημάτων σε νέα βίντεο"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Εάν το βίντεο είναι καινούργιο, και δεν έχουν βρεθεί τμήματα, θα συνεχιστεί η αναζήτηση κάθε μερικά λεπτά, ενώ το παρακολουθείτε."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Επανεμφάνιση ειδοποιήσεων"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Εμφάνιση ειδοποιήσεων μετά την παράλειψη κάθε τμήματος"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Ειδοποιήσεις παράλειψης πλήρους μεγέθους"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Μικρές ειδοποιήσεις αυτόματης παράλειψης"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Να είναι όλες μικρές ειδοποιήσεις"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Ξεθωριασμένες ειδοποιήσεις αυτόματης παράλειψης"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Να είναι όλες ξεθωριασμένες ειδοποιήσεις"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "Το SponsorBlock σας επιτρέπει να παραλείψετε χορηγίες, εισαγωγές, επίλογους, υπενθυμίσεις εγγραφής, και άλλα ενοχλητικά μέρη των βίντεο YouTube. Το SponsorBlock είναι μια επέκταση που τροφοδοτείται, από τους ίδιους τους χρήστες, επιτρέπει στον κάθε έναν να υποβάλει το πότε ξεκινούν και πότε τελειώνουν τμήματα χορηγιών των βίντεο YouTube. Μόλις κάποιος χρήστης υποβάλει αυτή τη πληροφορία, ο οποιοσδήποτε άλλος που έχει αυτήν την επέκταση μπορεί να παραλείψει όλα αυτά τα ενοχλητικά τμήματα χορηγιών. Μπορείτε επίσης να παραλείψετε τμήματα, που δεν περιέχουν μουσική, σε μουσικά βίντεο.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Ιστοσελίδα",
|
||||
@@ -72,12 +254,75 @@
|
||||
"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."
|
||||
},
|
||||
"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": "Σίγαση"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Παράλειψη {0};"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Παράλειψη προς το σημείο «{0}»;",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "Παραλείφθηκε «{0}»",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"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": "λεπτό"
|
||||
},
|
||||
@@ -90,20 +335,119 @@
|
||||
"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": "Εισαγωγή/Εξαγωγή της Ταυτότητας Χρήστη σας"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Ορισμός Ταυτότητας Χρήστη"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Προσοχή: Η αλλαγή της Ταυτότητας Χρήστη είναι μόνιμη. Είστε βέβαιοι ότι θέλετε να το κάνετε; Βεβαιωθείτε ότι έχετε δημιουργήσει αντίγραφο ασφαλείας του παλιού σας για παν ενδεχόμενο."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Δημιουργήθηκε από"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Υποστήριξη 3των ιστοσελίδων τύπου YouTube"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Υποστήριξη 3των πελατών διακομιστή YouTube. Για να ενεργοποιήσετε την υποστήριξη πρέπει να αποδεχτείτε επιπλέον άδειες. Αυτό ΔΕ λειτουργεί σε καρτέλες ανώνυμης περιήγησης του Chrome ή άλλων Chromium εκδοχών.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Υποστηριζόμενες Ιστοσελίδες: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Ενεργοποίηση υποστήριξης «Invidious», απενεργοποίηση αυτόματης παράληψης, απόκρυψη κουμπιών και άλλα."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Προσθήκη 3ου πελάτη συνεδρίας"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Προσθέστε μια προσαρμοσμένη συνεδρία. Αυτό πρέπει να είναι μορφοποιημένο MONO με την διεύθυνση. Για παράδειγμα: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Προσθήκη"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Μη έγκυρη διεύθυνση. Θα πρέπει να περιλαμβάνεται ΜΟΝΟ αυτό το μέρος της διεύθυνσης.\nΓια παράδειγμα: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Επαναφορά Λίστας «Invidious»"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Πρόκειται να επαναφέρετε τη λίστα «Invidious»"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Τρέχουσες Συνεδρίες:"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Ελάχιστη διάρκεια (σε δευτερόλεπτα):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Τμήματα μικρότερα από την καθορισμένη τιμή δε θα παραλείπονται ή δε θα εμφανίζονται στην οθόνη αναπαραγωγής."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Διάρκεια ειδοποίησης παράλειψης (σε δευτερόλεπτα):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Η ειδοποίηση παράλειψης θα παραμείνει στην οθόνη για τουλάχιστον τόσα δευτερόλεπτα. Στη μη αυτόματη παράκαμψη, μπορεί να είναι ορατή για μεγαλύτερο χρονικό διάστημα."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Η ακόλουθη υποβολή είναι μικρότερη από την επιλεγμένη ελάχιστη διάρκεια. Αυτό θα μπορούσε να σημαίνει ότι αυτό το τμήμα έχει ήδη υποβληθεί, και απλά αγνοείται λόγω αυτής της επιλογής. Είστε σίγουροι ότι θα θέλατε να το υποβάλετε;"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Εμφάνιση κουμπιού υποβολής"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Διεύθυνση Διακομιστή SponsorBlock"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "Η διεύθυνση που χρησιμοποιείται για την επικοινωνία με τον διακομιστή του SponsorBlock. Εάν δε διαθέτετε το δικό σας διακομιστή, αυτή η επιλογή δεν πρέπει να αλλάξει."
|
||||
},
|
||||
"save": {
|
||||
"message": "Αποθήκευση"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Επαναφορά"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Η διεύθυνση δεν έχει τη σωστή μορφή. Παρακαλώ ελέγξτε ότι έχετε http:// ή https:// στην αρχή της χωρίς κάθετους στο τέλος."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Είστε σίγουροι ότι θέλετε να το επαναφέρετε;"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "Το m.youtube.com υποστηρίζεται πλέον"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Εισαγωγή/Εξαγωγή όλων των ρυθμίσεων"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Αυτές είναι όλες σας οι ρυθμίσεις σε αρχείο JSON. Αυτό περιλαμβάνει και την Ταυτότητα Χρήστη, οπότε μοιραστείτε το με προσοχή."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Ορισμός Επιλογών"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "Προσοχή: Η αλλαγή των επιλογών είναι μόνιμη και μπορεί να χαλάσει την εγκατάσταση σας. Είσαστε σίγουροι ότι θέλετε να προχωρήσετε; Σιγουρευτείτε ότι έχετε δημιουργήσει αντίγραφο ασφαλείας για καλό και για κακό."
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "Αυτό το JSON δεν έχει μορφοποιηθεί σωστά. Οι ρυθμίσεις σας δεν έχουν αλλάξει."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Υποβολή Κατηγορίας"
|
||||
"message": "Υποβολή Τμήματος"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Υποβολή"
|
||||
@@ -117,22 +461,125 @@
|
||||
"preview": {
|
||||
"message": "Προεπισκόπηση"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "Μη Υποβληθέντα"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Επιθεώρηση"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Επεξεργασία"
|
||||
},
|
||||
"copyDebugInformation": {
|
||||
"message": "Αντιγραφή πληροφοριών αντιμετώπισης προβλημάτων στο πρόχειρο"
|
||||
},
|
||||
"copyDebugInformationFailed": {
|
||||
"message": "Αδυναμία εγγραφής στο πρόχειρο"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Αντιγράφει πληροφορίες αντιμετώπισης προβλημάτων στο πρόχειρο, ώστε να μπορέσετε να τις στείλετε στον προγραμματιστή όταν αναφέρετε κάποιο σφάλμα / όταν ο προγραμματιστής σας το ζητήσει. Ευαίσθητες πληροφορίες όπως η ταυτότητα χρήστη σας, η λίστα αποδοχής καναλιών και η προσαρμοσμένη διεύθυνση διακομιστή έχουν αφαιρεθεί. Αλλά περιέχει πληροφορίες για τον περιηγητή ιστού σας, τον τύπο δυσκευής, το λειτουργικό σύστημα, και τον αριθμό έκδοσης της επέκτασης. "
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Οι πληροφορίες εντοπισμού σφαλμάτων έχουν αντιγραφεί στο πρόχειρο. Μη διστάσετε να αφαιρέσετε οποιαδήποτε πληροφορία που προτιμάτε να μη μοιραστείτε. Αποθηκεύστε τες σε ένα αρχείο κειμένου ή επικολλήστε στην αναφορά σφάλματός σας."
|
||||
},
|
||||
"to": {
|
||||
"message": "έως",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Χορηγός"
|
||||
"message": "Χορηγία"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Προώθηση επί πληρωμή, παραπομπές επί πληρωμή και άμεσες διαφημίσεις. Όχι, για προσωπική προώθηση ή δωρεάν αναφορές σε δημιουργούς/ιστοσελίδες/προϊόντα που τους αρέσουν."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Αφιλοκέρδεια/Προσωπική Προώθηση"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Παρόμοιο με τη «χορηγία» αλλά για μη κερδοσκοπικό σκοπό ή για προσωπική προώθηση. Αυτό συμπεριλαμβάνει τμήματα από εμπορεύματα, δωρεές, ή πληροφορίες σχετικές με το ποιους συνεργάστηκαν."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Υπενθύμιση Αλληλεπίδρασης (Εγγραφή)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Όταν υπάρχει μια σύντομη υπενθύμιση για να προσθέσετε το βίντεο στα βίντεο που σας αρέσουν, να εγγραφείτε ή να τους ακολουθήσετε στη μέση του περιεχομένου. Εάν διαρκεί για αρκετή ώρα, τότε αυτό περιλαμβάνεται στη κατηγορία «προσωπική προώθηση»."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Υπενθύμιση Αλληλεπίδρασης"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Παύση/Εισαγωγή με Animation"
|
||||
},
|
||||
"category_intro_description": {
|
||||
"message": "Ένα διάστημα χωρίς ουσιαστικό περιεχόμενο. Θα μπορούσε να είναι κάποια παύση, στατική εικόνα, επαναλαμβανόμενο animation. Δεν πρέπει να επιλέγεται για μεταβάσεις που περιέχουν πληροφορίες."
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Διάλειμμα"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Προτεινόμενα βίντεο καναλιών/Εύσημα"
|
||||
},
|
||||
"category_outro_description": {
|
||||
"message": "Όταν εμφανίζονται τα εύσημα ή τα προτεινόμενα βίντεο των καναλιών. Όχι, για επίλογους που περιέχουν πληροφορίες."
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Προεπισκόπηση/Αναθεώρηση"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"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": "Εμφάνιση στην μπάρα χρόνου"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Αυτόματη παράλειψη όλων των τμημάτων όταν είναι «Χωρίς μουσική»"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Χρώμα Μη Υποβληθέντων",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Χρώμα Μπάρας Χρόνου"
|
||||
},
|
||||
"category": {
|
||||
"message": "Κατηγορία"
|
||||
},
|
||||
@@ -146,8 +593,11 @@
|
||||
"whatEnableTestingServer": {
|
||||
"message": "Οι υποβολές και οι ψήφοι ΔΕΝ ΘΑ ΜΕΤΡΗΣΟΥΝ προς τον κεντρικό διακομιστή. Χρησιμοποίησέ το μόνο για δοκιμή."
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Όλες οι υποβολές και οι ψήφοι ΔΕΝ ΘΑ ΜΕΤΡΙΣΟΥΝ στον κύριο διακομιστή κατά τη σύνδεση με τον δοκιμαστικό διακομιστή. Σιγουρευτείτε για να την απενεργοποιήσετε όταν θέλετε να κάνετε πραγματικές υποβολές."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(τώρα)"
|
||||
"message": "(εδώ)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Περισσότερες κατηγορίες"
|
||||
@@ -155,6 +605,59 @@
|
||||
"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."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Πρέπει να επιλέξετε Κατηγορία για όλα τα τμήματα που υποβάλετε!"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(τέλος)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "κρυφό: αρνητική ψήφος"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "κρυφό: πολύ κοντό"
|
||||
},
|
||||
"channelDataNotFound": {
|
||||
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
|
||||
"message": "Η ταυτότητα καναλιού δεν έχει φορτώσει ακόμα. Εάν χρησιμοποιείτε ενσωματωμένο βίντεο, δοκιμάστε αντιθέτως να το ανοίξετε στο YouTube. Μπορεί επίσης να ευθύνονται αλλαγές στη διάταξη του YouTube, εάν το πιστεύετε, γράψτε ένα σχόλιο εδώ:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Φαίνεται ότι κάτι εμποδίζει το SponsorBlock να ανακτήσει δεδομένα βίντεο. Παρακαλώ δείτε αυτό https://github.com/ajayyy/SponsorBlock/issues/741 για περισσότερες πληροφορίες."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Φαίνεται ότι το SponsorBlock δεν μπορεί να επικοινωνήσει με το YouTube API. Για να το διορθώσετε αυτό, αποδεχτείτε την προτροπή άδειας, που θα εμφανιστεί στη συνέχεια, περιμένετε μερικά δευτερόλεπτα και στη συνέχεια ανανεώστε τη σελίδα."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Αποδεχτείτε την άδεια"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Επιτυχείς αίτηση της άδειας!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Η αίτηση της άδειας απέτυχε, πατήσατε απόρριψη;"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Εάν δεν μπορείτε να το επιδιορθώσετε, απενεργοποιείστε την επιλογή «Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη», καθώς το SponsorBlock δεν μπόρεσε να ανακτήσει τις πληροφορίες του καναλιού αυτού του βίντεο"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Από προεπιλογή, παραλείπονται τμήματα αμέσως πριν ακόμα ανοιχνευτεί ποιό κανάλι είναι. Από προεπιλογή, ορισμένα τμήματα στην αρχή του βίντεο μπορεί να παραλείπονται στα επιτρεπόμενα κανάλια που είναι στην «Λίστα αποδοχής». Η ενεργοποίηση αυτής της επιλογής θα το αποτρέψει αυτό, αλλά μετά η παράλειψη όλων των τμημάτων θα έχει μια μικρή καθυστέρηση, καθώς η απόκτυση της ταυτότητας καναλιού μπορεί να πάρει κάμποσο χρόνο. Αυτή η καθυστέρηση μπορεί να είναι μη αντιληπτή αν έχετε γρήγορη σύνδεση στο διαδίκτυο."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Σκεφτείτε να ενεργοποιήσετε τη ρύθμιση «Εξαναγκασμός Ελέγχου Καναλιού πριν την παράλειψη»"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Λάθος Συγχρονισμός"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Αυτό το βίντεο έχει κατηγοριοποιηθεί ως μουσική. Είσαστε σίγουροι ότι έχει χορηγία; Εάν είναι ένα τμήμα «Χωρίς μουσική», ανοίξτε τις επιλογές της επέκτασης και ενεργοποιήστε αυτήν την κατηγορία. Μετά μπορείτε, να υποβάλετε αυτό το τμήμα ως «Χωρίς μουσική», αντί για χορηγία. Παρακαλώ διαβάστε τις οδηγίες, εάν είστε μπερδεμένοι."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Πολλαπλά Τμήματα"
|
||||
},
|
||||
@@ -170,5 +673,47 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Άνοιξε τις επιλογές για την παράλειψη τίτλων αρχής-τέλους, πωλήσεων κ. α."
|
||||
},
|
||||
"help": {
|
||||
"message": "Βοήθεια"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Το' χω",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Αποχή από μελλοντικά πειράματα",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Απόκρυψη για πάντα"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Η ψήφος απορρίφθηκε λόγο μιας προειδοποίησης. Πατήστε για να ανοίξετε μια συνομιλία ώστε να το διορθώσετε, ή επιστρέψτε όταν έχετε περισσότερο χρόνο.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Δωρεά"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Απόκρυψη Συνδέσμου Δωρεάς"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Ευχαριστούμε που εγκαταστήσατε το SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Παρακαλώ ελέγξτε τις παρακάτω ρυθμίσεις"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Πολλές δυνατότητες είναι ανενεργές από προεπιλογή. Εάν θέλετε να παραλείπετε εισαγωγές, επίλογους, χρήση «Invidious», κτλ., ενεργοποιήστε τα παρακάτω. Μπορείτε επίσης να κρύψετε/εμφανίσετε στοιχεία της διεπαφής."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Πως λειτουργεί η παράλειψη"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Τα τμήματα βίντεο θα παραλειφθούν αυτόματα αν βρεθούν στη βάση δεδομένων. Μπορείτε να ανοίξετε το αναδυόμενο παράθυρο κάνοντας κλικ στο εικονίδιο της επέκτασης για να πάρετε μια ιδέα του τι είναι."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Κάθε φορά που παραλείπετε κάποιο τμήμα, θα λαμβάνετε ειδοποίηση. Εάν ο συγχρονισμός σας φαίνεται λάθος, ψηφίστε αρνητικά πατώντας το εικονίδιο! Μπορείτε επίσης να ψηφίσετε μέσω του αναδυόμενου παράθυρου."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Enable Skip Count Tracking In Private/Incognito tabs"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Store segment downvotes"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Any segments you downvote will remain hidden even after refreshing"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Warning: Disabling this will delete all previously stored downvotes"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Query By Hash Prefix"
|
||||
},
|
||||
@@ -243,7 +252,7 @@
|
||||
"message": "All Faded Skip Notices"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock lets you skip over sponsors, intros, outros, subscription reminders, and other annoying parts of YouTube videos. SponsorBlock is a crowdsourced browser extension that let's anyone submit the start and end time's of sponsored segments and other segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. You can also skip over non music sections of music videos.",
|
||||
"message": "SponsorBlock lets you skip over sponsors, intros, outros, subscription reminders, and other annoying parts of YouTube videos. SponsorBlock is a crowdsourced browser extension that lets anyone submit the start and end times of sponsored segments and other segments of YouTube videos. Once one person submits this information, everyone else with this extension will skip right over the sponsored segment. You can also skip over non music sections of music videos.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Set key for skipping a segment"
|
||||
"message": "Skip segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Set key for start/stop segment keybind"
|
||||
"message": "Start/stop segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Set key for submission keybind"
|
||||
"message": "Submit segments",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Select a key by typing it"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "The keybind has been set to: "
|
||||
"message": "Select a key by typing it and choose any modifier keys you wish to use."
|
||||
},
|
||||
"0": {
|
||||
"message": "Connection Timeout. Check your internet connection. If your internet is working, the server is probably overloaded or down."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "You've skipped "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "You have saved yourself "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minute"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "hours"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "You've saved people"
|
||||
"message": "You've saved people",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " of their lives"
|
||||
"message": " of their lives",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Check status.sponsor.ajay.app for server status."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Created By"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". It is currently set to:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Support 3rd Party YouTube-Sites"
|
||||
},
|
||||
@@ -435,13 +440,13 @@
|
||||
"message": "Skip notice duration (seconds):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "The skip notice will stay on screen for at least this long. For manual skipping, it may be visible for longer."
|
||||
"message": "The skip notice will stay on screen for at least this many seconds. For manual skipping, it may be visible for longer."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "The following submission is shorter than your minimum duration option. This could mean that this is already submitted, and just being ignored due to this option. Are you sure you would like to submit?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Submitting on an active livesteam or premiere is not allowed. Please wait until it finishes, then refresh the page and verify that the segments are still valid."
|
||||
"message": "Submitting on an active livestream or premiere is not allowed. Please wait until it finishes, then refresh the page and verify that the segments are still valid."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Show Upload Button"
|
||||
@@ -470,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Import/Export All Options"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Edit/copy"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Save to file"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Load from file"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "This is your entire configuration in JSON. This includes your userID, so be sure to share this wisely."
|
||||
},
|
||||
@@ -518,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "The debug information has been copied to the clip board. Feel free to remove any information you would rather not share. Save this in a text file or paste into the bug report."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "The key"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "is bound to another action. Please select another key."
|
||||
"message": "This shortcut is bound to another action. Please select a different one."
|
||||
},
|
||||
"to": {
|
||||
"message": "to",
|
||||
@@ -581,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Filler Tangent"
|
||||
"message": "Filler Tangent/Jokes"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Tangential scenes added only for filler or humor that are not required to understand the main content of the video. This should not include segments providing context or background details."
|
||||
@@ -644,9 +655,6 @@
|
||||
"message": "Show an icon when a video is entirely an advertisement",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Your color is formatted incorrectly. It should be a 3 or 6 digit hex code with a number sign at the beginning."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Unsubmitted Color",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -698,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "hidden: too short"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "manually hidden"
|
||||
},
|
||||
"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": "Channel ID is not loaded yet. If you are using an embedded video, try using the YouTube homepage instead. This could also be caused by changes in the YouTube layout, if you think so, make a comment here:"
|
||||
@@ -784,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Donate"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Help fund development"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Hide Donation Link"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Dark Mode On Options Page"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Thanks for installing SponsorBlock."
|
||||
},
|
||||
@@ -875,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Behavior",
|
||||
"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": "Keyboard shortcuts",
|
||||
"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": "Backup/Restore",
|
||||
"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": "Miscellaneous",
|
||||
"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": "Skip notice appearance",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Unbind",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Not set"
|
||||
},
|
||||
"change": {
|
||||
"message": "Change"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "This is a built-in YouTube shortcut. Are you sure you want to use it?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Activar el seguimiento del número de saltos en las pestañas privadas/de incógnito"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Almacenar los votos negativos de los segmentos"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Los segmentos que votes negativamente permanecerán ocultos incluso después de actualizar la página"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Advertencia: Desactivar esto eliminará todos los votos negativos previamente almacenados"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Consulta Por Prefijo Hash"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Establecer tecla para omitir un segmento"
|
||||
"message": "Omitir segmento",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Establecer tecla para iniciar/detener un segmento"
|
||||
"message": "Iniciar/detener segmento",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Establecer tecla para el envío"
|
||||
"message": "Enviar segmentos",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Seleccione una tecla escribiéndola"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Ese atajo de teclas se ha establecido como: "
|
||||
"message": "Selecciona una tecla escribiéndola y elige las teclas modificadoras que desees utilizar."
|
||||
},
|
||||
"0": {
|
||||
"message": "Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Has saltado "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Te has ahorrado "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuto"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "horas"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Has salvado personas"
|
||||
"message": "Has salvado personas",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " de sus vidas"
|
||||
"message": " de sus vidas",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Comprueba status.sponsor.ajay.app para ver el estado del servidor."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Creado Por"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Actualmente está configurado para:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Soportar sitios de YouTube de terceros"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "El siguiente envío es más corto que su opción de duración mínima. Esto podría significar que esto ya se ha enviado y que simplemente se ha ignorado debido a esta opción. ¿Está seguro de que desea enviar?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "No se permite enviar en una transmisión en vivo activa o estreno. Espere hasta que finalice, luego actualice la página y verifique que los segmentos aún sean válidos."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Mostrar botón de subida"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importar/Exportar todas las opciones"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Editar/copiar"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Guardar en archivo"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Cargar desde archivo"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Esta es toda su configuración en JSON. Esto incluye tu ID de usuario, así que asegúrate de compartir esto sabiamente."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "La información de depuración ha sido copiada al portapapeles. Siéntase libre de eliminar cualquier información que prefiera no compartir. Guarde esto en un archivo de texto o péguelo en el informe de errores."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "La tecla"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "está enlazada a otra acción. Por favor, seleccione otra tecla."
|
||||
"message": "Este atajo está vinculado a otra acción. Por favor, selecciona uno diferente."
|
||||
},
|
||||
"to": {
|
||||
"message": "a",
|
||||
@@ -537,6 +551,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Acceso Exclusivo"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Solo para etiquetar videos completos. Utilizado cuando un video exhibe un producto, servicio o ubicación al que han recibido acceso gratuito o subsidiado."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"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_interaction": {
|
||||
"message": "Recordatorio de interacción (subscribir)"
|
||||
},
|
||||
@@ -568,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Tangente de Relleno"
|
||||
"message": "Tangentes de Relleno/Chistes"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Escenas tangenciales añadidas solo para relleno o humor que no son necesarias para entender el contenido principal del video. Esto no debe incluir segmentos que proporcionen contexto o detalles de fondo."
|
||||
@@ -618,6 +642,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Mostrar en la barra de búsqueda"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Mostrar Etiqueta"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Omitir automáticamente todos los segmentos cuando hay un segmento sin música"
|
||||
},
|
||||
@@ -628,9 +655,6 @@
|
||||
"message": "Mostrar un icono cuando un video es enteramente un anuncio",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Su color está formateado incorrectamente. Debería ser un código hexadecimal de 3 o 6 dígitos con un signo numérico al principio."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Color No Enviado",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -682,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "oculto: demasiado corto"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "manualmente oculto"
|
||||
},
|
||||
"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": "El ID del canal no está cargado todavía. Si está usando un vídeo incrustado, intente usar la página de inicio de YouTube en su lugar. Esto también podría ser causado por cambios en el diseño de YouTube, si lo cree, haga un comentario aquí:"
|
||||
@@ -768,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Donar"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Ayuda a financiar el desarrollo"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ocular Enlace de Donación"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Modo Oscuro en la página de Opciones"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Gracias por instalar SponsorBlock."
|
||||
},
|
||||
@@ -859,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Comportamiento",
|
||||
"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": "Interfaz",
|
||||
"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": "Atajos 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": "Respaldar/Restaurar",
|
||||
"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": "Miscelánea",
|
||||
"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": "Apariencia del aviso de omisión",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Desvincular",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "No establecido"
|
||||
},
|
||||
"change": {
|
||||
"message": "Cambiar"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Este un atajo incorporado de YouTube. ¿Estás seguro de que quieres usarlo?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Luba vahelejätmiste arvu jälgimine privaatsetel/inkognito kaartidel"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Säilita segmentide vastuhääled"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Segmendid, millele annad vastuhääle, peidetakse ka pärast lehe uuesti laadimist"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Hoiatus: selle keelamine kustutab kõik varasemalt säilitatud vastuhääled"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Küsi räsi eesliite järgi"
|
||||
},
|
||||
@@ -263,19 +272,16 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Seadista segmendi vahelejätmise klahv"
|
||||
"message": "Jäta segment vahele",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Seadista segmendi alustamise/lõpetamise klahv"
|
||||
"message": "Alusta/lõpeta segmenti",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Seadista segmendi saatmise klahv"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Vali klahv, seda vajutades"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Otsetee on seatud: "
|
||||
"message": "Esita segmendid",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"0": {
|
||||
"message": "Ühenduse ajalõpp. Kontrolli oma võrguühendust. Kui internet töötab, on ilmselt server ülekoormatud või maas."
|
||||
@@ -349,9 +355,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Oled vahele jätnud "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Oled enda aega säästnud "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minut"
|
||||
},
|
||||
@@ -365,10 +368,12 @@
|
||||
"message": "tundi"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Oled inimestel säästnud"
|
||||
"message": "Oled inimestel säästnud",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " nende eludest"
|
||||
"message": " nende eludest",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Serveri oleku saamiseks vaata status.sponsor.ajay.app"
|
||||
@@ -388,9 +393,6 @@
|
||||
"createdBy": {
|
||||
"message": "Autor"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Hetkel on selleks määratud:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Toeta 3. osapoole YouTube-saite"
|
||||
},
|
||||
@@ -467,6 +469,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Impordi/ekspordi kõik valikud"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Muuda/kopeeri"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Salvesta faili"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Laadi failist"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "See on sinu kogu seadistus JSON-formaadis. Selle hulgas on ka UserID, seega jaga seda targalt."
|
||||
},
|
||||
@@ -515,12 +526,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Silumisinfo on lõikelauale kopeeritud. Võid sellelt vabalt eemaldada mistahes info, mida ei soovi jagada. Salvesta see tekstifaili või kleebi vearaportisse."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Klahv"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "on juba teisele tegevusele määratud. Palun vali teine klahv."
|
||||
},
|
||||
"to": {
|
||||
"message": "kuni",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -537,6 +542,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Eksklusiivne ligipääs"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Ainult tervete videote märkimiseks. Kasutatakse, kui video esitleb toodet, teenust või asukohta, millele isik on tasuta või toetusega ligipääsu saanud."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"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_interaction": {
|
||||
"message": "Tegutsemise meeldetuletus (kanali tellimine)"
|
||||
},
|
||||
@@ -568,7 +583,7 @@
|
||||
"message": "Kiire kokkuvõte eelmistest episoodidest või eelvaade videos hiljem tulevast. Mõeldud valmis töödeldud klippide, mitte suuliste kokkuvõtete jaoks."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Täitesisu"
|
||||
"message": "Täitesisu/naljad"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Video täiteks või huumori eesmärgil lisatud sisu, mis ei ole vajalik video põhieesmärgi mõistmiseks. Selle alla ei kuulu segmendid, mis annavad kontekstiteavet või taustainfot."
|
||||
@@ -618,6 +633,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Kuva mängija ajaribal"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Kuva silt"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Jäta automaatselt kõik segmendid vahele, kui eksisteerib mitte-muusika segment"
|
||||
},
|
||||
@@ -628,9 +646,6 @@
|
||||
"message": "Kuva ikoon, kui terve video on reklaam",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Sinu värv on sobimatult vormistatud. See peaks olema 3- või 6-numbriline 16-kümmendsüsteemis kood, arvu ees trellid."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Saatmata värv",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -682,6 +697,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "peidetud: liiga lühike"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "käsitsi peidetud"
|
||||
},
|
||||
"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": "Kanali ID pole veel laaditud. Kui vaatad manustatud videot, proovi seda vaadata YouTube'i kodulehelt. See võib olla põhjustatud ka YouTube'i paigutuse muudatustest - kui arvad et see nii on, kommenteeri siin:"
|
||||
@@ -745,6 +763,9 @@
|
||||
"message": "Sain aru",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "See terve video on selle kategooriaga sildistatud ning on liiga tihedalt integreeritud, et eraldada saaks"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Keeldu kõigist tulevikus tehtavatatest eksperimentidest",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
@@ -762,9 +783,15 @@
|
||||
"Donate": {
|
||||
"message": "Anneta"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Aita arendust toetada"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Peida annetuste link"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Tume režiim valikute lehel"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Täname SponsorBlocki paigaldamise eest."
|
||||
},
|
||||
@@ -775,7 +802,7 @@
|
||||
"message": "Kuidas vahelejätmine töötab"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Segmentide saatmine"
|
||||
"message": "Saatmine"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Redigeerimine"
|
||||
@@ -829,5 +856,39 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "t",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Käitumine",
|
||||
"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": "Liides",
|
||||
"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": "Klaviatuuriotseteed",
|
||||
"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": "Varunda/taasta",
|
||||
"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": "Varia",
|
||||
"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": "Vahelejätmise teavituse välimus",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Tühista määrang",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Määramata"
|
||||
},
|
||||
"change": {
|
||||
"message": "Muuda"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,11 +3,15 @@
|
||||
"message": "اسپانسربلاک برای یوتیوب - اسپانسر ها را رد کنید",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "بخش های اسپانسر شده، درخواست ساب اسکرایب و خیلی چیز های دیگر در ویدیو های یوتیوب را رد کنید. قسمت های اسپانسری ویدیو هایی که میبینید را گزارش کنید تا در وقت دیگران صرفه جویی شود.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "سرور گفت که این درخواست نامعتبر است"
|
||||
},
|
||||
"429": {
|
||||
"message": "شما برای این یک ویدیو تعداد بیش از حدی زمان اسپانسر ثبت کردهاید، آیا مطمئن هستید که به این تعداد وجود دارد؟"
|
||||
"message": "شما برای این ویدیو قسمت های اسپانسری خیلی زیادی ثبت کرده اید، آیا مطمئنید که به این تعداد وجوددارد؟"
|
||||
},
|
||||
"409": {
|
||||
"message": "این قبلاً ثبت شده است"
|
||||
@@ -127,7 +131,7 @@
|
||||
"message": "شما دیگران را نجات دادید از "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "لیست سرنشینان"
|
||||
"message": "نفرات برتر"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "ثبت"
|
||||
@@ -144,6 +148,9 @@
|
||||
"setUsername": {
|
||||
"message": "تنظیم نام کاربری"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "به سرور رسمی دیسکورد بپیوندید تا پیشنهادات و بازخوردهای خود را ارائه دهید!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "مخفیسازی"
|
||||
},
|
||||
@@ -156,6 +163,9 @@
|
||||
"hideButtons": {
|
||||
"message": "مخفیسازی کلید ها در پخشکننده یوتیوب"
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "نمایش مجدد اطلاعیه"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "افزونه اسپانسر بلاک به شما امکان رد کردن بخشهای تبلیغاتی (اسپانسر شده)، قسمتهای شروع و پایان ویدیو، درخواست ساباسکرایب و سایر قسمتهای آزار دهنده یوتیوب را میدهد. اسپانسر بلاک یک افزونه مرورگر است که به هر کسی امکان ثبت زمان شروع و پایان بخش های اسپانسر شده و سایر بخش های ویدیو های یوتیوب را میدهد. پس از اینکه هر کاربر این اطلاعات را ثبت کرده و گزارش دهد، بقیه کاربرانی که از این افزونه استفاده میکنند مستقیماً بخش اسپانسر شده ویدیو را رد خواهند کرد. شما همچنین میتوانید در ویدیو های نماهنگ (موزیک ویدیو)، قسمتهای غیر موسیقی ویدیو را رد کنید.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -194,6 +204,20 @@
|
||||
"mute": {
|
||||
"message": "بیصدا"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "{0} رد شود؟"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "{0} بیصدا شود؟"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} رد شد",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} بیصدا شد",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"minLower": {
|
||||
"message": "دقیقه"
|
||||
},
|
||||
@@ -203,6 +227,9 @@
|
||||
"createdBy": {
|
||||
"message": "ایجاد شده توسط"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "وبسایتهای پشتیبانی شده: "
|
||||
},
|
||||
"add": {
|
||||
"message": "افزودن"
|
||||
},
|
||||
@@ -221,6 +248,9 @@
|
||||
"setOptions": {
|
||||
"message": "تنظیم گزینهها"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "ثبت بخش"
|
||||
},
|
||||
"submit": {
|
||||
"message": "ثبت"
|
||||
},
|
||||
@@ -249,6 +279,12 @@
|
||||
"category_sponsor": {
|
||||
"message": "اسپانسر"
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "دسترسی اختصاصی"
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "پر کننده"
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "غیر موسیقی"
|
||||
},
|
||||
@@ -261,12 +297,43 @@
|
||||
"manualSkip": {
|
||||
"message": "ردکردن دستی"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "نمایش در نوار پیشرفت"
|
||||
},
|
||||
"disable": {
|
||||
"message": "غیرفعال کردن"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "نمایش در نوار پیشرفت"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "نمایش نام"
|
||||
},
|
||||
"category": {
|
||||
"message": "دسته بندی"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(اکنون)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "نمایش دستهبندیها"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(پایان)"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "تأیید دسترسی"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "تغییر دسته بندی"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "دستورالعملها"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "دستورالعملها را بخوانید!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"help": {
|
||||
"message": "راهنما"
|
||||
},
|
||||
@@ -274,7 +341,61 @@
|
||||
"message": "فهمیدم",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "مخفیسازی برای همیشه"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "شما یک اخطار دریافت کرده اید و موقتاً نمیتوانید بخشی را ثبت کنید. این یعنی ما متوجه شدیم که شما یک سری اشتباهات متداول داشتید اما قصد و نیت خرابکاری نداشتید، لطفاً فقط تایید کنید که شما از قوانین آگاهی دارید و سپس ما این اخطار را حذف خواهیم کرد. شما میتوانید به کمک discord.gg/SponsorBlock یا matrix.to/#/#sponsor:ajay.app عضو گروه ما بشوید."
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "رای شما رد شد چون شما یک اخطار دارید. برای حل این مشکل یک کلیک کنید تا گروه چت ما باز بشود، یا اینکه بعداً هر موقع وقت داشتید این کار را انجام بدهید.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "کمک مالی"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "پنهان کردن لینک کمک مالی"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "ازینکه افزونه SponserBlock را نصب کردید سپاسگزاریم."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "لطفاً تنظیمات زیر را بررسی کنید"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "چگونه ردکردن کار میکند"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "ثبت نمودن"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "ویرایش"
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "آیا میتوان یک کپی از پایگاه داده را دریافت کرد؟ اگر شما یک روز ناپدید شدید چه میشود؟"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "پایگاه داده بهصورت عمومی در دسترس است در"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "سورس کد بهصورت رایگان ارائه شده است. بنابراین، اگر اتفاقی برای من بیفتد، ارسالات شما از بین نمیروند."
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "از کجا سورس کد را بگیرم؟"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "سازندگان"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "بیشتر بدانید"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "روز",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "ساعت",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
"message": "Kanava lisätty valkolistalle!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmentti"
|
||||
"message": "osio"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "segmentit"
|
||||
"message": "osiot"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Äänestä tätä lähetystä"
|
||||
"message": "Äänestä lähetystä"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Ilmoita"
|
||||
@@ -44,7 +44,7 @@
|
||||
"message": "Älä näytä koskaan"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Paina 'älä ohita' mennäksesi takaisin kohtaan jossa olit."
|
||||
"message": "Paina 'älä ohita' palatakasesi kohtaan, jossa olit."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Älä ohita"
|
||||
@@ -71,25 +71,25 @@
|
||||
"message": "Sponsorointiaikoja lähetettäessä tapahtui virhe, yritä myöhemmin uudelleen."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Tällä videolla on segmenttejä tietokannassa!"
|
||||
"message": "Tällä videolla on osioita tietokannassa!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Segmenttejä ei löytynyt"
|
||||
"message": "Osioita ei löytynyt"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Segmentti alkaa nyt"
|
||||
"message": "Osio alkaa nyt"
|
||||
},
|
||||
"sponsorEnd": {
|
||||
"message": "Segmentti päättyy nyt"
|
||||
"message": "Osio päättyy nyt"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Peruuta segmentin luominen"
|
||||
"message": "Peruuta osion luominen"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube-videota ei löytynyt.\nJos tämä on väärässä, päivitä välilehti."
|
||||
"message": "YouTube-videota ei löytynyt.\nJos tämä ei pidä paikkaansa, päivitä välilehti."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Päivitä segmentit"
|
||||
"message": "Päivitä osiot"
|
||||
},
|
||||
"success": {
|
||||
"message": "Onnistui!"
|
||||
@@ -104,7 +104,7 @@
|
||||
"message": "Yhteysvirhe on tapahtunut. Virhekoodi: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Tyhjennä segmentit"
|
||||
"message": "Tyhjennä osiot"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Avaa SponsorBlock-ponnahdusikkuna"
|
||||
@@ -113,19 +113,19 @@
|
||||
"message": "Sulje ponnahdusikkuna"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Lähetä segmentit"
|
||||
"message": "Lähetä osiot"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Haluatko varmasti lähettää tämän?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Laita kanava valkolistalle"
|
||||
"message": "Lisää kanava valkolistalle"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Poista kanava valkolistalta"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Äänestä segmenttiä"
|
||||
"message": "Äänestä osiota"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Lähetykset"
|
||||
@@ -140,11 +140,11 @@
|
||||
"message": "Lähetä"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Osien muokkaus ilmestyy sen jälkeen, kun klikkaat lähetä-painiketta",
|
||||
"message": "Osioiden muokkaus ilmestyy klikattuasi lähetä",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Vihje: Voit asettaa lähettämisen pikanäppäimet asetuksissa"
|
||||
"message": "Vihje: Voit määrittää lähetyksen pikanäppäimet asetuksista"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Tyhjennä ajat"
|
||||
@@ -165,7 +165,7 @@
|
||||
"message": "Kopio julkinen UserID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Liity mukaan viralliselle Discord-palvelimelle, jotta voit antaa ehdotuksia ja palautetta!"
|
||||
"message": "Liity viralliselle Discord-palvelimelle antaaksesi ehdotuksia ja palautetta!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Piilota tämä"
|
||||
@@ -177,7 +177,7 @@
|
||||
"message": "Näytä painikkeet YouTuben soittimessa"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Piilota painikkeet YouTuben soittimessa"
|
||||
"message": "Piilota painikkeet YouTuben soittimesta"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
|
||||
@@ -189,43 +189,52 @@
|
||||
"message": "Näytä info-painike YouTuben soittimessa"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Piilota info-painike YouTuben soittimessa"
|
||||
"message": "Piilota info-painike YouTuben soittimesta"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Piilota info-painike automaattisesti"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Piilota poista-painike YouTuben soittimessa"
|
||||
"message": "Piilota poista-painike YouTuben soittimesta"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Näytä poista-painike YouTuben soittimessa"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Ota ohitusten lukumäärän seuranta käyttöön"
|
||||
"message": "Käytä ohitusten lukumäärän seurantaa"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Tämä toiminto seuraa, mitä segmenttejä olet ohittanut. Sen avulla käyttäjät saavat tietää, kuinka paljon heidän lähetyksensä ovat auttaneet muita, ja sitä käytetään myös mittarina äänestysten kanssa estääksemme spämmin pääsyn tietokantaan. Laajennus lähettää viestin palvelimelle aina, kun ohitat segmentin. Toivottavasti useimmat eivät muuta tätä asetusta, jotta katselunumerot pysyisivät tarkkoina. :)"
|
||||
"message": "Tämä toiminto seuraa, mitä osioita olet ohittanut. Sen avulla käyttäjät saavat tietää, kuinka paljon heidän lähetyksensä ovat auttaneet muita, ja sitä käytetään myös mittarina äänestysten kanssa estääksemme spämmin pääsyn tietokantaan. Laajennus lähettää viestin palvelimelle aina kun ohitat osion. Toivottavasti useimmat eivät muuta tätä asetusta, jotta katselunumerot pysyisivät tarkkoina. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Ota ohitusten lukumäärän seuranta käyttöön yksityis-/incognito-välilehdissä"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Säilytä osion negatiiviset äänet"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Negatiivisesti äänestämäsi osiot pysyvät piilotettuina myös päivityksen jälkeen"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Varoitus: Tämän käytöstä poisto poistaa kaikki negatiiviset äänet"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Kysely tiiviste-etuliittellä"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Sen sijaan, että videoID:tä käyttäen pyydettäisiin segmenttejä palvelimelta, videoID:n tiivisteen 4 ensimmäistä merkkiä lähetetään. Tämä palvelin lähettää takaisin dataa kaikista videoista, joilla on samankaltaiset tiivisteet."
|
||||
"message": "Sen sijaan, että videoID:tä käyttäen pyydettäisiin osioita palvelimelta, videoID:n tiivisteen 4 ensimmäistä merkkiä lähetetään. Palvelin lähettää takaisin dataa kaikista videoista, joilla on samankaltaiset tiivisteet."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Hae segmentit uudelleen uusissa videoissa"
|
||||
"message": "Hae osiot uudelleen uusissa videoissa"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Jos video on uusi, eikä segmenttejä löydy, niitä haetaan uudelleen muutaman minuutin välein katsoessasi."
|
||||
"message": "Jos video on uusi, eikä osioita löydy, niitä haetaan uudelleen muutaman minuutin välein katsoessasi."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Näytä ilmoitus uudelleen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Näytä ilmoitus ohitetun segmentin jälkeen"
|
||||
"message": "Näytä ilmoitus ohitetun osion jälkeen"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Täysikokoiset ohitusilmoitukset"
|
||||
@@ -243,7 +252,7 @@
|
||||
"message": "Kaikki haalistuneet ohitusilmoitukset"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on joukkoistettu selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden segmenttien aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun segmentin. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
|
||||
"message": "SponsorBlockin avulla voit ohittaa sponsorit, introt, outrot, tilausmuistutukset ja muut ärsyttävät osat YouTube-videoissa. SponsorBlock on käyttäjälähteinen selainlaajennus, jonka avulla kuka tahansa voi lähettää Youtube-videoiden sponsoroitujen ja muiden osioiden aloitus- ja päättymisajat. Kun yksi henkilö on lähettänyt tämän tiedon, kaikki muut, joilla on tämä laajennus, ohittavat sponsoroidun osion. Voit myös ohittaa musiikkivideoiden musiikittomat osat.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Aseta näppäin segmentin ohittamista varten"
|
||||
"message": "Ohita osio",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Aseta pikanäppäin segmentin aloittamiseen/lopettamiseen"
|
||||
"message": "Aloita/lopeta osio",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Aseta pikanäppäin tietojen lähetykseen"
|
||||
"message": "Lähetä osiot",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Valitse näppäin painamalla sitä"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Pikanäppäin on asetettu näppäimeen: "
|
||||
"message": "Valitse näppäin painamalla sitä ja valitse haluamasi vaihtonäppäin."
|
||||
},
|
||||
"0": {
|
||||
"message": "Yhteyden aikakatkaisu. Tarkista internet-yhteytesi. Jos internetyhteytesi toimii, palvelin on todennäköisesti ylikuormittunut tai alhaalla."
|
||||
@@ -338,20 +347,17 @@
|
||||
"message": "Ääni-ilmoitus ohitettaessa"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Ääni-ilmoitus ohittaessa toistaa äänen kun segmentti ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta."
|
||||
"message": "Ääni-ilmoitus ohittaessa toistaa äänen kun osio ohitetaan. Jos asetus on pois päältä (tai automaattinen ohitus on pois käytöstä), ääntä ei soiteta."
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "Näytä kesto ilman ohitettuja osioita"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Tämä aika näkyy sulkeissa nykyisen ajan vieressä liukusäätimen alapuolella. Se näyttää videon koko pituuden ilman segmenttejä. Se sisältää vain segmentit, jotka on merkitty \"Näytä liukusäätimessä\"."
|
||||
"message": "Tämä aika näkyy sulkeissa nykyisen ajan vieressä liukusäätimen alapuolella. Se näyttää videon koko pituuden ilman osioita. Se sisältää vain osiot, jotka on merkitty \"Näytä liukusäätimessä\"."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Olet ohittanut "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Olet säästänyt itseltäsi "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuutin"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "tuntia"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Olet säästänyt ihmisiltä"
|
||||
"message": "Olet säästänyt ihmisiltä",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " heidän elämistään"
|
||||
"message": " heidän elämistään",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Tarkista palvelimen tila osoitteessa status.sponsor.ajay.app."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Luonut"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Tällä hetkellä se on asetettu näppäimeen:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Tue kolmansien osapuolien YouTube-sivustoja"
|
||||
},
|
||||
@@ -429,7 +434,7 @@
|
||||
"message": "Vähimmäiskesto (sekuntia):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Segmenttejä jotka ovat asetettua arvoa lyhyempiä ei ohiteta tai näytetä soittimessa."
|
||||
"message": "Osioita jotka ovat asetettua arvoa lyhyempiä ei ohiteta tai näytetä soittimessa."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Ohitusilmoituksen kesto (sekuntia):"
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Seuraava lähetys on lyhyempi kuin vähimmäiskeston asetuksesi. Tämä voi tarkoittaa sitä, että tämä on jo lähetetty, ja sitä ei vain oteta huomioon tämän asetuksen vuoksi. Oletko varma, että haluat lähettää?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Aktiivisen livestriimin tai ensiesityksen aikana lähettäminen ei ole sallittua. Odota kunnes se loppuu, sitten päivitä sivu ja varmista, että osiot ovat yhä oikein."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Näytä lähetä-painike"
|
||||
},
|
||||
@@ -453,7 +461,7 @@
|
||||
"message": "Tallenna"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Nollaa"
|
||||
"message": "Palauta"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "Tämä osoite ei ole oikeassa muodossa. Varmista, että sinulla on http:// tai https:// alussa eikä perässä kauttaviivoja."
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Vie/tuo kaikki asetukset"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Muokkaa/kopioi"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Tallenna tiedostoon"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Lataa tiedostosta"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Tämä on koko konfiguraatiosi JSON-tiedostona. Tämä sisältää userID:si, joten jaa sitä viisaasti."
|
||||
},
|
||||
@@ -480,7 +497,7 @@
|
||||
"message": "Tämä JSON ei ole muotoiltu oikein. Asetuksiasi ei ole muutettu."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Lähetä segmentti"
|
||||
"message": "Lähetä osio"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Lähetä"
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Virheenkorjaustiedot on kopioitu leikepöydälle. Voit poistaa mitä tahansa tietoa mitä et mielummin jakaisi. Tallenna tämä tekstitiedostoon tai liitä se virheraporttiin."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Näppäin"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "on jo liitetty toiseen toimintoon. Valitse toinen näppäin."
|
||||
"message": "Pikänäppäin on jo liitetty toiselle toiminnolle. Valitse eri näppäin."
|
||||
},
|
||||
"to": {
|
||||
"message": "-",
|
||||
@@ -537,6 +551,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Yksinoikeudellinen ensikatsaus"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Vain kokonaisten videoiden merkitsemiseen. Käytetään kun videossa esitellään tuote, palvelu tai sijainti, johon he ovat saaneet ilmaisen tai tuetun käyttöoikeuden."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"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_interaction": {
|
||||
"message": "Vuorovaikutusmuistutus (tilaaminen)"
|
||||
},
|
||||
@@ -568,10 +592,10 @@
|
||||
"message": "Nopea kertaus aiemmista jaksoista, tai esikatselu siitä, mitä on tulossa myöhemmin nykyisessä videossa. Tarkoitettu yhteen editoituja klippejä varten, ei puhutuille yhteenvedoille."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Epäolennainen täytesisältö"
|
||||
"message": "Epäolennainen täytesisältö/Vitsit"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Täytteeksi tai huumoriksi lisättyjä sekundaarisia kohtauksia, joita ei vaadita videon pääsisällön ymmärtämiseen. Tämän ei tulisi sisältää segmenttejä, jotka tarjoavat kontekstia tai taustatietoja."
|
||||
"message": "Täytteeksi tai huumoriksi lisättyjä toissijaisia kohtauksia, joita videon pääsisällön ymmärrys ei edellytä. Tämän ei tulisi sisältää aiheeseen liittyviä tai taustatietoja tarjoavia osioita."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Täytesisältö"
|
||||
@@ -618,19 +642,19 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Näytä liukusäätimessä"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Näytä merkki"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Ohita kaikki segmentit automaattisesti, kun videossa on \"Musiikiton\" segmentti"
|
||||
"message": "Ohita kaikki osiot automaattisesti, kun videossa on \"Musiikiton\" osio"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Salli segmentit, jotka mykistävät äänen ohittamisen sijaan"
|
||||
"message": "Salli osiot, jotka mykistävät äänen ohittamisen sijaan"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "Näytä kuvake, kun video on kokonaan mainos",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Väriformaattisi on muotoiltu väärin. Sen pitäisi olla 3 tai 6 numeroinen hex-koodi, jossa on # alussa."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Lähettämättömien väri",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -646,7 +670,7 @@
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Ota betatestauspalvelin käyttöön"
|
||||
"message": "Käytä betatestauspalvelinta"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "Lähetyksiäsi ja ääniäsi EI LASKETA pääpalvelimella. Käytä tätä vain testaamiseen."
|
||||
@@ -664,14 +688,14 @@
|
||||
"message": "Valitse kategoria"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Lähettääksesi segmenttejä \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
|
||||
"message": "Lähettääksesi osioita \"{0}\" kategorialla, sinun täytyy aktivoida se asetuksista. Sinut uudelleenohjataan asetuksiin nyt.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Varoitus: Tämäntyyppisiä segmenttejä voi olla aktiivisena enintään yksi. Usean lähettäminen aiheuttaa sen, että satunnainen segmentti näytetään."
|
||||
"message": "Varoitus: Tämäntyyppisiä osioita voi olla aktiivisena enintään yksi. Usean lähettäminen aiheuttaa sen, että satunnainen osio näytetään."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Sinun täytyy valita kategoria kaikille segmenteille, joita olet lähettämässä!"
|
||||
"message": "Sinun täytyy valita kategoria kaikille osioille, joita olet lähettämässä!"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Loppu)"
|
||||
@@ -682,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "piilotettu: liian lyhyt"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "manuaalisesti piilotettu"
|
||||
},
|
||||
"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": "Kanavan ID ei ole vielä latautunut. Jos käytät upotettua videota, kokeile sen sijaan käyttää YouTuben kotisivua. Tämä voi myös johtua muutoksista YouTuben ulkoasussa. Jos luulet luulet niin, tee kommenti tänne:"
|
||||
@@ -708,7 +735,7 @@
|
||||
"message": "Pakota kanavan tarkistus ennen ohittamista"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Oletuksena segmentit ohitetaan heti ennen kuin kanava tiedetään. Oletuksena jotkut segmentit videon alussa saattavat tulla ohitetuiksi sallituilla kanavilla. Tämän vaihtoehdon ottaminen käyttöön estää sen, mutta kaikki ohitukset viivästyvät hieman, koska kanavatunnuksen saaminen voi kestää jonkin aikaa. Tämä viive saattaa olla huomaamaton, jos sinulla on nopea internetyhteys."
|
||||
"message": "Oletuksena osiot ohitetaan heti ennen kuin kanava tiedetään. Oletuksena, jotkut osiot videon alussa saattavat tulla ohitetuiksi sallituilla kanavilla. Tämän vaihtoehdon ottaminen käyttöön estää sen, mutta kaikki ohitukset viivästyvät hieman, koska kanavatunnuksen saaminen voi kestää jonkin aikaa. Tämä viive saattaa olla huomaamaton, jos sinulla on nopea internetyhteys."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Harkitse asetuksen \"Pakota kanavan tarkistus ennen ohittamista\" käyttöön ottaminen"
|
||||
@@ -720,10 +747,10 @@
|
||||
"message": "Vaihda kategoria"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton segmentti\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän segmentin oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi."
|
||||
"message": "Tämä video on luokiteltu musiikiksi. Oletko varma, että siinä on sponsori? Jos tämä on oikeasti \"Musiikiton osio\", avaa laajennuksen asetukset ja ota tämä kategoria käyttöön. Sitten voit lähettää tämän osion oikeassa kategoriassa. Lue säännöt, jos olet vielä hämilläsi."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Useita segmenttejä"
|
||||
"message": "Useita osioita"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Säännöt"
|
||||
@@ -746,10 +773,10 @@
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Tämä segmentti on suuri. Jos koko video koskee yhtä aihetta, vaihda \"Ohita\" valintaan \"Koko video\". Katso lisätietoja säännöistä."
|
||||
"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": "Tämä koko video on merkitty täksi kategoriaksi ja on liian tiiviisti integroitu jotta ne voitaisiin erottaa"
|
||||
"message": "Koko video on merkitty tällä luokituksella ja se on liian tiiviisti integroitu eroteltavaksi"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Jättäydy pois kaikista tulevista kokeiluista",
|
||||
@@ -759,7 +786,7 @@
|
||||
"message": "Piilota ikuisesti"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Sait varoituksen ja et voi lähettää segmenttejä väliaikaisesti. Tämä tarkoittaa, että huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahallisia, joten vahvistakaa, että ymmärrätte säännöt ja poistamme varoituksen. Voit myös liittyä tähän keskusteluun käyttäen discord.gg/SponsorBlock tai matrix.to/#/#sponsor:ajay.app"
|
||||
"message": "Sait varoituksen ja et voi lähettää osioita väliaikaisesti. Tämä tarkoittaa, että huomasimme, että teit joitakin yleisiä virheitä, jotka eivät ole tahallisia, joten vahvistakaa, että ymmärrätte säännöt ja poistamme varoituksen. Voit myös liittyä tähän keskusteluun käyttäen discord.gg/SponsorBlock tai matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Ääni hylättiin varoituksen takia. Klikkaa avataksesi chatin sen ratkaisemiseksi, tai tule takaisin myöhemmin kun sinulla on siihen aikaa.",
|
||||
@@ -768,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Lahjoita"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Auta rahoittamalla kehitystä"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Piilota lahjoituslinkki"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Tumma tila asetussivulla"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Kiitos, että asensit SponsorBlockin."
|
||||
},
|
||||
@@ -784,31 +817,31 @@
|
||||
"message": "Miten ohittaminen toimii"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Videosegmentit ohitetaan automaattisesti, jos ne löytyvät tietokannasta. Voit avata ponnahdusikkunan klikkaamalla laajennuksen kuvaketta saadaksesi esikatselun siitä, mitä ne ovat."
|
||||
"message": "Video-osiot ohitetaan automaattisesti, jos ne löytyvät tietokannasta. Voit avata ponnahdusikkunan klikkaamalla laajennuksen kuvaketta saadaksesi esikatselun siitä, mitä ne ovat."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Aina kun ohitat segmentin, saat ilmoituksen. Jos ajoitus näyttää väärältä, äänestä alaspäin klikkaamalla 👎! Voit myös äänestää ponnahdusikkunassa."
|
||||
"message": "Aina kun ohitat osion, saat ilmoituksen. Jos ajoitus näyttää väärältä, äänestä alaspäin klikkaamalla 👎! Voit myös äänestää ponnahdusikkunassa."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Lähettäminen"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Lähettäminen voidaan tehdä joko ponnahdusikkunassa painamalla \"Segmentti alkaa nyt\" -painiketta tai videosoittimessa olevilla painikkeilla."
|
||||
"message": "Lähettäminen voidaan tehdä joko ponnahdusikkunassa painamalla \"Osio alkaa nyt\" -painiketta, tai videosoittimessa olevilla painikkeilla."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Toistopainikkeen klikkaaminen osoittaa segmentin alun ja pysäytyskuvakkeen klikkaaminen sen lopun. Voit valmistella useita sponsoreita ennen kuin painat lähetä. Lähetä-painikkeen klikkaaminen lähettää segmentin. Roskakorin klikkaaminen poistaa."
|
||||
"message": "Toistopainikkeen klikkaaminen osoittaa osion alun ja pysäytyskuvakkeen klikkaaminen sen lopun. Voit valmistella useita sponsoreita ennen kuin painat lähetä. Lähetä-painikkeen klikkaaminen lähettää osion. Roskakorin klikkaaminen poistaa."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Muokkaus"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Jos jokin meni pieleen, voit muokata tai poistaa segmenttisi ylänuolipainikkeen klikkaamisen jälkeen."
|
||||
"message": "Jos jokin meni pieleen, voit muokata tai poistaa osiosi ylänuolipainikkeen klikkaamisen jälkeen."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Tämä on liian hidasta"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Voit käyttää pikanäppäimiä jos haluat. Paina puolipiste näppäintä merkitäksesi sponsori segmentin alun/lopun, ja paina heittomerkkiä lähettääksesi sen. Nämä voidaan vaihtaa asetuksista. Jos et käytä QWERTYä, sinun varmaan kannattaisi vaihtaa pikanäppäimet."
|
||||
"message": "Voit käyttää pikanäppäimiä jos haluat. Paina puolipiste näppäintä merkitäksesi sponsori osion alun/lopun, ja paina heittomerkkiä lähettääksesi sen. Nämä voidaan vaihtaa asetuksista. Jos et käytä QWERTYä, sinun varmaan kannattaisi vaihtaa pikanäppäimet."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Voinko saada kopion tietokannasta? Mitä tapahtuu, jos katoat?"
|
||||
@@ -844,7 +877,7 @@
|
||||
"message": "Jatka äänestystä"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Tämä vaikuttaa sinun segmentteihin välittömästi"
|
||||
"message": "Tämä vaikuttaa sinun osioihin välittömästi"
|
||||
},
|
||||
"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."
|
||||
@@ -859,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "t",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Käyttäytyminen",
|
||||
"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": "Käyttöliittymä",
|
||||
"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": "Pikanäppäimet",
|
||||
"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": "Varmuuskopioi/palauta",
|
||||
"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": "Sekalaiset",
|
||||
"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": "Ohitusilmoituksen ulkoasu",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Poista valinta",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Ei määritetty"
|
||||
},
|
||||
"change": {
|
||||
"message": "Vaihda"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Tämä on YouTuben sisäänrakennettu pikanäppäin. Haluatko varmasti käyttää sitä?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Activer le suivi du nombre de sauts dans les onglets privés/incognito"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Enregistrer les segments votés contre"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Tous les segments que vous votez contre vous resteront cachés même après rafraîchissement"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Attention : Désactiver ceci supprimera tous les votes contre précédemment enregistrés"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Requête par préfixe du hash"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Définir une touche pour passer un segment"
|
||||
"message": "Sauter le segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Définir le raccourci pour démarrer/terminer un segment"
|
||||
"message": "Commencer/arrêter le segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Changer le raccourci pour soumettre les segments"
|
||||
"message": "Soumettre les segments",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Appuyez sur une touche"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Le raccourci choisi est : "
|
||||
"message": "Sélectionnez une touche en la tapant et choisissez n'importe quelles touches de modification que vous souhaitez utiliser."
|
||||
},
|
||||
"0": {
|
||||
"message": "Délai de connexion dépassé. Vérifiez votre connexion internet. Si votre connexion internet fonctionne, le serveur est probablement surchargé ou hors service."
|
||||
@@ -302,6 +311,10 @@
|
||||
"mute": {
|
||||
"message": "Couper le son"
|
||||
},
|
||||
"full": {
|
||||
"message": "Toute la vidéo",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Passer {0} ?"
|
||||
},
|
||||
@@ -345,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Vous avez passé "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Vous vous êtes économisé "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minute"
|
||||
},
|
||||
@@ -361,10 +371,12 @@
|
||||
"message": "heures"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Vous avez fait économiser les utilisateurs"
|
||||
"message": "Vous avez fait économiser les utilisateurs",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " de leurs vies"
|
||||
"message": " de leurs vies",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Vérifiez status.sponsor.ajay.app pour le status du serveur."
|
||||
@@ -384,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Créé par"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Il est actuellement réglé sur :"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Support de YouTube-Sites tierces"
|
||||
},
|
||||
@@ -436,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Le segment suivant est plus court que votre option de durée minimale. Cela pourrait signifier qu'il est déjà soumis, et just ignoré par cette option. Êtes-vous sûr de vouloir soumettre ?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "La soumission sur un livestream actif ou une première n'est pas autorisée. Veuillez attendre qu'il termine, puis actualisez la page et vérifiez que les segments sont toujours valides."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Afficher le bouton de téléchargement"
|
||||
},
|
||||
@@ -463,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importer/Exporter toutes les options"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Modifier/copier"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Enregistrer dans un fichier"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Charger à partir du fichier"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "C'est votre configuration complète au format JSON. Elle inclut votre identifiant utilisateur, gardez-la pour vous."
|
||||
},
|
||||
@@ -511,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Les informations de débogage ont été copiées dans le presse-papiers. N'hésitez pas à supprimer toute information que vous ne préférez pas partager. Enregistrez-les dans un fichier texte ou collez-les dans le rapport de bug."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "La clé"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "est lié à une autre action. Veuillez sélectionner une autre clé."
|
||||
"message": "Ce raccourci est lié à une autre action. Veuillez en sélectionner un autre."
|
||||
},
|
||||
"to": {
|
||||
"message": "à",
|
||||
@@ -533,6 +551,16 @@
|
||||
"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."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Accès exclusif"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Seulement pour étiqueter des vidéos entières. Utilisé quand une vidéo présente un produit, un service ou un emplacement auquel ils ont reçu un accès gratuit ou subventionné."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Cette vidéo présente un produit, un service ou un emplacement auquel ils ont reçu un accès gratuit ou subventionné",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Rappel d'interaction (abonnement)"
|
||||
},
|
||||
@@ -564,7 +592,7 @@
|
||||
"message": "Résumé rapide des épisodes précédents, ou aperçu de ce qui se passera plus tard dans la vidéo en cours. Pour les plans collectifs édités, pas pour les résumés parlés."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Digressions"
|
||||
"message": "Digressions/Blagues"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Des digressions ajoutées uniquement pour le remplissage ou l'humour qui ne sont pas requis pour comprendre le contenu principal de la vidéo. Cela ne devrait pas inclure des segments fournissant du contexte ou des détails de fond."
|
||||
@@ -614,14 +642,18 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Afficher dans la barre de recherche"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Afficher l'étiquette"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Ignorer automatiquement tous les segments lorsqu'il y a un segment non-musical"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Autoriser les segments qui bloquent l'audio au lieu de le passer"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Votre couleur est mal formatée. Il devrait s'agir d'un code hexadécimal à 3 ou 6 chiffres avec un signe numérique au début."
|
||||
"fullVideoSegments": {
|
||||
"message": "Afficher une icône lorsqu'une vidéo est promotionnelle",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Couleur non soumise",
|
||||
@@ -674,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "masqué : trop court"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "masquer manuellement"
|
||||
},
|
||||
"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": "Le Channel ID n'est pas encore chargé. Si vous utilisez une vidéo intégrée, essayez d'utiliser la page d'accueil de YouTube. Cela pourrait également être causé par des changements dans l'interface de YouTube. Si vous pensez que c'est le cas, écrivez un commentaire ici :"
|
||||
@@ -737,6 +772,12 @@
|
||||
"message": "Compris",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Ce segment est long. Si toute la vidéo parle d'un seul sujet, changer \"Passer\" en \"Toute la vidéo\". Voir les directives pour plus d'informations."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Cette vidéo entière est étiquetée avec cette catégorie qui est trop intégrée pour l'en séparer"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Se désinscrire de toutes les futures expériences",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
@@ -754,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Faire un don"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Aider à financer le développement"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Cacher le lien de don"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Mode sombre sur la page options"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Merci d'avoir installé SponsorBlock."
|
||||
},
|
||||
@@ -835,6 +882,9 @@
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Utilisez la molette de votre souris en survolant la boîte d'édition pour ajuster rapidement le minutage. Les combinaisons de touches Ctrl ou Shift peuvent être utilisées pour affiner les modifications."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Nouveau! Voir quand une vidéo est entièrement sponsorisée ou de l'autopromotion"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "j",
|
||||
"description": "100d"
|
||||
@@ -842,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Comportement",
|
||||
"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": "Raccourcis clavier",
|
||||
"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": "Sauvegarde/Restauration",
|
||||
"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": "Divers",
|
||||
"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": "Apparence d'avis de saut",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Délier",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Non configuré"
|
||||
},
|
||||
"change": {
|
||||
"message": "Changer"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Il s'agit d'un raccourci YouTube intégré. Êtes-vous sûr de vouloir l'utiliser ?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,10 +176,12 @@
|
||||
"message": "שעות"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "חסכת לאנשים"
|
||||
"message": "חסכת לאנשים",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " מחייהם"
|
||||
"message": " מחייהם",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "נוצר על ידי"
|
||||
|
||||
@@ -280,9 +280,6 @@
|
||||
"createdBy": {
|
||||
"message": "Izradio"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Trenutno je postavljeno na:"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Podržane stranice: "
|
||||
},
|
||||
@@ -358,12 +355,6 @@
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Kopira informacije u međuspremnik koje treba dati razvojnom programeru kada otkrije grešku / kada to programer zatraži. Osjetljive informacije kao što su vaš korisnički ID, kanali s popisa dopuštenih i prilagođena adresa poslužitelja uklonjeni su. Međutim, sadrži informacije kao što su vaš korisnički agent, preglednik, operativni sustav i broj verzije proširenja. "
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Tipka"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "je vezana za drugu radnju. Molimo odaberite drugu tipku."
|
||||
},
|
||||
"to": {
|
||||
"message": "do",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -401,9 +392,6 @@
|
||||
"category_preview": {
|
||||
"message": "Pregled/Sažetak"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Popuna tangenti"
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Popuna"
|
||||
},
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Átugrások számlálásának engedélyezése privát/inkognitó füleken"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Leszavazások tárolása"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Minden szegmens amit leszavazol rejtve marad újratöltés után is"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Figyelem: A beállítás kikapcsolása letöröl minden korábban eltárolt szavazatot"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Lekérdezés Hash előtaggal"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Billentyű beállítása szegmens átugráshoz"
|
||||
"message": "Szegmens átugrása",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Billentyű beállítása a szegmens kezdéséhez/befejezéséhez"
|
||||
"message": "Szegmens kezdése/befejezése",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Billentyű beállítása a beküldés gombhoz"
|
||||
"message": "Szegmensek beküldése",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Válassz egy billentyűt azzal, hogy lenyomod"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "A funkció erre a billentyűre lett állítva: "
|
||||
"message": "Válassz egy billentyűt azzal, hogy lenyomod és válaszd ki a módosító billentyű(ke)t, amiket használni szeretnél."
|
||||
},
|
||||
"0": {
|
||||
"message": "Kapcsolati időtúllépés. Ellenőrizd az internetkapcsolatodat! Ha az internet működik, a kiszolgáló valószínűleg túlterhelt vagy leállt."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Átugrottál: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Megtakarítottál magadnak: "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "perc"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "óra"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Megspóroltál másoknak"
|
||||
"message": "Megspóroltál másoknak",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " az életükből"
|
||||
"message": " az életükből",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "A szerver állapotához tekintsd meg a status.sponsor.ajay.app oldalt."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Készítette"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Jelenleg erre van állítva:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Harmadik fél Youtube oldalainak támogatása"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "A következő szegmens rövidebb, mint az általad beállított minimális időtartam. Ez azt jelentheti, hogy már beküldhették, csak emiatt az opció miatt nálad nem jelenik meg. Biztosan beküldöd?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Aktív élő közvetítés vagy premier közben nem lehet szegmenseket beküldeni. Kérjük várd meg a végét, majd frissítsd az oldalt és ellenőrizd, hogy a szegmensek nem csúsztak-e el."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Feltöltés gomb megjelenítése"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Összes beállítás importálása / exportálása"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Szerkesztés/másolás"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Mentés fájlba"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Betöltés fájlból"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Ez az összes beállításod JSON formátumban. Ebbe bele tartozik a userID-d is, szóval csak ésszel oszd meg."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "A hibakeresési információ másolva lett a vágólapjára. Nyugodtan távolíts el belőle olyan információkat, amiket nem szívesen osztanál meg. Mentsd el szöveges fájlként, vagy másold a hibajelentésbe."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "A(z)"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "billentyű már máshoz van állítva. Kérlek, válassz egy másik billentyűt."
|
||||
"message": "Ez a billentyűparancs egy másik művelethez tartozik. Kérjük, válassz egy újat."
|
||||
},
|
||||
"to": {
|
||||
"message": "–",
|
||||
@@ -541,10 +555,10 @@
|
||||
"message": "Exkluzív hozzáférés"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Csak teljes videók megjelölésére. Akkor használt, amikor egy videó egy olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyen vagy kedvezményes hozzáférést kaptak."
|
||||
"message": "Csak teljes videók megjelölésére. Akkor használt, amikor egy videó egy olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyenes vagy kedvezményes hozzáférést kaptak."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Ez a videó olyan terméket, szolgáltatást vagy helyszínt mutat be, amihez ingyen vagy kedvezményes hozzáférést kaptak",
|
||||
"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_interaction": {
|
||||
@@ -578,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Témától eltérő töltelék"
|
||||
"message": "Témától eltérő töltelék/viccek"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Csak töltelékként, vagy humornak hozzáadott részek, amik nem szükségesek a videó fő tartalmának megértéséhez. Ne tartalmazzon olyan szegmenseket, amik kontextust, vagy alapvető információkat szolgáltatnak."
|
||||
@@ -641,9 +655,6 @@
|
||||
"message": "Mutasson egy ikont, amikor egy videó egésze reklám",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "A szín helytelenül van formázva. Egy 3 vagy 6 számjegyből álló hex kódnak kell lennie egy kettőskereszttel az elején."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Beküldetlen színe",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "elrejtve: túl rövid"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "kézzel elrejtve"
|
||||
},
|
||||
"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": "A csatorna ID még nem került betöltésre. Ha beágyazott videót használsz, próbáld meg inkább a YouTube oldalon keresztül. Ezt okozhatja még a YouTube elrendezésének változása is. Ha így gondolod, hagyj egy kommentet itt:"
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Támogatás"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Segíts a fejlesztés támogatásában"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Támogatás link elrejtése"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Sötét téma a Beállításokban"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Köszönjük, hogy telepítetted a SponsorBlockot."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "ó",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Működés",
|
||||
"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": "Felület",
|
||||
"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": "Gyorsbillentyűk",
|
||||
"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": "Biztonsági mentés",
|
||||
"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": "Egyéb",
|
||||
"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": "Átugrási értesítés kinézete",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Megszüntetés",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Nincs beállítva"
|
||||
},
|
||||
"change": {
|
||||
"message": "Megváltoztat"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Ez egy beépített YouTube gyorsbillentyű. Biztosan ezt szeretnéd használni?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktifkan Pelacakan Jumlah Lewati Pada Tab Privat/Penyamaran"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Tampung segmen yang dijempolbawahkan"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Semua segmen yang dijempolbawahkan akan tetap tersembunyi bahkan jika disegarkan"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Peringatan: Menonaktifkan ini akan menghapus semua jempol bawah yang ditampung"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Kueri dengan Hash Prefix"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Atur tombol untuk melewati sebuah segmen"
|
||||
"message": "Lewati segmen",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Atur tombol untuk mulai/hentikan segmen"
|
||||
"message": "Mulai/hentikan segmen",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Atur tombol untuk kirim submisi"
|
||||
"message": "Kirim segmen",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Pilih tombol dengan mengetikkannya"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tombol diatur menjadi: "
|
||||
"message": "Pilih sebuah tombol dengan mengetikkannya dan pilih tombol modifier apa saja yang Anda ingin gunakan."
|
||||
},
|
||||
"0": {
|
||||
"message": "Koneksi Timeout. Cek koneksi internet anda. Jika internet anda berfungsi, server mungkin kewalahan atau down."
|
||||
@@ -302,6 +311,10 @@
|
||||
"mute": {
|
||||
"message": "Bisukan"
|
||||
},
|
||||
"full": {
|
||||
"message": "Video Penuh",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Lewati {0}?"
|
||||
},
|
||||
@@ -345,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Anda sudah melewati "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Anda sudah menghemat waktu "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "menit"
|
||||
},
|
||||
@@ -361,10 +371,12 @@
|
||||
"message": "jam"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Anda sudah menghemat waktu orang lain"
|
||||
"message": "Anda sudah menghemat waktu orang lain",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " dari hidup mereka"
|
||||
"message": " dari hidup mereka",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Cek status.sponsor.ajay.app untuk status server."
|
||||
@@ -384,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Dibuat Oleh"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Saat ini diatur pada:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Dukung Situs Youtube Pihak Ketiga"
|
||||
},
|
||||
@@ -436,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Submisi ini lebih pendek dari opsi durasi minimalmu. Ini dapat berarti ini sudah dikirim, dan hanya akan diabaikan karena opsi ini. Apakah anda yakin ingin mengirim?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Mengirim pada livestream atau premiere tidak diperbolehkan. Mohon tunggu sampai selesai, lalu muat ulang halamannya dan verifikasi bahwa segmentnya masih valid."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Tampilkan Tombol Unggah"
|
||||
},
|
||||
@@ -463,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Impor/Ekspor Semua Pengaturan"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Edit/salin"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Simpan ke file"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Muat dari file"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Ini adalah seluruh konfigurasi anda di JSON. Ini mencakup userID anda, maka pastikan anda membagikan ini dengan bijak."
|
||||
},
|
||||
@@ -511,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Informasi debug telah disalin ke papan klip. Jangan ragu untuk menghapus informasi yang tidak ingin anda bagikan. Simpan ini di file teks atau salin ke laporan bug."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Tombolnya"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "terikat pada tindakan lain. Mohon memilih tombol lain."
|
||||
"message": "Pintasan ini telah diatur ke aksi yang lain. Mohon pilih yang lain."
|
||||
},
|
||||
"to": {
|
||||
"message": "sampai",
|
||||
@@ -533,6 +551,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Akses Eksklusif"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Hanya untuk menandai seluruh video. Digunakan ketika sebuah video mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Video ini mempromosikan sebuah produk, layanan atau lokasi yang diterima secara gratis atau mendapatkan izin",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Pengingat Interaksi (Berlangganan)"
|
||||
},
|
||||
@@ -564,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Pengisi Tangensial"
|
||||
"message": "Pengisi Tangent/Jokes"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Adegan tangensial ditambahkan hanya untuk pengisi atau humor yang tidak diperlukan untuk memahami isi utama video. Ini tidak boleh mencakup segmen yang memberikan detail konteks atau latar belakang."
|
||||
@@ -614,6 +642,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Tampilkan di Bilah Waktu"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Tampilkan Label"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Lewati semua segmen secara otomatis ketika ada segmen non-music"
|
||||
},
|
||||
@@ -624,9 +655,6 @@
|
||||
"message": "Tunjukkan ikon ketika keseluruhan video merupakan iklan",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Warna anda tidak diformat dengan benar. Harusnya terdiri dari 3 atau 6 digit kode heksa dengan tagar di awal."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Warna yang Belum Dikirim",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -678,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "disembunyikan: terlalu pendek"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "disembunyikan sendiri"
|
||||
},
|
||||
"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 Channel belum dimuat. Apabila anda menggunakan video yang tersematkan, coba menggunakan halaman utama YouTube. Hal ini juga dapat disebabkan oleh perubahan yang ada pada tampilan YouTUbe, apabila anda mengira seperti itu, buat komentar disini:"
|
||||
@@ -741,6 +772,12 @@
|
||||
"message": "Mengerti",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Segmen ini besar. Jika seluruh video tentang satu topik, ubah dari \"Lewati\" ke \"Video Penuh\". Lihat pedoman untuk informasi lanjutan."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Seluruh video ini ditandai sebagai kategori ini dan terlalu terintegrasi untuk dapat dipisahkan"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Tidak ikut eksperimen masa depan",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
@@ -758,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Donasi"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Bantu danai perkembangan"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Sembunyikan tautan donasi"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Mode Gelap Di Halaman Opsi"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Terima kasih telah menginstall SponsorBlock."
|
||||
},
|
||||
@@ -838,5 +881,53 @@
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Baru! Lihat jika sebuah video disponsori seluruhnya atau mempromosikan diri"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "j",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Perilaku",
|
||||
"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": "Tampilan",
|
||||
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabKeyBinds": {
|
||||
"message": "Pintasan keyboard",
|
||||
"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": "Cadangkan/Pulihkan",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Lain-lain",
|
||||
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"noticeVisibilityLabel": {
|
||||
"message": "Lewati pelihatan pemberitahuan",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Lepaskan",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Tidak diatur"
|
||||
},
|
||||
"change": {
|
||||
"message": "Ubah"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Ini adalah pintasan YouTube. Apakah Anda yakin untuk menggunakannya?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Abilita il conteggio dei salti nelle schede private/anonime"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Memorizza i voti negativi del segmento"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Qualsiasi segmento voti negativamente rimarrà nascosto anche dopo aver ricaricato"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Attenzione: Disabilitarlo eliminerà tutti i voti negativi precedentemente memorizzati"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Ricerca tramite prefisso hash"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Imposta un tasto per saltare un segmento"
|
||||
"message": "Salta segmento",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Imposta un tasto personalizzato per iniziare/finire il segmento"
|
||||
"message": "Inizio/Fine segmento",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Imposta un comando rapido per l'invio"
|
||||
"message": "Invia i segmenti",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Seleziona un tasto premendolo sulla tastiera"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Il comando rapido è stato impostato come: "
|
||||
"message": "Selezionare una chiave digitandola e scegliere qualsiasi tasto modificatore che si desidera utilizzare."
|
||||
},
|
||||
"0": {
|
||||
"message": "Timeout della connessione. Controlla la tua connessione a Internet. Se internet sta funzionando, il server è probabilmente sovraccarico oppure giù."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Hai saltato "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Ti sei salvato "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuto"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "ore"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Hai fatto risparmiare"
|
||||
"message": "Hai fatto risparmiare",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " delle loro vite"
|
||||
"message": " delle loro vite",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Controlla status.sponsor.ajay.app per lo stato del server."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Creato da"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Attualmente è impostato su:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Supporta siti di YouTube di terze parti"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Il seguente contributo è più breve della tua opzione di durata minima. Ciò potrebbe significare che questo è già stato inviato e viene semplicemente ignorato a causa di questa opzione. Sei sicuro di voler inviare?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Inviare segmenti per una live o premiere non è consentito. Per favore aspetta che finisca, poi ricarica la pagina e verifica che i segmenti siano ancora validi."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Mostra Pulsante di Caricamento"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importa/Esporta Tutte Le Opzioni"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Modifica/copia"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Salva su file"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Carica da file"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Questa è la tua intera configurazione in formaro JSON. Questo include il tuo ID utente, quindi presta attenzione se vuoi condividerlo."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Le informazioni di debug sono state copiate nel clip board. Sentiti libero di rimuovere tutte le informazioni che preferisci non condividere. Salva in un file di testo o incollale nella segnalazione di bug."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "La chiave"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "è abbinata ad un'altra azione. Si prega di selezionare un'altra chiave."
|
||||
"message": "Questa scorciatoia è associata ad un'altra azione. Selezionane una diversa."
|
||||
},
|
||||
"to": {
|
||||
"message": "a",
|
||||
@@ -537,6 +551,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Accesso Esclusivo"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Solo per etichettare interi video. Usato quando un video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Questo video mostra un prodotto, un servizio o un posto che hanno ricevuto gratuitamente o a cui hanno avuto un accesso sovvenzionato",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Promemoria di Interazione (Sottoscrizione)"
|
||||
},
|
||||
@@ -568,10 +592,10 @@
|
||||
"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_filler": {
|
||||
"message": "Tangente di Riempimento"
|
||||
"message": "Riempitivi irrilevanti/Battute"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Le scene tangenziali aggiunte solo per riempire o per umorismo che non sono richieste per comprendere il contenuto principale del video. Questo non dovrebbe includere segmenti che forniscono contesto o dettagli di sfondo."
|
||||
"message": "Le scene riempitive sono aggiunte solo per riempire o per umorismo che non sono richieste per comprendere il contenuto principale del video. Questo non dovrebbe includere segmenti che forniscono contesto o dettagli di sfondo."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Riempimento"
|
||||
@@ -618,6 +642,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Mostra Nella Barra di Ricerca"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Mostra Etichetta"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Salta automaticamente tutti i segmenti quando c'è un segmento non musicale"
|
||||
},
|
||||
@@ -628,9 +655,6 @@
|
||||
"message": "Mostra un'icona quando un video è interamente una pubblicità",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Il tuo colore è formattato in modo errato. Dovrebbe essere un codice esadecimale a 3 o 6 cifre con un segno numerico iniziale."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Segmento non inviato",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -682,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "nascosto: troppo corto"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "nascosta manualmente"
|
||||
},
|
||||
"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": "L'ID del canale non è ancora caricato. Se stai usando un video incorporato, prova piuttosto a usare la pagina principale di YouTube. Questo potrebbe esser causato dalle modifiche al layout di YouTube, se pensi che sia così, scrivi qui un commento:"
|
||||
@@ -768,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Dona"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Contribuisci allo sviluppo del fondo"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Nascondi Link di Donazione"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Pagina Delle Opzioni In Modalità Scura"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Grazie per aver installato SponsorBlock."
|
||||
},
|
||||
@@ -832,7 +865,7 @@
|
||||
"message": "Scopri di Più"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Vota negativamente e crea una copia locale per reinviare"
|
||||
"message": "Vota negativamente e crea una copia locale da reinviare"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Apri la pagina della wiki di questa categoria."
|
||||
@@ -859,5 +892,42 @@
|
||||
"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": "Interfaccia",
|
||||
"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": "Scorciatoie da tastiera",
|
||||
"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": "Backup/Ripristina",
|
||||
"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": "Varie",
|
||||
"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": "Salta l'aspetto del preavviso",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Dissocia",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Non impostato"
|
||||
},
|
||||
"change": {
|
||||
"message": "Modifica"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Questa è una scorciatoia integrata da YouTube. Sei sicuro di volerla usare?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@
|
||||
"message": "サーバーがこのリクエストは無効であると返答しました"
|
||||
},
|
||||
"429": {
|
||||
"message": "一つの動画に対してあまりに多くのセグメントを提出しています。本当にこれだけ必要ですか?"
|
||||
"message": "一つの動画に対してあまりに多くのセグメントを提案しています。本当にこれだけ必要ですか?"
|
||||
},
|
||||
"409": {
|
||||
"message": "これは既に提出されています。"
|
||||
"message": "これは既に提案されています。"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "チャンネルをホワイトリストに登録しました!"
|
||||
@@ -186,10 +186,10 @@
|
||||
"message": "プレイヤーの「ハイライトまでスキップ」ボタン表示を維持する"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTubeプレーヤーの情報ボタンを表示する"
|
||||
"message": "YouTubeプレーヤーに情報ボタンを表示する"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTubeプレーヤーの情報ボタンを隠す"
|
||||
"message": "YouTubeプレーヤーに情報ボタンを表示しない"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "情報ボタンを自動的に隠す"
|
||||
@@ -201,7 +201,7 @@
|
||||
"message": "YouTubeプレーヤーに削除ボタンを表示"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "スキップ回数の統計を有効にする"
|
||||
"message": "スキップ回数の追跡を有効にする"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "この機能は、あなたがスキップしたセグメントを追跡して、そのセグメントがどれだけ役に立ったかを他のユーザーに知らせることで、スパムがデータベースに紛れないようにするための評価基準として使用されます。あなたがセグメントをスキップするたびに、拡張機能はサーバーにメッセージを送信します。使用回数の統計が正確になるよう、できる限り多くの人がこの設定を変更しないことを望みます。:)"
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "プライベート/シークレット タブでスキップカウントトラッキングを有効にする"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "セグメントの低評価を記録"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "あなたが低評価したセグメントが再読み込み後も非表示のままになります"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "警告: 無効化するとこれまでの低評価記録が全て削除されます"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "ハッシュプレフィックスを使って要求"
|
||||
},
|
||||
@@ -231,16 +240,16 @@
|
||||
"message": "標準サイズのスキップ通知"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "自動スキップ通知を小型化"
|
||||
"message": "自動スキップ時に小型の通知"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "すべてのスキップ通知を小型化"
|
||||
"message": "常に小型のスキップ通知"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "自動スキップ通知を透過"
|
||||
"message": "自動スキップ時に半透明の通知"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "すべてのスキップ通知を透過"
|
||||
"message": "常に半透明のスキップ通知"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。",
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "セグメントをスキップするキーを設定"
|
||||
"message": "セグメントをスキップ",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "セグメントの開始/停止キーのバインドを設定"
|
||||
"message": "セグメントを開始/終了",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "提案キーのバインドを設定"
|
||||
"message": "セグメントを提出",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "キーを入力して設定します"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "キーバインドは次のように設定されました: "
|
||||
"message": "使用したいキーをキーボードで入力し、修飾キーを以下から選択してください。"
|
||||
},
|
||||
"0": {
|
||||
"message": "接続がタイムアウトになりました。インターネット接続をご確認ください。接続に問題がない場合、サーバーが混雑またはダウンしている可能性があります。"
|
||||
@@ -302,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} をスキップしますか?"
|
||||
},
|
||||
@@ -317,7 +330,7 @@
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} ミュート済み",
|
||||
"message": "{0}をミュートしました",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
@@ -345,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "スキップしたセグメント数: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "ご自身の時間をこれだけ節約しました: "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "分"
|
||||
},
|
||||
@@ -361,10 +371,12 @@
|
||||
"message": "時間"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "他の人々の時間をこれだけ節約しました:"
|
||||
"message": "他の人々の時間をこれだけ節約しました:",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": "(彼らの人生のうち)"
|
||||
"message": "(彼らの人生のうち)",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "サーバーの状態についてはstatus.sponsor.ajay.appを確認してください。"
|
||||
@@ -384,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "作成者:"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。現在の設定は:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "第三者製のYouTube関連サイトに対応"
|
||||
},
|
||||
@@ -436,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "提出しようとしている区間の長さが個人設定における最短時間よりも短かいです。これは,既に当区間は提出されており,個人設定によって無視されていることを意味します。本当に提出しますか?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "ライブ配信中の動画やプレミア公開中の動画ではセグメントの提出はできません。配信が終了するまで待つか、ページを再読み込みしてセグメントがまだ有効かご確認ください。"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "アップロードボタンを表示"
|
||||
},
|
||||
@@ -463,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "全ての設定をインポート/エクスポート"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "編集/コピー"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "ファイルに保存"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "ファイルから読み込み"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "JSON形式の個人設定全体です。利用者IDが含まれているので,共有するときは注意してください。"
|
||||
},
|
||||
@@ -511,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "診断用情報がクリップボードに複製されました。共有したくない情報があればそこから削除できます。これをファイルに保存したり,不具合報告に貼り付けてください。"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "キー"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "は他の動作に割り当てられています。異なったキーを選択してください。"
|
||||
"message": "このショートカットは他のアクションに割り当てられています。別のショートカットを選択してください。"
|
||||
},
|
||||
"to": {
|
||||
"message": "~",
|
||||
@@ -533,6 +551,16 @@
|
||||
"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": "行動を促すメッセージ(チャンネル登録)"
|
||||
},
|
||||
@@ -563,6 +591,9 @@
|
||||
"category_preview_description": {
|
||||
"message": "前回の粗筋,または動画の後半内容の予告。音声による要約ではなく,編集された映像を指します。"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "無駄な脱線/冗談"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "脱線したシーンには、動画の主な内容を理解するのに必要がない穴埋めやユーモアのみを追加してください。これには、文脈や背景の詳細を提供するセグメントを含めないでください。"
|
||||
},
|
||||
@@ -611,14 +642,18 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "シークバーに表示"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "ラベルを表示"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "非音楽区域がある場合,全区域を自動的に飛び越す"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "スキップする代わりに音声をミュートしてセグメントを許可"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "カラーコードの書式が間違っています。 #から始まる3桁または6桁の16進数コードでなければなりません。"
|
||||
"fullVideoSegments": {
|
||||
"message": "動画全体が広告の場合アイコンを表示",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "未確定の色",
|
||||
@@ -671,6 +706,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の画面構成を変えた際にも発生する可能性があります。その場合は,こちらに意見をお書きください:"
|
||||
@@ -706,7 +744,7 @@
|
||||
"message": "不正確あるいは間違った時刻です"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "カテゴリーを変更してください"
|
||||
"message": "カテゴリーを変更"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "この動画は音楽として分類されています。本当にこの動画にスポンサー部分がありますか? 本セグメントが本当に「音楽以外の区域」だった場合は、設定画面からこの分類を有効にしてください。その後、「スポンサー部分」の代わりに「音楽以外のセグメント」としてセグメントを提出できます。よく分からない場合は、ガイドラインを参照してください。"
|
||||
@@ -734,6 +772,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."
|
||||
@@ -742,7 +786,7 @@
|
||||
"message": "二度と表示しない"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "警告のためにあなたは一時的にセグメントを提出することができなくなりました。これはあなたが悪意のない一般的なミスを犯していることに私たちが気づいた事を意味します、ルールを理解していることを確認していただければこの警告を解除します。discord.gg/SponsorBlock または matrix.to/#/#sponsor:ajay.app を使ってこのチャットに参加することもできます。"
|
||||
"message": "警告によりあなたは一時的にセグメントを提出することができなくなりました。これはあなたが悪意のない一般的なミスを犯していることに私たちが気づいた事を意味します。ルールを理解していることを確認していただければこの警告は解除します。discord.gg/SponsorBlock または matrix.to/#/#sponsor:ajay.app よりこのチャットに参加することもできます。"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "警告により投票が拒否されました。クリックして運営に連絡するか,少し時間を置いてからやりなおしてください。",
|
||||
@@ -751,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "寄付"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "開発資金を援助する"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "寄付のお願いを表示しない"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "オプション画面でダークモードを使用"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "SponsorBlockを導入いただきありがとうございます。"
|
||||
},
|
||||
@@ -797,7 +847,7 @@
|
||||
"message": "データベースのコピーを取得できますか? あなたがいなくなった場合はどうなりますか?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "データベースは公開されており、次の場所で利用できます:"
|
||||
"message": "データベースは公開されており、こちらから閲覧できます:"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "ソースコードは自由に利用できます。運営になにがあろうとも,あなたの貢献(提出された区域)が失われることはありません。"
|
||||
@@ -831,5 +881,53 @@
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "編集ボックスにカーソルを合わせながらマウスホイールを使用すると、時間をすばやく調整できます。 CtrlキーまたはShiftキーの組み合わせを使用して変更を微調整できます。"
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "新機能!動画全体がスポンサー付きもしくはセルフプロモーションかがわかります"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"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": "UI",
|
||||
"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にデフォルトで使用されているショートカットです。本当にこれを使用しますか?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "시크릿/사생활 보호 탭에서 스킵 개수 추적 활성화"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "구간 비추천 저장"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "비추천한 구간을 새로고침 이후에도 계속 숨깁니다"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "경고: 비활성화하는 경우 이전에 저장한 모든 비추천이 삭제됩니다"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Hash Prefix가 쿼리를 제공함"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "구간 건너뛰기 키 설정"
|
||||
"message": "구간 건너뛰기",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "시작/끝 부분 키 할당 설정"
|
||||
"message": "구간 시작/중지",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "제출 키 할당 설정"
|
||||
"message": "구간 제출",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "입력해서 키를 선택하세요"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "키가 다음에 할당되었습니다: "
|
||||
"message": "키를 눌러서 선택하고 함께 사용하고 싶은 조합 키를 선택하십시오."
|
||||
},
|
||||
"0": {
|
||||
"message": "연결 타임아웃 오류입니다. 인터넷이 연결되어 있는지 확인해주세요. 인터넷이 연결되어 있는 경우, 서버가 과부하되어 있거나 다운되어 있어서 오류가 발생하는 것일 수도 있습니다."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "건너뛴 구간: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "지금까지 절약한 시간: "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "분"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "시간"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "사람들의"
|
||||
"message": "사람들의",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " 의 시간을 아꼈습니다."
|
||||
"message": " 의 시간을 아꼈습니다.",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Status.sponsor.ajay.app 사이트를 확인하여 서버 상태를 확인하세요."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "개발자: "
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". 현재 다음으로 설정되어 있습니다:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "제3자 YouTube 사이트 지원"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "다음 제출은 최소 기간 옵션보다 짧습니다. 이 말은 이미 제출되었으며, 이 옵션으로 인해 무시될 수 있습니다. 제출하시겠습니까?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "진행 중인 실시간 스트림 및 최초 공개 동영상에는 제출할 수 없습니다. 끝날 때까지 대기한 후, 페이지를 새로고침하고 구간이 여전히 유효한지 확인해주십시오."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "업로드 버튼 표시"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "모든 설정 가져오기/내보내기"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "수정/복사"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "파일로 저장"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "파일에서 불러오기"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "JSON의 전체 구성입니다. 사용자ID가 포함되므로 주의하세요."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "디버그 정보가 복사되었습니다. 공유하고 싶지 않은 내용이 있는 경우 자유롭게 수정하신 후, 텍스트 파일로 저장하시거나 버그 신고 페이지에 붙여넣으시면 됩니다."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "키"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "이 키는 다른 행동과 연동되었습니다. 다른 키를 선택하세요."
|
||||
"message": "이 단축키는 다른 동작에 할당되어 있습니다. 다른 키를 선택하세요."
|
||||
},
|
||||
"to": {
|
||||
"message": "-",
|
||||
@@ -537,6 +551,16 @@
|
||||
"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": "상호 작용 알림 (구독)"
|
||||
},
|
||||
@@ -568,7 +592,7 @@
|
||||
"message": "이전 에피소드를 간략히 요약하거나 현재 동영상에서 나중에 나올 내용을 예고해줍니다. 음성 요약이 아니라 편집된 동영상을 통한 요약입니다."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "쓸데없는 잡담"
|
||||
"message": "쓸데없는 잡담/농담"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "쓸데없는 잡담은 동영상의 주요 콘텐츠를 이해하는 데 필요없는 시간 떼우기 장면이나 농담만을 말합니다. 맥락이나 상세한 배경지식을 설명하는 부분은 해당하지 않습니다."
|
||||
@@ -631,9 +655,6 @@
|
||||
"message": "동영상 전체가 광고인 경우 아이콘 표시",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "올바르지 않은 색상 코드입니다. 색상 코드는 샵 (#) 기호로 시작하여 3자리 또는 6자리의 16진수로 구성되어야 합니다."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "미제출한 색상",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -685,6 +706,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의 레이아웃 변경으로 인해서도 발생할 수 있습니다. 레이아웃 변경에 의해 오류가 발생했다고 생각하면 여기에 의견을 남겨주십시오."
|
||||
@@ -771,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "후원"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "개발 자금 지원"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "후원 링크 숨기기"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "설정 페이지 내 다크 모드"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "SponsorBlock을 설치해 주셔서 감사드립니다."
|
||||
},
|
||||
@@ -862,5 +892,42 @@
|
||||
"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 단축키와 겹칩니다. 그래도 사용하시겠습니까?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,18 +226,6 @@
|
||||
"message": "നിങ്ങൾക്ക് ഇപ്പോഴും ഇഷ്ടമായില്ലെങ്കിൽ, ഒരിക്കലും കാണിക്കരുത് ബട്ടൺ അമർത്തുക.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കുന്നതിനായി കീ സജ്ജമാക്കുക"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "സമർപ്പിക്കൽ കീബൈൻഡിനായി കീ സജ്ജമാക്കുക"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "ഒരു കീ ടൈപ്പുചെയ്ത് തിരഞ്ഞെടുക്കുക"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "കീബൈൻഡ് ഇനിപ്പറയുന്നതായി സജ്ജമാക്കി: "
|
||||
},
|
||||
"0": {
|
||||
"message": "കണക്ഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക. നിങ്ങളുടെ ഇൻറർനെറ്റ് പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, സെർവർ ഓവർലോഡ് അല്ലെങ്കിൽ ഡ. ൺ ആയിരിക്കാം."
|
||||
},
|
||||
@@ -284,9 +272,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "നിങ്ങൾ ഒഴിവാക്കി "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "നിങ്ങൾ സ്വയം രക്ഷിച്ചു "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "മിനിറ്റ്"
|
||||
},
|
||||
@@ -300,10 +285,12 @@
|
||||
"message": "മണിക്കൂറുകൾ"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു"
|
||||
"message": "നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " അവരുടെ ജീവിതത്തിന്റെ"
|
||||
"message": " അവരുടെ ജീവിതത്തിന്റെ",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "സെർവർ നിലയ്ക്കായി status.sponsor.ajay.app പരിശോധിക്കുക."
|
||||
@@ -320,9 +307,6 @@
|
||||
"createdBy": {
|
||||
"message": "ഉണ്ടാക്കിയത്"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". ഇത് നിലവിൽ ഇതായി സജ്ജീകരിച്ചിരിക്കുന്നു:"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "ആക്രമണാത്മക പിന്തുണ പ്രാപ്തമാക്കുക, ഓട്ടോസ്കിപ്പ് അപ്രാപ്തമാക്കുക, ബട്ടണുകൾ മറയ്ക്കുക എന്നിവയും അതിലേറെയും."
|
||||
},
|
||||
@@ -422,12 +406,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "ഡീബഗ് വിവരങ്ങൾ ക്ലിപ്പ് ബോർഡിലേക്ക് പകർത്തി. നിങ്ങൾ പങ്കിടാൻ ആഗ്രഹിക്കാത്ത ഏതെങ്കിലും വിവരങ്ങൾ നീക്കംചെയ്യാൻ മടിക്കേണ്ട. ഇത് ഒരു ടെക്സ്റ്റ് ഫയലിൽ സംരക്ഷിക്കുക അല്ലെങ്കിൽ ബഗ് റിപ്പോർട്ടിൽ ഒട്ടിക്കുക."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "താക്കോല്"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "മറ്റൊരു പ്രവർത്തനവുമായി ബന്ധപ്പെട്ടിരിക്കുന്നു. മറ്റൊരു കീ തിരഞ്ഞെടുക്കുക."
|
||||
},
|
||||
"to": {
|
||||
"message": "ടു",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -495,9 +473,6 @@
|
||||
"disable": {
|
||||
"message": "പ്രവർത്തനരഹിതമാക്കുക"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "നിങ്ങളുടെ നിറം തെറ്റായി ഫോർമാറ്റുചെയ്തു. ഇത് തുടക്കത്തിൽ ഒരു നമ്പർ ചിഹ്നമുള്ള 3 അല്ലെങ്കിൽ 6 അക്ക ഹെക്സ് കോഡായിരിക്കണം."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "ബാർ കളർ തേടുക"
|
||||
},
|
||||
|
||||
@@ -226,18 +226,6 @@
|
||||
"message": "Sekiranya anda masih tidak menyukainya, tekan butang jangan tunjukkan.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Tetapkan kunci untuk melangkau segmen"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Tetapkan kunci untuk pengikat kunci penyerahan"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Pilih kekunci dengan menaipnya"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Ikatan kunci telah ditetapkan ke: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Masa sambungan telah tamat. Periksa sambungan internet anda. Sekiranya internet anda berfungsi, pelayan mungkin berlebihan atau tidak berfungsi."
|
||||
},
|
||||
@@ -284,9 +272,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Anda telah melangkau "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Anda telah menyelamatkan diri "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minit"
|
||||
},
|
||||
@@ -300,10 +285,12 @@
|
||||
"message": "jam"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Anda telah menyelamatkan orang"
|
||||
"message": "Anda telah menyelamatkan orang",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " kehidupan mereka"
|
||||
"message": " kehidupan mereka",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Periksa status.sponsor.ajay.app untuk status pelayan."
|
||||
@@ -320,9 +307,6 @@
|
||||
"createdBy": {
|
||||
"message": "Dicipta oleh"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Pada masa ini ditetapkan untuk:"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Dayakan sokongan Invidious, lumpuhkan autoskip, sembunyikan butang dan banyak lagi."
|
||||
},
|
||||
@@ -422,12 +406,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Maklumat debug telah disalin ke papan klip. Jangan ragu untuk membuang maklumat yang anda tidak mahu kongsi Simpan ini dalam fail teks atau tampal ke laporan pepijat."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Kunci"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "terikat dengan tindakan lain. Sila pilih kunci lain."
|
||||
},
|
||||
"to": {
|
||||
"message": "ke",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -495,9 +473,6 @@
|
||||
"disable": {
|
||||
"message": "Nyahaktifkan"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Warna anda tidak diformat dengan betul. Ia mestilah kod hex 3 atau 6 digit dengan tanda nombor pada awalnya."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Cari Warna Bar"
|
||||
},
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Bijhouden van het aantal keren overslaan inschakelen in privé-/incognito-tabbladen"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Segment-downvotes opslaan"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Segmenten waarop u een downvote doet, blijven verborgen, zelfs na vernieuwen"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Waarschuwing: als u dit uitschakelt, worden alle eerder opgeslagen downvotes verwijderd"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Opvragen via hash-voorvoegsel"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Sleutel instellen voor het overslaan van een segment"
|
||||
"message": "Segment overslaan",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Sneltoets instellen voor begin/einde van segment"
|
||||
"message": "Segment starten/stoppen",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Sneltoets instellen voor inzending"
|
||||
"message": "Segmenten indienen",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Selecteer een toets door hem in te drukken"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Deze sneltoets is ingesteld op: "
|
||||
"message": "Selecteer een toets door hem in te typen en kies de modificatietoetsen die u wilt gebruiken."
|
||||
},
|
||||
"0": {
|
||||
"message": "Time-out van de verbinding. Controleer uw internetverbinding. Als uw internet werkt, is de server waarschijnlijk overbelast of offline."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "U heeft overgeslagen: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "U heeft zichzelf bespaard: "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuut"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "uren"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "U heeft mensen bespaard:"
|
||||
"message": "U heeft mensen bespaard:",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " van hun leven"
|
||||
"message": " van hun leven",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Controleer status.sponsor.ajay.app voor de serverstatus."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Gemaakt door"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Hij is momenteel ingesteld op:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Ondersteuning voor YouTube-sites van derden"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "De volgende inzending is korter dan uw \"minimale tijdsduur\"-instelling. Dit kan betekenen dat dit al is ingediend en genegeerd wordt door deze optie. Weet u zeker dat u dit wilt indienen?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Indienen op een actieve livesteam of première is niet toegestaan. Wacht tot hij geëindigd is, vernieuw dan de pagina en controleer of de segmenten nog geldig zijn."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Uploaden-knop weergeven"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Alle opties importeren/exporteren"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Bewerken/kopiëren"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Opslaan naar bestand"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Laden uit bestand"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Dit is uw volledige configuratie in JSON. Dit is inclusief uw gebruikers-ID, dus zorg ervoor dat u dit verstandig deelt."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "De foutopsporingsinformatie is gekopieerd naar het klembord. Voel u vrij om alle informatie die u liever niet wilt delen, te verwijderen. Sla dit op in een tekstbestand of plak het in het foutenrapport."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "De toets"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "is gekoppeld aan een andere actie. Selecteer een andere toets."
|
||||
"message": "Deze snelkoppeling is gebonden aan een andere actie. Kies een andere."
|
||||
},
|
||||
"to": {
|
||||
"message": "tot",
|
||||
@@ -537,6 +551,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Exclusieve toegang"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Alleen voor het labelen van volledige video's. Wordt gebruikt wanneer een video een product, dienst of locatie laat zien waartoe men gratis of gesubsidieerd toegang heeft gekregen."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Deze video toont een product, dienst of locatie waartoe men gratis of gesubsidieerd toegang heeft gekregen",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Interactieherinnering (abonneren)"
|
||||
},
|
||||
@@ -568,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Zijspoor-opvulling"
|
||||
"message": "Opvulling zijspoor/humor"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Zijspoor-scènes die alleen ter opvulling of als humor worden toegevoegd en niet noodzakelijk zijn om de hoofdinhoud van de video te begrijpen. Segmenten die context of achtergrondinformatie verschaffen, mogen hier niet onder vallen."
|
||||
@@ -618,6 +642,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Weergeven in tijdbalk"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Label weergeven"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automatisch alle segmenten overslaan wanneer er een niet-muziek-segment is"
|
||||
},
|
||||
@@ -628,9 +655,6 @@
|
||||
"message": "Een pictogram weergeven wanneer de volledige video een advertentie is",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Uw kleur is verkeerd geformatteerd. Het moet een hexadecimale code van 3 of 6 cijfers zijn met een hekje aan het begin."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Niet ingediend kleur",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -682,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "verborgen: te kort"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "handmatig verborgen"
|
||||
},
|
||||
"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": "Kanaal-ID is nog niet geladen. Als u een ingesloten video gebruikt, probeer dan in plaats daarvan de YouTube-homepagina. Dit kan ook worden veroorzaakt door wijzigingen in de YouTube-lay-out. Als u denkt dat dit het geval is, maak dan hier een opmerking:"
|
||||
@@ -768,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Doneren"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Ontwikkeling helpen"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Donatiekoppeling verbergen"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Donkere modus op opties-pagina"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Bedankt voor het installeren van SponsorBlock."
|
||||
},
|
||||
@@ -859,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": " h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Gedrag",
|
||||
"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": "Sneltoetsen",
|
||||
"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": "Back-up maken/herstellen",
|
||||
"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": "Overige",
|
||||
"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": "Uiterlijk van overslaan-meldingen",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Ontkoppelen",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Niet ingesteld"
|
||||
},
|
||||
"change": {
|
||||
"message": "Wijzigen"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dit is een ingebouwde YouTube-snelkoppeling. Weet u zeker dat u deze wilt gebruiken?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "Hopp igjen"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Lyd"
|
||||
},
|
||||
"paused": {
|
||||
"message": "På pause"
|
||||
},
|
||||
@@ -79,9 +82,15 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Segmentet slutter nå"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Avbryt opprettelse av segment"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Ingen YouTube-video ble funnet.\nHvis dette er feil, oppfrisk fanen."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Oppdater segmenter"
|
||||
},
|
||||
"success": {
|
||||
"message": "Suksess!"
|
||||
},
|
||||
@@ -152,6 +161,9 @@
|
||||
"setUsername": {
|
||||
"message": "Angi brukernavn"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Kopiér offentlig bruker-ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Bli med i den offisielle Discord-tjeneren for å gi forslag og tilbakemeldinger!"
|
||||
},
|
||||
@@ -170,12 +182,18 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Dette skjuler knappene som dukker opp på YouTube-avspilleren for å sende inn hoppesegmenter."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Behold Hopp til høydepunkt-knappen på avspilleren"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Vis infoknappen på YouTube-avspilleren"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Skjul infoknappen på YouTube-avspilleren"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Skjul infoknappen automatisk"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Skjul Slett-knappen på YouTube-avspilleren"
|
||||
},
|
||||
@@ -188,6 +206,9 @@
|
||||
"whatViewTracking": {
|
||||
"message": "Denne funksjonen sporer hvilke segmenter du har hoppet over, sånn at brukere vet hvor mye bidragene deres har hjulpet andre, og brukes som et målesystem sammen med plusstemmer for å sikre at spam ikke kommer inn i databasen. Utvidelsen sender en melding til tjeneren hver gang du hopper over et segment. Forhåpentligvis endrer ikke de fleste folk på denne innstillingene, sånn at visningstallene er nøyaktige. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktiver telling av antall hopp i privat/inkognito-faner"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Forespør ut i fra saltings-prefiks"
|
||||
},
|
||||
@@ -206,6 +227,21 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Vis varsel etter at et segment har blitt hoppet over"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Hopp over-varsel i full størrelse"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Små hopp over-varsler for autohopp"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Alle små hopp over-varsler"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Tonet hopp over-varsel for autohopp"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Alle tonede hopp over-varsler"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock lar deg hoppe over sponsorer, introer, outro-er, abonnementspåminnelser, og andre irriterende deler av YouTube-videoer. SponsorBlock er en fellesskapsdrevet nettleserutvidelser som lar alle sende inn start- og sluttidspunktene til sponsede segmenter og andre segmenter i YouTube-videoer. Når en person sender inn denne informasjonen, vil alle andre med denne utvidelsen hoppe rett over det sponsede segmentet. Du kan også hoppe over ikke-musikk-seksjoner i musikkvideoer.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -227,16 +263,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Angi tast for å hoppe over et segment"
|
||||
"message": "Hopp over segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Start/stopp segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Angi tast for innsending"
|
||||
"message": "Send inn segmenter",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Velg en tast ved å trykke på den"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Hurtigtasten har blitt satt til: "
|
||||
"message": "Velg en tast ved å trykke på den, velg deretter hvilke modifikasjonstaster du ønsker å bruke."
|
||||
},
|
||||
"0": {
|
||||
"message": "Tidsavbrudd for tilkobling. Sjekk internettilkoblingen din. Hvis internettet ditt virker, er tjeneren sannsynligvis overbelastet eller nede."
|
||||
@@ -260,9 +299,35 @@
|
||||
"skip": {
|
||||
"message": "Hopp over"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Lydløs"
|
||||
},
|
||||
"full": {
|
||||
"message": "Full video",
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Vil du hoppe over {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Gjør {0} lydløs?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Hopp til {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} hoppet over",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} lydløs",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Hoppet til {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Skru av autohopping"
|
||||
},
|
||||
@@ -284,9 +349,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Du har hoppet over "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Du har spart deg selv for "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minutt"
|
||||
},
|
||||
@@ -300,10 +362,12 @@
|
||||
"message": "timer"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Du har spart folk for"
|
||||
"message": "Du har spart folk for",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": "av sine liv"
|
||||
"message": "av sine liv",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Sjekk status.sponsor.ajay.app for tjenerstatus."
|
||||
@@ -311,6 +375,9 @@
|
||||
"changeUserID": {
|
||||
"message": "Importer/Eksporter din bruker-ID"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Dette bør holdes privat. Det er som et passord og bør ikke deles med noen. Hvis noen har dette kan de utgi seg som deg. Hvis du leter etter din offentlige bruker-ID, klikker du på utklippstavlen i oppsprettsvinduet."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Angi bruker-ID"
|
||||
},
|
||||
@@ -320,12 +387,25 @@
|
||||
"createdBy": {
|
||||
"message": "Opprettet av"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Den er før øyeblikket satt til:"
|
||||
"supportOtherSites": {
|
||||
"message": "Støtt tredjeparts YouTube-nettsteder"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Støtt tredjeparts YouTube-klienter. For å aktivere støtte må du akseptere ytterlige vilkår. Dette fungerer IKKE i inkognitomodus i Chrome og andre Chromium-varianter.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Støttede nettsteder: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Skru på Invidious-støtte, skru av autohopp, skjul knapper, og mer."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Legg til tredjeparts klientinstans"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Legg til en egendefinert instans. Den må formatteres med KUN domenet. Eksempel: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Legg til"
|
||||
},
|
||||
@@ -347,9 +427,18 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Segmenter som er kortere enn den valgte verdien, vil ikke bli hoppet over eller vises i avspilleren."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Varighet for hopp over-varsel (sekunder):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Hopp over-varselet vil bli værende på skjermen i minst så mange sekunder. For manuell hopping kan det være synlig lenger."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Den følgende innsendingen er kortere enn din valgte minimumsvarighetsinnstilling. Dette kan bety at den allerede er sendt inn, og at den simpelthen blir ignorert på grunn av denne innstillingen. Er du sikker på at du vil sende den inn?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Innsendelse på en aktiv direktesending eller premiere er ikke tillatt. Vennligst vent til den er ferdig, last så siden på nytt og kontroller at segmentene fortsatt er gyldige."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Vis opplastingsknapp"
|
||||
},
|
||||
@@ -377,6 +466,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importer/Eksporter alle innstillinger"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Rediger/kopiér"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Lagre til fil"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Last fra fil"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Dette er hele oppsettet ditt i JSON. Det inkluderer bruker-ID-en din, så sørg for å være beskjeden med å dele det."
|
||||
},
|
||||
@@ -404,6 +502,9 @@
|
||||
"preview": {
|
||||
"message": "Forhåndsvisning"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "Ikke innsendt"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Inspiser"
|
||||
},
|
||||
@@ -422,11 +523,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Avlusingsinformasjonen har blitt kopiert til utklippstavlen. Du er velkommen til å fjerne det av informasjon som du helst ikke vil dele. Lagre dette i en tekstfil, eller lim det inn i feilrapporten."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Nøkkelen"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "er bundet til en annen handling. Vennligst velg en annen tast."
|
||||
"message": "Denne hurtigtasten er knyttet til en annen handling. Vennligst velg en annen kombinasjon."
|
||||
},
|
||||
"to": {
|
||||
"message": "til",
|
||||
@@ -444,6 +542,16 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Minner om «Sponsor», men er ubetalt eller selvpromotering. Dette inkluderer segmenter om merchandise, donasjoner, eller info om hvem de samarbeidet med."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Ekslusiv tilgang"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Kun for merking av hele videoer. Brukes når en video demonstrerer et produkt, tjeneste eller sted de har fått gratis eller subsidiert tilgang til."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Denne videoen demonstrerer et produkt, tjeneste eller sted som de har fått gratis eller subsidiert tilgang til",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Samhandlingspåminnelse (Abonner)"
|
||||
},
|
||||
@@ -468,6 +576,18 @@
|
||||
"category_outro_description": {
|
||||
"message": "Rulletekster eller når YouTube-sluttkortene dukker opp. Ikke for avslutninger med informasjon."
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Forhåndsvisning/Oppsummering"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Hurtig oppsummering av tidligere episoder, eller forhåndsvisning av hva som kommer senere i denne videoen. Ment for redigerte klipp, ikke muntlige sammendrag."
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Intetsigende segmenter kun lagt til som fyllstoff eller humor som ikke er nødvendig for å forstå hovedinnholdet i videoen. Dette bør ikke inkludere segmenter som gir kontekst eller bakgrunnsdetaljer."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Fyllstoff"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musikk: Seksjon uten musikk"
|
||||
},
|
||||
@@ -477,6 +597,12 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Ikke-musikk"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Høydepunkt"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Den del av videoen som de fleste er interessert i. Tilsvarende kommentarer som \"Videoen begynner på x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Direktesending: Donasjons-/Meldingshøytlesninger"
|
||||
},
|
||||
@@ -495,8 +621,31 @@
|
||||
"disable": {
|
||||
"message": "Deaktiver"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Fargen din er formattert feil. Det burde være en 3- eller 6-sifret heksadesimal kode med et nummertegn foran."
|
||||
"autoSkip_POI": {
|
||||
"message": "Autohopp til starten"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Spør når videoen laster"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Vis i tidsstripen"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Vis merke"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Autohopp over alle segmenter når det er et segment uten musikk"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Tillat segmenter som slår av lyden i stedet for å hoppe over"
|
||||
},
|
||||
"fullVideoSegments": {
|
||||
"message": "Vis et ikon når en video utelukkende er reklame",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Ikke innsendt-farge",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Tidsstripefarge"
|
||||
@@ -530,6 +679,9 @@
|
||||
"message": "For å sende inn segmenter i «{0}»-kategorien, må du skru det på i innstillingene. Du vil nå bli omdirigert til innstillingene.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Advarsel: Denne type segment kan ha maksimalt én aktiv om gangen. Å legge inn flere vil forårsake en tilfeldig framvisning."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Du må velge en kategori for alle segmentene du sender inn!"
|
||||
},
|
||||
@@ -542,6 +694,13 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "skjult: for kort"
|
||||
},
|
||||
"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 lastet enda. Hvis du bruker en innebygd video, prøv å bruke YouTube-hjemmesiden i stedet. Dette kan også forårsakes av endringer i YouTube-oppsett, hvis du mistenker det, kommenter her:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Det virker som om noe blokkerer SponsorBlock's mulighet til å få videodata. Vennligst se https://github.com/ajayyy/SponsorBlock/issues/741 for mer info."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Det ser ut til at SponsorBlock ikke klarer å nå YouTube-API-en. For å fikse dette, godta tillatelsesspørringen som dukker opp etter dette, vent noen sekunder, og så last inn siden på nytt."
|
||||
},
|
||||
@@ -554,6 +713,9 @@
|
||||
"permissionRequestFailed": {
|
||||
"message": "Tillatelsesforespørselen mislyktes, klikket du på Avvis?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Om du ikke er i stand til å løse dette, forsøk å deaktiver innstillingen 'Fremtving kanalsjekk før hopp', siden SponsorBlock ikke kan hente kanalinformasjon for denne videoen"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Fremtving kanalsjekk før hopp"
|
||||
},
|
||||
@@ -566,6 +728,9 @@
|
||||
"downvoteDescription": {
|
||||
"message": "Feil tidtaking"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Endre kategori"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Denne videoen er kategorisert som musikk. Er du sikker på at dette har en sponsor? Hvis det egentlig er et \"Ikke-musikk-segment\", åpne opp innstillingene til utvidelsen og skru på denne kategorien. Deretter kan du sende dette segmentet som \"Ikke-musikk\" i stedet for som sponsing. Vennligst les retningslinjene hvis du er forvirret."
|
||||
},
|
||||
@@ -584,5 +749,167 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Åpne innstillingene for å hoppe over introer, outro-er, merchandise, osv."
|
||||
},
|
||||
"help": {
|
||||
"message": "Hjelp"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Jeg forstår",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Dette segmentet er stort. Dersom hele videoen er omtrent ett emne, så endre fra \"Hopp Over\" til \"Full Video\". Se retningslinjene for mer informasjon."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Hele denne videoen er merket som denne kategorien og er for tett knyttet til å kunne separeres"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Reservér deg mot alle fremtidige eksperimenter",
|
||||
"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": "Skjul for alltid"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Du fikk en advarsel og vil midlertidig ikke kunne sende inn segmenter. Dette betyr at vi la merke til at du gjorde noen vanlige feil som ikke var vondt ment, vennligst bare bekreft at du er inneforstått med reglene og vi vil fjerne advarslen. Du kan også bli med i denne chatten på discord.gg/SponsorBlock eller matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Stemme avvist på grunn av en advarsel. Klikk for å åpne chatten for å løse dette, eller kom tilbake senere når du har tid.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Donér"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Skjul donasjonslenke"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Mørk modus på instillingssiden"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Takk for at du installerte SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Vennligst se gjennom innstillingene nedenfor"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Mange funksjoner er deaktivert som standard. Om du vil hoppe over introer, outro-er, benytte Invidious osv., aktiver dem nedenfor. Du kan også vise eller skjule UI-elementer."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Hvordan hopping fungerer"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Videosegmenter vil automatisk bli hoppet over hvis de finnes i databasen. Du kan åpne oppsprettsvinduet ved å klikke på utvidelsesikonet for å få en forhåndsvisning av hva de er."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Hver gang du hopper over et segment vil du få et varsel. Hvis tidtakingen ser feil ut stem ned ved å klikke på nedstemme! Du kan også stemme i oppsprettsvinduet."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Innsending"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Innsending kan enten gjøres i oppsprettsvinduet ved å klikke på \"Segmentet starter nå\"-knappen eller i videoavspilleren ved å klikke på knappene på avspilleren."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Klikk på avspillingsknappen angir starten av et segment og klikk på stopp-ikonet angir slutten. Du kan gjøre klar flere sponsorer før du sender inn. Klikk på opplastningsknappen for å sende inn. Klikk på papirkurven for å slette."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Redigering"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Hvis du rotet det til kan du redigere eller slette segmentene dine etter at du har klikket på pil opp-knappen."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Dette er for tidkrevende"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Om du vil kan du bruke hurtigtaster. Trykk på semikolon-tasten for å angi start/stopp av et sponsorsegment og klikk på apostrof for å sende inn. Disse kan endres i innstillinger. Om du ikke bruker QWERTY bør du sannsynligvis endre hurtigtastene."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Kan jeg få en kopi av databasen? Hva hender hvis du forsvinner?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Databasen er offentlig og tilgjengelig på"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Kildekoden er fritt tilgjengelig. Så selv om noe skulle skje med meg vil ikke dine bidrag gå tapt."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Nyheter og hvordan det er laget"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Hvor kan jeg finne kildekoden?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Anerkjennelser"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Les mer"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Stemmer ned og oppretter en lokal kopi som du kan sende inn på nytt"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Åpne denne kategoriens wiki-side."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopiér og stem ned"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Fortsett å stemme"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Dette vil umiddelbart gjelde for dine segmenter"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Bruk musehjulet mens du peker over redigeringsboksen for å raskt justere tiden. Kombinasjoner av ctrl- eller shift-tasten kan brukes til å finjustere endringene."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Nyhet! Se om en video er fullstendig sponset eller selvpromotert"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "t",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Oppførsel",
|
||||
"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": "Grensesnitt",
|
||||
"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": "Hurtigtaster",
|
||||
"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": "Sikkerhetskopiér/gjenskap",
|
||||
"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": "Diverse",
|
||||
"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": "Hopp over-varselutseende",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Fjern",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Ikke angitt"
|
||||
},
|
||||
"change": {
|
||||
"message": "Endre"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Dette er en innebygget YouTube-hurtigtast. Er du sikker på at du vil bruke den?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
"message": "Pokaż informację po pominięciu segmentu"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Duże powiadomienia o przewinięciu"
|
||||
"message": "Pełnowymiarowe powiadomienia o przewinięciu"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Małe powiadomienia o automatycznym przewijaniu"
|
||||
@@ -263,19 +263,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Ustaw klawisz do pomijania segmentów"
|
||||
"message": "Pomiń segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Ustaw klawisz do oznaczania początku/końca segmentu"
|
||||
"message": "Rozpocznij/zatrzymaj segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Ustaw klawisz do wysyłania czasów"
|
||||
"message": "Prześlij segmenty",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Wybierz klawisz, wciskając go na klawiaturze"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Ustawiony klawisz to: "
|
||||
"message": "Wybierz przycisk, wpisując go i wybierz dowolne klucze modyfikujące, których chcesz użyć."
|
||||
},
|
||||
"0": {
|
||||
"message": "Połączenie przerwane z powodu braku odpowiedzi. Sprawdź swoje połączenie z internetem. Jeśli wszystko z nim w porządku oznacza to, że serwer jest prawdopodobnie przeciążony lub nie działa."
|
||||
@@ -307,7 +307,7 @@
|
||||
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Pominąć {0}?"
|
||||
"message": "{0} — pominąć?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Wyciszyć {0}?"
|
||||
@@ -349,9 +349,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Przewinięto "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Oszczędzono sobie "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "min"
|
||||
},
|
||||
@@ -365,10 +362,12 @@
|
||||
"message": "godz."
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Oszczędzono innym"
|
||||
"message": "Oszczędzono innym",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " życia"
|
||||
"message": " życia",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Sprawdź status serwera na status.sponsor.ajay.app"
|
||||
@@ -377,7 +376,7 @@
|
||||
"message": "Importuj/Eksportuj swój identyfikator użytkownika"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Powinno pozostać prywatne. Jest to niczym hasło i nie powinno być nikomu udostępniane. Przy jego użyciu może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie."
|
||||
"message": "To powinno pozostać prywatne. Jest to niczym hasło i nie powinno zostać nikomu udostępnione. Przy jego użyciu ktoś może się pod ciebie podszywać. Jeśli szukasz publicznego ID użytkownika, kliknij ikonę schowka w wyskakującym oknie."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Ustaw identyfikator użytkownika"
|
||||
@@ -388,9 +387,6 @@
|
||||
"createdBy": {
|
||||
"message": "Stworzony przez"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Obecnie ustawiony:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Obsługa stron YouTube firm trzecich"
|
||||
},
|
||||
@@ -440,6 +436,9 @@
|
||||
"shortCheck": {
|
||||
"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."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Pokaż przycisk wysyłania"
|
||||
},
|
||||
@@ -467,6 +466,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importuj/Eksportuj wszystkie ustawienia"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Edytuj/kopiuj"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Zapisz do pliku"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Wczytaj z pliku"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Jest to cała twoja konfiguracja w formacie JSON. Zawarty jest w niej twój identyfikator użytkownika, więc uważaj, komu ją udostępniasz."
|
||||
},
|
||||
@@ -515,11 +523,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"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."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Klucz"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "jest przypisane do innej akcji. Wybierz proszę inny klawisz."
|
||||
"message": "Ten skrót jest przypisany do innej akcji. Proszę wybrać inny."
|
||||
},
|
||||
"to": {
|
||||
"message": "do",
|
||||
@@ -537,6 +542,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Ekskluzywny dostęp"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Ten film pokazuje produkt, usługę lub lokalizację, do których otrzymali darmowy lub subsydiowany dostęp",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Przypomnienie o interakcji (Subskrybuj)"
|
||||
},
|
||||
@@ -567,11 +582,8 @@
|
||||
"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_filler": {
|
||||
"message": "Filtr nietematyczny"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Sceny nietematyczne dodawane tylko dla wypełniacza lub humoru, które nie są wymagane do zrozumienia głównej treści wideo. Nie powinno to obejmować segmentów zawierających informacje kontekstowe lub szczegółowe."
|
||||
"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"
|
||||
@@ -618,6 +630,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Pokaż na pasku"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Wyświetl etykietę"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automatycznie pomiń wszystkie segmenty, gdy istnieje segment niemuzyczny"
|
||||
},
|
||||
@@ -628,9 +643,6 @@
|
||||
"message": "Pokaż ikonę, gdy film jest w całości reklamą",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Nieprawidłowy format koloru. Powinien to być zapis szesnastkowy (heksadecymalny) składający się z 3 lub 6 znaków poprzedzonych kratką (#)."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Nieprzesłany kolor",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -759,7 +771,7 @@
|
||||
"message": "Schowaj na zawsze"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Otrzymałeś ostrzeżenie i nie możesz tymczasowo przesyłać segmentów. Oznacza to, że zauważyliśmy, że popełniłeś/aś pewne powszechne błędy, które nie są złośliwe, Proszę tylko potwierdzić, że rozumiesz zasady i usuniemy ostrzeżenie. Możesz również dołączyć do tego czatu używając discord.gg/SponsorBlock lub matrix.to/#/#sponsor:ajay.app"
|
||||
"message": "Otrzymałeś ostrzeżenie i tymczasowo nie możesz przesyłać segmentów. Oznacza to, że zauważyliśmy, że popełniłeś/aś pewne powszechne błędy, które nie są złośliwe, proszę tylko potwierdzić, że rozumiesz zasady i usuniemy ostrzeżenie. Możesz również dołączyć do tego czatu używając discord.gg/SponsorBlock lub matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Głosowanie odrzucone z powodu ostrzeżenia. Kliknij, aby otworzyć czat w celu rozwiązania problemu lub wróć później, gdy będziesz miał czas.",
|
||||
@@ -769,7 +781,10 @@
|
||||
"message": "Dotacje"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ukryj opcję dotacji"
|
||||
"message": "Ukryj Link Do Dotacji"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Tryb ciemny na stronie opcji"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Dziękujemy za zainstalowanie SponsorBlock."
|
||||
@@ -859,5 +874,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Zachowanie",
|
||||
"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": "Interfejs",
|
||||
"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": "Skróty klawiszowe",
|
||||
"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": "Kopia/przywracanie",
|
||||
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
|
||||
},
|
||||
"optionsTabAdvanced": {
|
||||
"message": "Różne",
|
||||
"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": "Pomiń wygląd wpisu",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Usuń przypisanie",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Nie ustawiono"
|
||||
},
|
||||
"change": {
|
||||
"message": "Zmień"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "To jest wbudowany skrót YouTube. Czy na pewno chcesz go użyć?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -263,19 +263,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Defina a tecla para ignorar um segmento"
|
||||
"message": "Pular segmento",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Defina a tecla para iniciar/interromper o segmento"
|
||||
"message": "Iniciar/parar segmento",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Defina a tecla para enviar o segmento de patrocínio"
|
||||
"message": "Enviar Segmentos",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Selecione uma tecla apertando-a"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "A tecla foi definida para: "
|
||||
"message": "Pressione a tecla desejada e escolha quaisquer teclas modificadoras deseja utilizar."
|
||||
},
|
||||
"0": {
|
||||
"message": "Tempo limite de conexão excedida. Cheque a sua conexão de internet. Se a sua internet estiver funcionando, o servidor está sobrecarregado ou fora do ar."
|
||||
@@ -302,6 +302,10 @@
|
||||
"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": "Pular {0}?"
|
||||
},
|
||||
@@ -345,9 +349,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Você pulou "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Você poupou "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuto"
|
||||
},
|
||||
@@ -361,10 +362,12 @@
|
||||
"message": "horas"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Você poupou das pessoas"
|
||||
"message": "Você poupou das pessoas",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " das vidas dos outros"
|
||||
"message": " das vidas dos outros",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Verifique status.sponsor.ajay.app para o status do servidor."
|
||||
@@ -384,9 +387,6 @@
|
||||
"createdBy": {
|
||||
"message": "Criado por"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Atualmente, está definido para:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Suporte a Sites do YouTube de Terceiros"
|
||||
},
|
||||
@@ -436,6 +436,9 @@
|
||||
"shortCheck": {
|
||||
"message": "A seguinte submissão é mais curta do que sua opção de duração mínima. Isto significa que já foi enviada e que está sendo ignorada devido a esta opção. Tem certeza que deseja enviar mesmo assim?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Não é permitido o envio de segmentos em livestreams ou premieres ainda em andamento. Por favor, aguarde até que terminem, e em seguida, atualize a página e verifique se os segmentos ainda são válidos."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Mostrar botão de envio"
|
||||
},
|
||||
@@ -463,6 +466,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importar/Exportar Todas as Opções"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Editar/copiar"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Exportar para arquivo"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Importar de um arquivo"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Essas são suas preferências no formato JSON. Isso inclui seu ID de usuário, então lembre-se de compartilhar com cuidado."
|
||||
},
|
||||
@@ -511,11 +523,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "A informação de depuração foi copiada para a área de transferência. Sinta-se à vontade para remover qualquer informação que prefira não compartilhar. Salve em um arquivo de texto ou cole-a no relatório de bug."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "A tecla"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "está vinculado a outra ação. Por favor, selecione outra tecla."
|
||||
"message": "Este atalho está vinculado a outra ação. Por favor, selecione um atalho diferente."
|
||||
},
|
||||
"to": {
|
||||
"message": "até",
|
||||
@@ -533,6 +542,16 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Similar a \"patrocinador\", mas para auto promoções e segmentos não-pagos. Isso inclui seções sobre vendas, doações ou informações sobre com quem colaboraram."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Acesso Exclusivo"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Apenas para rotular vídeos inteiros. Usado quando um vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Este vídeo apresenta um produto, serviço ou local ao qual eles receberam acesso gratuito ou subsidiado",
|
||||
"description": "Short description for this category"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Lembrete de interação (inscrever-se)"
|
||||
},
|
||||
@@ -563,9 +582,6 @@
|
||||
"category_preview_description": {
|
||||
"message": "Recapitulação rápida de episódios anteriores, ou uma prévia do que está chegando mais tarde no vídeo atual. Destinado a clipes editados juntos, não para resumos falados."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Enrolando em tangente"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Cenas tangenciais inseridas apenas por enrolação ou humor que não são necessárias para compreender o tópico principal do vídeo. Isto não deve incluir segmentos que fornecem contexto ou detalhes de segundo plano."
|
||||
},
|
||||
@@ -614,14 +630,18 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Mostrar na barra de progresso"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Mostrar Rótulo"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Pular automaticamente todos os segmentos quando há um segmento que não é música"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Permitir segmentos que silenciem o áudio ao invés de pular"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Sua cor está formatada incorretamente. Deve ser um código hexadecimal de 3 ou 6 dígitos com uma cerquilha (hashtag) no início."
|
||||
"fullVideoSegments": {
|
||||
"message": "Mostrar um ícone quando um vídeo é inteiramente um anúncio",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Cor Não Enviada",
|
||||
@@ -737,6 +757,12 @@
|
||||
"message": "Entendi",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"fullVideoTooltipWarning": {
|
||||
"message": "Este segmento é grande. Se o vídeo inteiro for sobre um tópico, altere de \"Pular\" para \"Vídeo completo\". Consulte as diretrizes para obter mais informações."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Este vídeo inteiro está rotulado como esta categoria e está muito integrado para poder ser separado"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Optar por sair de todos os experimentos futuros",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
@@ -757,6 +783,9 @@
|
||||
"hideDonationLink": {
|
||||
"message": "Ocultar o Link de Doação"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Modo Escuro na página de Opções"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Obrigado por instalar o SponsorBlock."
|
||||
},
|
||||
@@ -835,6 +864,9 @@
|
||||
"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."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Novo! Veja quando um vídeo é inteiramente patrocinado ou de autopromoção"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
@@ -842,5 +874,42 @@
|
||||
"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": "Backup/Restauração",
|
||||
"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": "Miscelânea",
|
||||
"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": "Aparência da notificação de pulo",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Desvincular",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Não configurado"
|
||||
},
|
||||
"change": {
|
||||
"message": "Alterar"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Este já é um atalho padrão do YouTube. Tem certeza que deseja utilizá-lo?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,18 +226,6 @@
|
||||
"message": "Dacă nu îți place, apasă butonul nu mai arăta niciodată.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Setați cheia pentru omiterea unui segment"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Setează tasta pentru trimiterea sponsorizării"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Selectează o tastă apasând-o"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tasta a fost setată la: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Eroare de Conexiune. Verifică-ți conexiunea la internet. Daca internetul functionează, serverul este probabil supraîncărcat sau a căzut."
|
||||
},
|
||||
@@ -284,9 +272,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Ai omis "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "V-ați salvat "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minut"
|
||||
},
|
||||
@@ -300,10 +285,12 @@
|
||||
"message": "ore"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Tu ai salvat alte persoane"
|
||||
"message": "Tu ai salvat alte persoane",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " din viața lor"
|
||||
"message": " din viața lor",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Verificați status.sponsor.ajay.app pentru starea serverului."
|
||||
@@ -320,9 +307,6 @@
|
||||
"createdBy": {
|
||||
"message": "Creat De"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". În prezent este setat:"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Activează suportul Invidious, dezactivează autoskip-ul, ascunde butoanele și altele."
|
||||
},
|
||||
@@ -422,12 +406,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Informația de depanare a fost copiată în clipboard. Puteți elimina orice informație pe care nu doriți să o partajați. Salvați într-un fișier sau lipiți-o în raportul de erori."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Tasta"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "este deja setată la o altă acțiune. Vă rugăm să selectați o altă tastă."
|
||||
},
|
||||
"to": {
|
||||
"message": "până la",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -492,9 +470,6 @@
|
||||
"disable": {
|
||||
"message": "Dezactivare"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Culoarea ta este formatată incorect. Ar trebui să fie un cod hexadecimal de 3 sau 6 cifre cu un hash la început."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Culoarea Barei de Derulare"
|
||||
},
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Включить отслеживание пропусков во вкладках инкогнито"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Хранить отрицательные оценки сегментов"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Все сегменты, которым вы поставите отрицательную оценку, будут скрыты даже после обновления страницы"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Предупреждение: Отключение этой настройки удалит все ранее сохранённые оценки"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Запрос по префиксу хэша"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Назначить горячую клавишу для пропуска сегмента"
|
||||
"message": "Пропустить сегмент",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Назначить горячую клавишу для начала/остановки сегмента"
|
||||
"message": "Начало/конец сегмента",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Назначить горячую клавишу для отправки"
|
||||
"message": "Отправить сегменты",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Нажмите клавишу, чтобы выбрать её"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Клавиша назначена на: "
|
||||
"message": "Нажмите на любую кнопку, чтобы выбрать её, а так же выберите модификаторы, если нужно."
|
||||
},
|
||||
"0": {
|
||||
"message": "Таймаут подключения. Проверьте ваше соединение с интернетом. Если ваш интернет работает, сервер, скорее всего, перегружен или лежит."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Вы пропустили "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Вы сэкономили "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "минуту"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "часов"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Вы сэкономили людям"
|
||||
"message": "Вы сэкономили людям",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " их жизней"
|
||||
"message": " их жизней",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Смотрите состояние сервера на status.sponsor.ajay.app."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Создано"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Он сейчас назначен на:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Поддерживать сторонние YouTube-сайты"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Следующий диапазон времени короче, чем Ваша настройка минимальной длительности. Это может означать, что он уже был отправлен, и просто игнорируется из-за этой настройки. Вы действительно хотите отправить?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Отправка сегментов на стримах или премьерах не допускается. Пожалуйста, дождитесь окончания видео, затем обновите страницу и убедитесь, что сегменты всё ещё верные."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Показывать кнопку отправки"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Импорт/Экспорт всех настроек"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Редактировать/скопировать"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Сохранить в файл"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Загрузить из файла"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Все настройки в формате JSON. Этот файл содержит Ваш идентификатор пользователя, будьте осторожны когда делитесь этими данными."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Отладочная информация скопирована в буфер обмена. Вы можете удалить любую информацию, которой не хотите делиться. Сохраните ее в текстовом файле или вставьте в отчет об ошибке."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Клавиша"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "привязана к другому действию. Пожалуйста, выберите другую клавишу."
|
||||
"message": "Это сочетание клавиш привязано к другому действию. Пожалуйста, выберите другое сочетание."
|
||||
},
|
||||
"to": {
|
||||
"message": "до",
|
||||
@@ -541,7 +555,7 @@
|
||||
"message": "Эксклюзивный доступ"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Категория для всего видео. Используется когда видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ."
|
||||
"message": "Категория для всего видео. Используется, когда видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"message": "Это видео демонстрирует продукт, сервис или местоположение, к которому автор получил бесплатный или проспонсированный доступ",
|
||||
@@ -578,7 +592,7 @@
|
||||
"message": "Краткое содержание предыдущих эпизодов или предварительный просмотр того, что будет в данном видео. Предназначено для сегментов, смонтированных из кусков видео, а не для устных пересказов."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Заполнение отвлечёнными темами"
|
||||
"message": "Заполнение отвлечёнными темами/шутками"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Сегменты, которые увеличивают длительность видео за счёт отвлечённых тем или шуток, но не требуются для понимания основного содержания. Не должно иметь сегментов, объясняющие контекст или предысторию."
|
||||
@@ -629,7 +643,7 @@
|
||||
"message": "Показывать в полосе прокрутки"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Отображать название"
|
||||
"message": "Показывать категорию"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Пропускать все сегменты автоматически при наличии сегмента без музыки"
|
||||
@@ -641,9 +655,6 @@
|
||||
"message": "Показывать иконку, когда всё видео является рекламой",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Вы ввели цвет в неправильном формате. Это должно быть 3-х или 6-ти значное шестнадцатеричное число с символом # в начале."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Цвет неотправленного сегмента",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,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, если вы считаете, что это так, оставьте комментарий здесь:"
|
||||
@@ -762,7 +776,7 @@
|
||||
"message": "Этот сегмент большой. Если в видео только одна тема, то измените значение с «Пропустить» на «Всё видео». Дополнительную информацию смотрите в руководстве."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Это видео помечено как данная категория и слишком сильно интегрировано для разделения"
|
||||
"message": "Данная категория применена для всего видео, так как она тесно интегрирована в видео"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Отказаться от всех будущих экспериментов",
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Пожертвовать"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Помогите финансировать разработку"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Скрыть ссылку на пожертвование"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Тёмный режим на странице настроек"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Спасибо за установку SponsorBlock."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"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. Вы уверены, что хотите его использовать?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,21 +262,6 @@
|
||||
"message": "Ak sa vám to stále nepáčí, stlačte tlačidlo Nikdy nezobrazovať.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Nastaviť kláves pre preskočenie segmentu"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Nastaviť kláves pre začiatok/ukončenie segmentu"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Nastaviť kláves pre odoslanie segmentu"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Stlačte požadovaný kláves"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Kláves bol nastavený na: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Spojenie vypršalo. Skontrolujte svoje internetové pripojenie. Ak vám internet funguje, server je pravdepodobne preťažený alebo nefunkčný."
|
||||
},
|
||||
@@ -349,9 +334,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Preskočili ste "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Ušetrili ste "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minúta"
|
||||
},
|
||||
@@ -365,10 +347,12 @@
|
||||
"message": "hodiny"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Ostatným ste ušetrili"
|
||||
"message": "Ostatným ste ušetrili",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " z ich života"
|
||||
"message": " z ich života",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Stav servera skontrolujete na status.sponsor.ajay.app."
|
||||
@@ -388,9 +372,6 @@
|
||||
"createdBy": {
|
||||
"message": "Vytvoril"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Aktuálne je nastavené na:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Podpora alternatívnych Youtube webov"
|
||||
},
|
||||
@@ -440,6 +421,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Segment je kratší ako vami nastavená minimálna dĺžka. Možno už bol niekým odoslaný a kvôli tomuto nastaveniu je teraz ignorovaný. Naozaj ho chcete odoslať?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Vytváranie segmentov v aktívnom živom prenose alebo premiére nie je dovolené. Počkajte prosím na jeho ukončenie, potom obnovte stránku a skontrolujte, či sú segmenty správne vytvorené."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Ukázať Nahrávacie Tlačidlo"
|
||||
},
|
||||
@@ -515,12 +499,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Debug informácie boli skopírované do schránky. Ak chcete, môžete odstrániť akékoľvek informácie, ktoré nechcete zdieľať. Uložte si ich do textového súboru alebo ich vložte do nahlásenia chyby."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Kľúč"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "je pridelený pre inú akciu. Prosím zvoľte inú klávesu."
|
||||
},
|
||||
"to": {
|
||||
"message": "do",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -537,6 +515,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Exkluzívny Prístup"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Iba pre označovanie celých videí. Používa sa, keď video predstavuje produkt, službu alebo miesto, ku ktorým získali bezplatný alebo dotovaný prístup."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"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_interaction": {
|
||||
"message": "Pripomienka interakcie (Prihlásiť sa na odber)"
|
||||
},
|
||||
@@ -567,9 +555,6 @@
|
||||
"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_filler": {
|
||||
"message": "Odbočka mimo tému"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -618,6 +603,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Zobraziť v časovej lište"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Ukázať Označenie"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Automaticky preskočiť všetky segmenty ak neexistuje segment bez hudby"
|
||||
},
|
||||
@@ -628,9 +616,6 @@
|
||||
"message": "Zobraziť ikonu, ak je celé video reklama",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Vaša farba je nesprávne naformátovaná. Mal by to byť 3 alebo 6-miestny hexadecimálny kód so znakom čísla na začiatku."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Neodoslaná farba",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktivera spåra antalet hoppa över i privata/inkognitoflikar"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Lagra segmentnerröstningar"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Alla segment du röstat ner kommer att förbli dolda även efter uppdatering"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Varning: Om detta inaktiveras kommer alla tidigare lagrade nerröstningar att tas bort"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Fråga efter hash-prefix"
|
||||
},
|
||||
@@ -222,7 +231,7 @@
|
||||
"message": "Om videon är ny och inga segment hittades då kommer den att uppdateras med några minuters mellanrum medan du tittar på videon."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Visa Notisen Igen"
|
||||
"message": "Visa meddelandet igen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Visa ett meddelande efter att ett segment har hoppats över"
|
||||
@@ -255,27 +264,27 @@
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "Den här notisen har förbättrats!",
|
||||
"message": "Det här meddelandet har förbättrats!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Om du ändå inte gillar det, tryck på \"Visa aldrig\"-knappen.",
|
||||
"message": "Om du ändå inte gillar det, tryck på knappen visa aldrig.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Ställ in knapp för att hoppa över ett segment"
|
||||
"message": "Hoppa över segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Ange den genväg som ska fungera som start-/stopptangent för ett segment"
|
||||
"message": "Starta/stoppa segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Ange den tangent som ska fungera som inskickningstangent"
|
||||
"message": "Skicka in segment",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Ange tangent genom att trycka på den"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Kopplad till: "
|
||||
"message": "Välj en tangent genom att trycka på den och välj sedan en av modifieringstangenterna som du vill använda."
|
||||
},
|
||||
"0": {
|
||||
"message": "Anslutningsfel. Se över din internetanslutning. Om du kan komma åt internet så är servern förmodligen överbelastad eller nere."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Du har hoppat över "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Du har sparat "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minuter"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "timmar"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Du har sparat andra"
|
||||
"message": "Du har sparat andra",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " av deras liv"
|
||||
"message": " av deras liv",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Gå till status.sponsor.ajay.app för serverstatus."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Skapad av"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Nuvarande snabbtangent är:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Stöd för tredjeparts YouTube-webbplatser"
|
||||
},
|
||||
@@ -432,7 +437,7 @@
|
||||
"message": "Segment som är kortare än det angivna värdet kommer inte att hoppas över eller visas i spelaren."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Hoppa över varaktighet (sekunder):"
|
||||
"message": "Varaktighet på hoppa över-meddelande (sekunder):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Meddelandet om att hoppa över kommer att visas på skärmen åtminstone så här länge. För manuell överhoppning kan det visas längre."
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Följande rapport är kortare än ditt minstavärde i inställningarna. Det skulle kunna betyda att det redan är rapporterat och bara ignorerat på grund av denna inställning. Är du säker på att du vill rapportera?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Att skicka in på en aktiv liveström eller premiär är inte tillåtet. Vänta tills den är färdig, uppdatera sedan sidan och kontrollera att segmenten fortfarande är giltiga."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Visa uppladdningsknapp"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Importera/Exportera alla alternativen"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Redigera/kopiera"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Spara till fil"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Ladda från fil"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Detta är alla dina alternativ i JSON-format. Det inkluderar ditt användar-ID, så var noga med hur du hanterar informationen."
|
||||
},
|
||||
@@ -480,7 +497,7 @@
|
||||
"message": "Denna JSON är inte korrekt formaterad. Dina alternativ har inte ändrats."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Rapportera Segment"
|
||||
"message": "Skicka in segment"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Skicka"
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Debuginformationen har kopierats till urklipp. Ta bort eventuell information du inte vill dela med dig av. Spara informationen i en textfil eller klistra in den i en buggrapport."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Nyckeln"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "är kopplad till en annan funktion. Välj en annan knapp."
|
||||
"message": "Denna genväg är bunden till en annan åtgärd. Du måste välja en annan."
|
||||
},
|
||||
"to": {
|
||||
"message": "till",
|
||||
@@ -578,7 +592,7 @@
|
||||
"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_filler": {
|
||||
"message": "Ämnesavvikelse"
|
||||
"message": "Ämnesavvikelse/Skämt"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Tangentiella scener endast tillagda för utfyllnad eller humor som inte krävs för att förstå det huvudsakliga innehållet i videon. Detta bör inte omfatta segment som tillhandahåller innehåll eller bakgrundsdetaljer."
|
||||
@@ -641,9 +655,6 @@
|
||||
"message": "Visa en ikon när hela videon är en annons",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Din färg är felaktigt formaterad. Det ska vara en 3- eller 6-siffrig hex-kod med en siffra i början."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Färg på ej inskickade",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "dold: för kort"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "manuellt dold"
|
||||
},
|
||||
"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:t är inte laddat ännu. Om du använder en inbäddad video, prova att använda YouTube-hemsidan istället. Detta kan också bero på förändringar i layouten hos YouTube och om du tror så är fallet kommentera det här:"
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Donera"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Hjälp till att finansiera utvecklingen"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Dölj donationslänk"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Mörkt läge på Alternativsidan"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Tack för att du installerade SponsorBlock."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Beteende",
|
||||
"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": "Gränssnitt",
|
||||
"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": "Tangentbordsgenvägar",
|
||||
"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": "Säkerhetskopiera/Återställ",
|
||||
"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": "Diverse",
|
||||
"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": "Utseende på hoppa över-meddelandet",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Ta bort genväg",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Inte inställd"
|
||||
},
|
||||
"change": {
|
||||
"message": "Ändra"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Detta är en inbyggd YouTube-genväg. Är du säker på att du vill använda den?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,21 +262,6 @@
|
||||
"message": "உங்களுக்கு இன்னும் பிடிக்கவில்லை என்றால், ஒருபோதும் காண்பி பொத்தானை அழுத்தவும்.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "ஒரு பகுதியைத் தவிர்ப்பதற்கான விசையை அமைக்கவும்"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "துவக்க/நிறுத்த பிரிவு விசைப்பலகைக்கு விசையை அமைக்கவும்"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "சமர்ப்பிக்கும் விசைப்பலகைக்கு விசையை அமைக்கவும்"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "ஒரு விசையைத் தட்டச்சு செய்வதன் மூலம் அதைத் தேர்ந்தெடுக்கவும்"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "விசைப்பலகை இதற்கு அமைக்கப்பட்டுள்ளது: "
|
||||
},
|
||||
"0": {
|
||||
"message": "இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்."
|
||||
},
|
||||
@@ -345,9 +330,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "நீங்கள் தவிர்த்துவிட்டீர்கள் "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "உங்களை நீங்களே காப்பாற்றிக் கொண்டீர்கள் "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "நிமிடம்"
|
||||
},
|
||||
@@ -361,10 +343,12 @@
|
||||
"message": "மணி"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "நீங்கள் மக்களைக் காப்பாற்றியுள்ளீர்கள்"
|
||||
"message": "நீங்கள் மக்களைக் காப்பாற்றியுள்ளீர்கள்",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " அவர்களின் வாழ்க்கையில்"
|
||||
"message": " அவர்களின் வாழ்க்கையில்",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "சேவையக நிலைக்கு status.sponsor.ajay.app ஐச் சரிபார்க்கவும்."
|
||||
@@ -384,9 +368,6 @@
|
||||
"createdBy": {
|
||||
"message": "உருவாக்கியது"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". இது தற்போது அமைக்கப்பட்டுள்ளது:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "3 வது தரப்பு YouTube-தளங்களை ஆதரிக்கவும்"
|
||||
},
|
||||
@@ -511,12 +492,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "பிழைத்திருத்த தகவல்கள் கிளிப் போர்டில் நகலெடுக்கப்பட்டுள்ளன. நீங்கள் பகிர விரும்பாத எந்த தகவலையும் அகற்ற தயங்க. இதை உரை கோப்பில் சேமிக்கவும் அல்லது பிழை அறிக்கையில் ஒட்டவும்."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "சாவி"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "மற்றொரு செயலுடன் பிணைக்கப்பட்டுள்ளது. மற்றொரு விசையைத் தேர்ந்தெடுக்கவும்."
|
||||
},
|
||||
"to": {
|
||||
"message": "க்கு",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -596,9 +571,6 @@
|
||||
"disable": {
|
||||
"message": "முடக்கு"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "உங்கள் நிறம் தவறாக வடிவமைக்கப்பட்டுள்ளது. இது ஆரம்பத்தில் எண் அடையாளத்துடன் 3 அல்லது 6 இலக்க ஹெக்ஸ் குறியீடாக இருக்க வேண்டும்."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "பார் வண்ணத்தைத் தேடுங்கள்"
|
||||
},
|
||||
|
||||
@@ -226,18 +226,6 @@
|
||||
"message": "మీకు ఇంకా నచ్చకపోతే, ఎప్పుడూ చూపించు బటన్ నొక్కండి.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "విభాగాన్ని దాటవేయడానికి కీని సెట్ చేయండి"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "సమర్పణ కీబైండ్ కోసం కీని సెట్ చేయండి"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "కీని టైప్ చేయడం ద్వారా దాన్ని ఎంచుకోండి"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "కీబైండ్ దీనికి సెట్ చేయబడింది: "
|
||||
},
|
||||
"0": {
|
||||
"message": "అనుసంధాన సమయం సమాప్తం. మీ ఇంటర్నెట్ కనెక్షన్ను తనిఖీ చేయండి. మీ ఇంటర్నెట్ పనిచేస్తుంటే, సర్వర్ ఓవర్లోడ్ లేదా డౌన్ అయి ఉండవచ్చు."
|
||||
},
|
||||
@@ -284,9 +272,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "మీరు దాటవేశారు "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "మీరు మీరే రక్షించుకున్నారు "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "నిమిషం"
|
||||
},
|
||||
@@ -300,10 +285,12 @@
|
||||
"message": "గంటలు"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "మీరు ప్రజలను రక్షించారు"
|
||||
"message": "మీరు ప్రజలను రక్షించారు",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " వారి జీవితాల"
|
||||
"message": " వారి జీవితాల",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "సర్వర్ స్థితి కోసం status.sponsor.ajay.app ని తనిఖీ చేయండి."
|
||||
@@ -320,9 +307,6 @@
|
||||
"createdBy": {
|
||||
"message": "సృష్టికర్త"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". ఇది ప్రస్తుతం దీనికి సెట్ చేయబడింది:"
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "ఇన్విడియస్ మద్దతును ప్రారంభించండి, ఆటోస్కిప్ను డిసేబుల్ చేయండి, బటన్లను దాచు మరియు మరిన్ని చేయండి."
|
||||
},
|
||||
@@ -422,12 +406,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "డీబగ్ సమాచారం క్లిప్ బోర్డ్కు కాపీ చేయబడింది. మీరు భాగస్వామ్యం చేయని సమాచారాన్ని తొలగించడానికి సంకోచించకండి. దీన్ని టెక్స్ట్ ఫైల్లో సేవ్ చేయండి లేదా బగ్ రిపోర్ట్లో అతికించండి."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "కీ"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "మరొక చర్యకు కట్టుబడి ఉంటుంది. దయచేసి మరొక కీని ఎంచుకోండి."
|
||||
},
|
||||
"to": {
|
||||
"message": "కు",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -495,9 +473,6 @@
|
||||
"disable": {
|
||||
"message": "డిసేబుల్"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "మీ రంగు తప్పుగా ఆకృతీకరించబడింది. ఇది ప్రారంభంలో సంఖ్య గుర్తుతో 3 లేదా 6 అంకెల హెక్స్ కోడ్ అయి ఉండాలి."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "బార్ కలర్ కోరుకుంటారు"
|
||||
},
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
"message": "Sponsor sürelerini yollarken bir sorun oluştur, lütfen tekrar deneyin."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Bu videonun kısımları veri tabanımızda mevut"
|
||||
"message": "Bu videonun kısımları veri tabanımızda mevcut"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Kısım bulunamadı"
|
||||
@@ -263,19 +263,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Kısım atlamak için bir tuş ata"
|
||||
"message": "Kısmı atla",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Kısım başlatmak/durdurmak için kısayol ayarla"
|
||||
"message": "Kısmı başlat/durdur",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Gönderim için bir tuş belirleyin"
|
||||
"message": "Kısımları gönder",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Yazarak bir tuş seçin"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tuş seçimi şu tuşa ayarlandı: "
|
||||
"message": "Kullanmak istediğiniz tuşu yazın ve kombine etmek istediğiniz tuşları seçin."
|
||||
},
|
||||
"0": {
|
||||
"message": "Bağlantı zaman aşımına uğradı. İnternet bağlantınızı kontrol ediniz. Eğer internetiniz çalışıyor ise, büyük ihtimalle sunucuya erişilemiyor veya sunucuya aşırı yüklenilmiş olabilir."
|
||||
@@ -349,9 +349,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Şu kadar kısım atladınız: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Şu kadar süre kazandınız "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "dakika"
|
||||
},
|
||||
@@ -365,10 +362,12 @@
|
||||
"message": "saat"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "İnsanların şu kadar vaktini kurtardınız:"
|
||||
"message": "İnsanların şu kadar vaktini kurtardınız:",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " yaşam süresi"
|
||||
"message": " yaşam süresi",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Sunucu durumu için status.sponsor.ajay.app kontrol edin."
|
||||
@@ -388,9 +387,6 @@
|
||||
"createdBy": {
|
||||
"message": "Oluşturan"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Şu an buna ayarlı:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "3. Taraf Youtube Sitelerini Destekle"
|
||||
},
|
||||
@@ -440,6 +436,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Sıradaki öneri belirlediğiniz minimum süre ayarından daha kısa. Bu zaten yollandığı ve bu ayardan dolayı yok sayıldığı anlamına gelebilir. Göndermek istediğinizden emin misiniz?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Bir canlı yayın veya ön gösterim sırasında kısım gönderilemez. Yayının bitmesini bekleyin, sonra sayfayı tazeleyip kısımların geçerli olduğunu kontrol edin."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Karşıya Yükleme Butonunu Göster"
|
||||
},
|
||||
@@ -467,6 +466,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Bütün Ayarlarını İçe/Dışa Aktar"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Düzenle/kopyala"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Dosyaya kaydet"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Dosyadan yükle"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Bu, JSON formatında bütün kurulumunuzu gösterir. Kullanıcı kimliğinizi içerir, bu sebeple paylaşırken dikkatli olun."
|
||||
},
|
||||
@@ -515,11 +523,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Bu çözüm bilgisi panoya kopyalandı. Paylaşmak istemediğiniz herhangi bir bilgiyi silmekte özgürsünüz. Bir yazı dosyası olarak kaydedin veya hata raporuna kopyalayın."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Anahtar"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "başka bir eyleme bağlı. Lütfen başka bir anahtar seçin."
|
||||
"message": "Bu kısayol başka bir eyleme atanmış. Lütfen başka kısayol seçin."
|
||||
},
|
||||
"to": {
|
||||
"message": "'e",
|
||||
@@ -537,6 +542,16 @@
|
||||
"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_exclusive_access": {
|
||||
"message": "Özel Erişim"
|
||||
},
|
||||
"category_exclusive_access_description": {
|
||||
"message": "Yalnızca bütün videoyu etiketlemek için kullanın. Video; ücretli veya ücretsiz elde edilen bir ürünün, hizmetin veya bir yerin reklamını yapıyorsa kullanılır."
|
||||
},
|
||||
"category_exclusive_access_pill": {
|
||||
"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_interaction": {
|
||||
"message": "Etkileşim Hatırlatıcısı (Abonelik)"
|
||||
},
|
||||
@@ -567,9 +582,6 @@
|
||||
"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_filler": {
|
||||
"message": "Alakasız Konu"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Videonun ana içeriğini anlamak için gerekli olmayan, yalnızca alakasız konu veya mizah için eklenen sahneler. Bu, alakalı veya arka plan ayrıntısı veren kısımları içermemelidir."
|
||||
},
|
||||
@@ -618,6 +630,9 @@
|
||||
"showOverlay_POI": {
|
||||
"message": "Arama Çubuğunda Göster"
|
||||
},
|
||||
"showOverlay_full": {
|
||||
"message": "Etiketi Göster"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Müzik olmayan kısım varsa tüm kısımları otomatik atla"
|
||||
},
|
||||
@@ -628,9 +643,6 @@
|
||||
"message": "Video bütünüyle bir reklamsa simge göster",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Renginiz yanlış biçimlendirilmiştir. Başında bir kare işareti bulunan 3 veya 6 basamaklı bir onaltılık kod olmalıdır."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Gönderilmemiş Renk",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -682,6 +694,9 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "gizlendi: çok kısa"
|
||||
},
|
||||
"manuallyHidden": {
|
||||
"message": "elle gizlendi"
|
||||
},
|
||||
"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 kimliği henüz yüklenmedi. Gömülü bir video kullanıyorsanız, bunun yerine YouTube ana sayfasından izlemeyi deneyin. Bu, YouTube düzenindeki değişikliklerden de kaynaklanabilir, eğer öyleyse, buraya bir yorum yazın:"
|
||||
@@ -768,9 +783,15 @@
|
||||
"Donate": {
|
||||
"message": "Bağış Yap"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Geliştirme sürecinin fonlanmasına yardım et"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Bağış Bağlantısını Gizle"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Ayarlar Sayfasında Karanlık Modu"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "SponsorBlock'u yüklediğiniz için teşekkürler."
|
||||
},
|
||||
@@ -850,7 +871,7 @@
|
||||
"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."
|
||||
},
|
||||
"categoryPillNewFeature": {
|
||||
"message": "Yeni! Videonun bütünü sponsor veya kendi reklamıysa öngörün"
|
||||
"message": "Yeni! Videonun bütünü sponsor veya kendi reklamıysa bu uyarıyı görün"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
@@ -859,5 +880,42 @@
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
},
|
||||
"optionsTabBehavior": {
|
||||
"message": "Davranış",
|
||||
"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": "Arayüz",
|
||||
"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": "Klavye kısayolları",
|
||||
"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": "Yedekle/Geri Yükle",
|
||||
"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": "Çeşitli",
|
||||
"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": "Atlama uyarısı görünümü",
|
||||
"description": "Option label"
|
||||
},
|
||||
"unbind": {
|
||||
"message": "Klavye kısayolunu kaldır",
|
||||
"description": "Unbind keyboard shortcut"
|
||||
},
|
||||
"notSet": {
|
||||
"message": "Ayarlanmadı"
|
||||
},
|
||||
"change": {
|
||||
"message": "Değiştir"
|
||||
},
|
||||
"youtubeKeybindWarning": {
|
||||
"message": "Bu kısayol YouTube tarafından kullanılıyor. Bunu kullanmak istediğinize emin misiniz?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,6 +209,15 @@
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Увімкнути відстеження пропусків у вкладках інкогніто"
|
||||
},
|
||||
"enableTrackDownvotes": {
|
||||
"message": "Зберігати голоси \"проти\" сегментів"
|
||||
},
|
||||
"whatTrackDownvotes": {
|
||||
"message": "Усі сегменти, за які ви проголосуєте \"проти\", залишаться прихованими навіть після оновлення"
|
||||
},
|
||||
"trackDownvotesWarning": {
|
||||
"message": "Попередження: вимкнення цієї опції призведе до видалення всіх раніше збережених голосів \"проти\""
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Пошук по частині хеша"
|
||||
},
|
||||
@@ -263,19 +272,19 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Призначити гарячу клавішу для пропуску сегмента"
|
||||
"message": "Пропустити сегмент",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Призначити гарячу клавішу для початку/зупинки сегмента"
|
||||
"message": "Почати/зупинити сегмент",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Призначити гарячу клавішу для надсилання"
|
||||
"message": "Надіслати сегменти",
|
||||
"description": "Keybind label"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Натисніть, щоб вибрати її"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Кнопка призначена на: "
|
||||
"message": "Виберіть клавішу, набравши її та виберіть бажану клавішу-модифікатор."
|
||||
},
|
||||
"0": {
|
||||
"message": "Таймаут підключення. Перевірте ваше з'єднання з інтернетом. Якщо ваш інтернет працює, сервер, швидше за все, перевантажений або лежить."
|
||||
@@ -349,9 +358,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Ви пропустили "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Ви заощадили "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "хвилину"
|
||||
},
|
||||
@@ -365,10 +371,12 @@
|
||||
"message": "годин"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Ви заощадили людям"
|
||||
"message": "Ви заощадили людям",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " їх життів"
|
||||
"message": " їх життів",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Дивіться стан сервера на status.sponsor.ajay.app."
|
||||
@@ -388,9 +396,6 @@
|
||||
"createdBy": {
|
||||
"message": "Створено"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Він зараз призначений на:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Підтримувати сторонні YouTube-сайти"
|
||||
},
|
||||
@@ -440,6 +445,9 @@
|
||||
"shortCheck": {
|
||||
"message": "Наступний діапазон часу коротше, ніж Ваше налаштування мінімальної тривалості. Це може означати, що він вже був надісланий, і просто ігнорується через це налаштування. Ви дійсно хочете надіслати?"
|
||||
},
|
||||
"liveOrPremiere": {
|
||||
"message": "Надсилання під час прямого ефіру чи прем'єри не дозволено. Будь ласка, зачекайте до завершення, потім оновіть сторінку і переконайтеся, що сегменти все ще дійсні."
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Показувати кнопку надсилання"
|
||||
},
|
||||
@@ -467,6 +475,15 @@
|
||||
"exportOptions": {
|
||||
"message": "Імпорт/Експорт всіх налаштувань"
|
||||
},
|
||||
"exportOptionsCopy": {
|
||||
"message": "Змінити/копіювати"
|
||||
},
|
||||
"exportOptionsDownload": {
|
||||
"message": "Зберегти до файлу"
|
||||
},
|
||||
"exportOptionsUpload": {
|
||||
"message": "Завантажити з файлу"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Це вся конфігурація в форматі JSON. Цей файл містить Ваш ідентифікатор користувача, тому не забудьте ділитися з цим розумно."
|
||||
},
|
||||
@@ -515,11 +532,8 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "Інформація про налагодження скопійована в буфер обміну. Ви можете видалити будь-яку інформацію, якої не хочете ділитися. Збережіть її в текстовий файл, вставте в звіт про помилку."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Ключ"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "прив'язана до іншого дії. Будь ласка, оберіть іншу клавішу."
|
||||
"message": "Ця клавіша/комбінація клавіш прив'язана до іншої дії. Будь ласка виберіть іншу клавішу."
|
||||
},
|
||||
"to": {
|
||||
"message": "до",
|
||||
@@ -578,7 +592,7 @@
|
||||
"message": "Короткий зміст попередніх епізодів або попередній перегляд того, що буде в даному відео. Призначено для сегментів, змонтованих зі шматків відео, а не для усних переказів."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Дотичне наповнення"
|
||||
"message": "Дотичне наповнення/Жарти"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Дотичні сцени додані лише для наповнення або гумору, які не потрібні для розуміння основного вмісту відео. Це не повинно включати сегменти, що надають контекст або передісторію."
|
||||
@@ -641,9 +655,6 @@
|
||||
"message": "Показувати значок, коли все відео є рекламою",
|
||||
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Ви ввели колір в неправильному форматі. Це повинно бути 3-х або 6-ти значне шістнадцяткове число з символом # на початку."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Колір не надісланого сегмента",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
@@ -695,6 +706,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, якщо ви вважаєте, що це так, залиште коментар тут:"
|
||||
@@ -762,7 +776,7 @@
|
||||
"message": "Цей сегмент великий. Якщо все відео на одну тему, тоді змініть значення з \"Пропустити\" на \"Повне відео\". Продивіться керівництво для додаткової інформації."
|
||||
},
|
||||
"categoryPillTitleText": {
|
||||
"message": "Все це відео позначене як ця категорія, і воно занадто інтегровано, щоб його було розділити"
|
||||
"message": "Все відео позначене цією категорією, воно є її уособленням, тож категорію неможливо виокремити."
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Відмова від усіх майбутніх експериментів",
|
||||
@@ -781,9 +795,15 @@
|
||||
"Donate": {
|
||||
"message": "Пожертвувати"
|
||||
},
|
||||
"considerDonating": {
|
||||
"message": "Допомогти з фінансуванням розробки"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Приховати посилання на пожертвування"
|
||||
},
|
||||
"darkModeOptionsPage": {
|
||||
"message": "Темний режим на сторінці налаштувань"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Дякую за встановлення SponsorBlock."
|
||||
},
|
||||
@@ -872,5 +892,42 @@
|
||||
"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. Ви впевнені що хочете її використовувати?"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -262,21 +262,6 @@
|
||||
"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": "Chọn phím tắt để bỏ qua phân đoạn"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Đặt phím nóng đánh dấu một phân đoạn bắt đầu/kết thúc"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Đặt phím tắt đăng đoạn quảng cáo"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Chọn phím bằng cách gõ phím"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Phím tắt đã được đặt thành: "
|
||||
},
|
||||
"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."
|
||||
},
|
||||
@@ -349,9 +334,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "Bạn đã bỏ qua "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Bạn đã tiết kiệm cho mình "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "phút"
|
||||
},
|
||||
@@ -365,10 +347,12 @@
|
||||
"message": "giờ"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Bạn đã giúp người khác tiết kiệm được"
|
||||
"message": "Bạn đã giúp người khác tiết kiệm được",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " của cuộc đời họ"
|
||||
"message": " của cuộc đời họ",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Truy cập trang status.sponsor.ajay.app để biết tình trạng máy chủ."
|
||||
@@ -388,9 +372,6 @@
|
||||
"createdBy": {
|
||||
"message": "Được tạo bởi"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Phím đang được đặt:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Hỗ trợ các trang web Youtube thuộc bên thứ 3"
|
||||
},
|
||||
@@ -515,12 +496,6 @@
|
||||
"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."
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Phím"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "đang được đặt thực hiện hành động khác. Xin hãy chọn phím khác."
|
||||
},
|
||||
"to": {
|
||||
"message": "đến",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -537,6 +512,9 @@
|
||||
"category_selfpromo_description": {
|
||||
"message": "Tương tự như 'nhà tài trợ' ngoại trừ việc quảng cáo không được trả tiền hay tự quảng cáo. Điều này bao gồm các phần hàng hóa, đóng góp, hoặc thông tin về người mà họ hợp tác cùng."
|
||||
},
|
||||
"category_exclusive_access": {
|
||||
"message": "Truy cập riêng"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Nhắc tương tác (Đăng ký)"
|
||||
},
|
||||
@@ -567,9 +545,6 @@
|
||||
"category_preview_description": {
|
||||
"message": "Tóm tắt nhanh về tập trước/tập sau trong 1 chuỗi video (series) dài (hoặc cũng có thể là tóm tắt trước về video sắp chiếu)."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Cảnh phụ"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Tập hợp các cảnh không bắt buộc để xem trong video. Điều này không bao gồm các đoạn chứa nội dung hoặc nói về ngữ cảnh của video."
|
||||
},
|
||||
@@ -624,9 +599,6 @@
|
||||
"muteSegments": {
|
||||
"message": "Cho phép các phân đoạn bị tắt tiếng hay vì bỏ qua"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Mã màu sai định dạng. Mã màu phải có 3 hoặc 6 ký tự hệ hex và có dấu thăng ở đầu."
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Màu khi chưa được gửi đi",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
|
||||
@@ -229,18 +229,6 @@
|
||||
"message": "如果您依然不喜欢它,请按下不再显示按钮。",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "设置用于跳过片段的按键"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "设定提交的绑定按键"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "点击您想选择的按键"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "绑定按键已被设定为: "
|
||||
},
|
||||
"0": {
|
||||
"message": "连接超时。请检查您的网络连接。如果您的网络运行正常,则可能是服务器过载或宕机。"
|
||||
},
|
||||
@@ -287,9 +275,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "您已跳过 "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "您为自己节省了 "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "分钟"
|
||||
},
|
||||
@@ -303,10 +288,12 @@
|
||||
"message": "小时"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "您为大家节省了"
|
||||
"message": "您为大家节省了",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " 的生命"
|
||||
"message": " 的生命",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "在 status.sponsor.ajay.app 检查服务器状态。"
|
||||
@@ -323,9 +310,6 @@
|
||||
"createdBy": {
|
||||
"message": "创建者"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。目前被设定为:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "支持第三方 YouTube 网站"
|
||||
},
|
||||
@@ -428,12 +412,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "调试信息已复制到剪切板中。 您可以随意移除任何您不想分享的信息。请将其另存为 .txt 文件或粘贴到错误报告中。"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "按键"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "已绑定其他操作。请选择其他按键。"
|
||||
},
|
||||
"to": {
|
||||
"message": "到",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -501,9 +479,6 @@
|
||||
"disable": {
|
||||
"message": "禁用"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "颜色格式错误。应为以“#”开头的 3 位或 6 位十六进制数字。"
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "拖动条颜色"
|
||||
},
|
||||
|
||||
@@ -241,21 +241,6 @@
|
||||
"message": "如果您還是不喜歡它,請按下永不顯示按鈕",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "設定跳過段落的快捷鍵"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "設定開始/結束片段快捷鍵"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "設定提交快捷鍵"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "按下您想選擇的按鍵"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "快捷鍵已設定為: "
|
||||
},
|
||||
"0": {
|
||||
"message": "連線超時。請檢查您的網路連線。若您的網路運作正常,則可能是伺服器超載或離線"
|
||||
},
|
||||
@@ -306,9 +291,6 @@
|
||||
"youHaveSkipped": {
|
||||
"message": "您已跳過 "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "您為自己節省了 "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "分鐘"
|
||||
},
|
||||
@@ -322,10 +304,12 @@
|
||||
"message": "小時"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "您已為大家節省"
|
||||
"message": "您已為大家節省",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " 的生命。"
|
||||
"message": " 的生命。",
|
||||
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "在 status.sponsor.ajay.app 檢查伺服器狀態"
|
||||
@@ -342,9 +326,6 @@
|
||||
"createdBy": {
|
||||
"message": "作者"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。它目前被設定為:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "支援第三方的 YouTube 網站"
|
||||
},
|
||||
@@ -466,12 +447,6 @@
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "除錯資訊已複製到剪貼板中。您可以任意移除任何您不想分享的資訊。請將其另存為文字文件或貼到錯誤報告中。"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "按鍵"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "已經綁定其它動作。請選擇其他按鍵"
|
||||
},
|
||||
"to": {
|
||||
"message": "到",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
@@ -551,9 +526,6 @@
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "自動跳過非音樂片段(如果有的話)"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "您設定的顏色無效。它應該是三或六位數的 hex 碼,且以井字號開頭。"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "未提交的顏色",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
|
||||
@@ -594,7 +594,7 @@ input::-webkit-inner-spin-button {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.sponsorBlockTooltip::after {
|
||||
.sponsorBlockTooltip.sbTriangle::after {
|
||||
content: " ";
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
@@ -628,6 +628,7 @@ input::-webkit-inner-spin-button {
|
||||
font-size: 75%;
|
||||
height: 100%;
|
||||
align-items: center;
|
||||
inline-size: max-content;
|
||||
}
|
||||
|
||||
.sponsorBlockCategoryPillTitleSection {
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
<title> SponsorBlock </title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<link rel="icon" href="../icons/IconSponsorBlocker32px.png" type="image/png">
|
||||
|
||||
<link href="styles.css" rel="stylesheet"/>
|
||||
|
||||
|
||||
@@ -1,5 +1,31 @@
|
||||
:root {
|
||||
--color-scheme: dark;
|
||||
--background: #333333;
|
||||
--header-color: #212121;
|
||||
--dialog-background: #181818;
|
||||
--dialog-border: white;
|
||||
--text: #c4c4c4;
|
||||
--title: #dad8d8;
|
||||
--disabled: #520000;
|
||||
--black: black;
|
||||
--white: white;
|
||||
}
|
||||
|
||||
[data-theme="light"] {
|
||||
--color-scheme: light;
|
||||
--background: #f9f9f9;
|
||||
--header-color: white;
|
||||
--dialog-background: #f9f9f9;
|
||||
--dialog-border: #282828;
|
||||
--text: #262626;
|
||||
--title: #707070;
|
||||
--disabled: #ffcaca;
|
||||
--black: white;
|
||||
--white: black;
|
||||
}
|
||||
|
||||
html {
|
||||
color-scheme: dark;
|
||||
color-scheme: var(--color-scheme);
|
||||
}
|
||||
|
||||
.bigText {
|
||||
@@ -7,7 +33,7 @@ html {
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: #333333;
|
||||
background-color: var(--background);
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
@@ -15,6 +41,10 @@ body {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.inline {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 60%;
|
||||
margin: auto;
|
||||
@@ -54,12 +84,14 @@ body {
|
||||
vertical-align: middle;
|
||||
|
||||
font-size: 50px;
|
||||
color: #212121;
|
||||
color: var(--header-color);
|
||||
|
||||
padding: 20px;
|
||||
|
||||
text-decoration: none;
|
||||
|
||||
border-radius: 15px;
|
||||
|
||||
transition: font-size 1s;
|
||||
}
|
||||
|
||||
@@ -125,8 +157,8 @@ p,li {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
p,li,a {
|
||||
color: #c4c4c4;
|
||||
p,li,a,span,div {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
p,li,code,a {
|
||||
@@ -160,7 +192,7 @@ img {
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #dad8d8;
|
||||
color: var(--title);
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@@ -199,4 +231,95 @@ svg {
|
||||
p,li,code,a {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
/* keybind dialog */
|
||||
.key {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-radius: 5px;
|
||||
display: inline-block;
|
||||
min-width: 33px;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
border-color: var(--white);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.unbound, .key {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
#keybind-dialog .dialog {
|
||||
position: fixed;
|
||||
border-width: 3px;
|
||||
border-style: solid;
|
||||
border-radius: 15px;
|
||||
max-height: 100vh;
|
||||
width: 400px;
|
||||
overflow-x: auto;
|
||||
z-index: 100;
|
||||
padding: 15px;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
font-size: 14px;
|
||||
background-color: var(--dialog-background);
|
||||
border-color: var(--dialog-border);
|
||||
}
|
||||
|
||||
#change-keybind-buttons {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#change-keybind-buttons > .option-button {
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
#change-keybind-settings {
|
||||
margin: 15px 15px 30px;
|
||||
}
|
||||
|
||||
#change-keybind-settings .key {
|
||||
vertical-align: top;
|
||||
margin: 15px 0 0 40px;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
#change-keybind-error {
|
||||
margin-bottom: 15px;
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.blocker {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
z-index: 90;
|
||||
background-color: #00000080;
|
||||
}
|
||||
|
||||
.option-button {
|
||||
cursor: pointer;
|
||||
|
||||
background-color: #c00000;
|
||||
padding: 10px;
|
||||
color: white;
|
||||
border-radius: 5px;
|
||||
font-size: 14px;
|
||||
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.option-button:hover:not(.disabled) {
|
||||
background-color: #fc0303;
|
||||
}
|
||||
|
||||
.option-button.disabled {
|
||||
cursor: default;
|
||||
background-color: var(--disabled);
|
||||
color: grey;
|
||||
}
|
||||
43
public/icons/heart.svg
Normal file
43
public/icons/heart.svg
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="24px"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
fill="#000000"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="heart.svg"
|
||||
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, 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="defs10" />
|
||||
<sodipodi:namedview
|
||||
id="namedview8"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="32.916667"
|
||||
inkscape:cx="11.98481"
|
||||
inkscape:cy="12.01519"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="731"
|
||||
inkscape:window-x="1366"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6" />
|
||||
<path
|
||||
d="M0 0h24v24H0V0z"
|
||||
fill="none"
|
||||
id="path2" />
|
||||
<path
|
||||
d="M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.32C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3zm-4.4 15.55l-.1.1-.1-.1C7.14 14.24 4 11.39 4 8.5 4 6.5 5.5 5 7.5 5c1.54 0 3.04.99 3.57 2.36h1.87C13.46 5.99 14.96 5 16.5 5c2 0 3.5 1.5 3.5 3.5 0 2.89-3.14 5.74-7.9 10.05z"
|
||||
id="path4"
|
||||
style="fill:#800000" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
39
public/icons/not_visible.svg
Normal file
39
public/icons/not_visible.svg
Normal file
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="24px"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
fill="#000000"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="not_visible.svg"
|
||||
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, 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="defs10" />
|
||||
<sodipodi:namedview
|
||||
id="namedview8"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="16.458334"
|
||||
inkscape:cx="3.8582278"
|
||||
inkscape:cy="9.1443037"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="983"
|
||||
inkscape:window-x="426"
|
||||
inkscape:window-y="768"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6" />
|
||||
<path
|
||||
d="M12 7c2.76 0 5 2.24 5 5 0 .65-.13 1.26-.36 1.83l2.92 2.92c1.51-1.26 2.7-2.89 3.43-4.75-1.73-4.39-6-7.5-11-7.5-1.4 0-2.74.25-3.98.7l2.16 2.16C10.74 7.13 11.35 7 12 7zM2 4.27l2.28 2.28.46.46C3.08 8.3 1.78 10.02 1 12c1.73 4.39 6 7.5 11 7.5 1.55 0 3.03-.3 4.38-.84l.42.42L19.73 22 21 20.73 3.27 3 2 4.27zM7.53 9.8l1.55 1.55c-.05.21-.08.43-.08.65 0 1.66 1.34 3 3 3 .22 0 .44-.03.65-.08l1.55 1.55c-.67.33-1.41.53-2.2.53-2.76 0-5-2.24-5-5 0-.79.2-1.53.53-2.2zm4.31-.78l3.15 3.15.02-.16c0-1.66-1.34-3-3-3l-.17.01z"
|
||||
id="path4"
|
||||
style="fill:#ffffff" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
1
public/icons/visible.svg
Normal file
1
public/icons/visible.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#FFFFFF"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z"/></svg>
|
||||
|
After Width: | Height: | Size: 366 B |
@@ -1,10 +1,232 @@
|
||||
/* Options page CSS */
|
||||
html {
|
||||
color-scheme: dark;
|
||||
|
||||
:root {
|
||||
--color-scheme: dark;
|
||||
--background: #333333;
|
||||
--menu-background: #181818;
|
||||
--menu-foreground: white;
|
||||
--dialog-background: #181818;
|
||||
--dialog-border: white;
|
||||
--tab-color: #242424;
|
||||
--tab-button-hover: #4d0000;
|
||||
--tab-hover: white;
|
||||
--description: #dfdfdf;
|
||||
--disabled: #520000;
|
||||
--slider: #707070;
|
||||
--title: #dad8d8;
|
||||
--border-color: #484848;
|
||||
--black: black;
|
||||
--white: white;
|
||||
}
|
||||
|
||||
body {
|
||||
[data-theme="light"] {
|
||||
--color-scheme: light;
|
||||
--background: #f9f9f9;
|
||||
--menu-background: #dbdbdb;
|
||||
--menu-foreground: #212121;
|
||||
--dialog-background: #f9f9f9;
|
||||
--dialog-border: #282828;
|
||||
--tab-color: #ababab;
|
||||
--tab-button-hover: #750000;
|
||||
--tab-hover: #2e2e2e;
|
||||
--description: #262626;
|
||||
--disabled: #ffcaca;
|
||||
--slider: #bfbebe;
|
||||
--title: #707070;
|
||||
--border-color: #d9d9d9;
|
||||
--black: white;
|
||||
--white: black;
|
||||
}
|
||||
|
||||
.medium-description, .switch-container, .optionLabel, .categoryTableElement {
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.small-description, p, li, span, div {
|
||||
color: var(--description);
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: var(--title);
|
||||
}
|
||||
|
||||
html, body {
|
||||
color-scheme: var(--color-scheme);
|
||||
font-family: sans-serif;
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
background-color: var(--background);
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
#options-container {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
#menubar {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 20px;
|
||||
flex-basis: 20%;
|
||||
min-width: 300px;
|
||||
max-width: 600px;
|
||||
border-radius: 15px;
|
||||
margin: 15px;
|
||||
z-index: 10;
|
||||
background-color: var(--menu-background);
|
||||
color: var(--menu-foreground);
|
||||
}
|
||||
|
||||
#navigation {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 30px;
|
||||
}
|
||||
|
||||
.tab-heading {
|
||||
font-size: 18px;
|
||||
height: 55px;
|
||||
line-height: 55px;
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
border-radius: 15px;
|
||||
cursor: pointer;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
background-color: var(--tab-color);
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.tab-heading:hover {
|
||||
background-color: var(--tab-button-hover);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.tab-heading.selected {
|
||||
background-color: #c00000;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.tab-heading:active {
|
||||
background-color: #950000;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.option-group > div {
|
||||
min-height: 50px;
|
||||
padding: 20px 0;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
border-image: linear-gradient(to right, var(--border-color), #00000000 80%) 1;
|
||||
}
|
||||
|
||||
.option-group > div:last-child, .option-group > #keybind-dialog {
|
||||
border-bottom: inherit;
|
||||
}
|
||||
|
||||
.optionLabel, #version {
|
||||
font-size: 14px;
|
||||
height: 15px;
|
||||
}
|
||||
|
||||
div[data-type="keybind-change"] .optionLabel {
|
||||
display: inline-block;
|
||||
min-width: 150px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
input[type='number'] {
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.key {
|
||||
border-width: 1px;
|
||||
border-style: solid;
|
||||
border-radius: 5px;
|
||||
display: inline-block;
|
||||
min-width: 33px;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
border-color: var(--white);
|
||||
}
|
||||
|
||||
.unbound, .key {
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
.keybind-buttons {
|
||||
border-radius: 5px;
|
||||
padding: 5px 3px;
|
||||
cursor: pointer;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.keybind-buttons:hover {
|
||||
background-color: #00000030;
|
||||
}
|
||||
|
||||
.keybind-buttons > div, .keybind-buttons > span {
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
#keybind-dialog .dialog {
|
||||
position: fixed;
|
||||
border-width: 3px;
|
||||
border-style: solid;
|
||||
border-radius: 15px;
|
||||
max-height: 100vh;
|
||||
width: 400px;
|
||||
overflow-x: auto;
|
||||
z-index: 100;
|
||||
padding: 15px;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
background-color: var(--dialog-background);
|
||||
border-color: var(--dialog-border);
|
||||
}
|
||||
|
||||
#change-keybind-buttons {
|
||||
float: right;
|
||||
}
|
||||
|
||||
#change-keybind-buttons > .option-button {
|
||||
margin: 0 2px;
|
||||
}
|
||||
|
||||
#change-keybind-settings {
|
||||
margin: 15px 15px 30px;
|
||||
}
|
||||
|
||||
#change-keybind-settings .key {
|
||||
vertical-align: top;
|
||||
margin: 15px 0 0 40px;
|
||||
height: 34px;
|
||||
}
|
||||
|
||||
#change-keybind-error {
|
||||
margin-bottom: 15px;
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.blocker {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
z-index: 90;
|
||||
background-color: #00000080;
|
||||
}
|
||||
|
||||
.low-profile {
|
||||
height: 23px;
|
||||
line-height: 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.center {
|
||||
@@ -15,25 +237,49 @@ body {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.next-line {
|
||||
padding: 15px 0 0 0;
|
||||
}
|
||||
|
||||
.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.hiding {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.spacing {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
.keybind-status {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.small-description {
|
||||
color: white;
|
||||
font-size: 13px;
|
||||
padding: 15px 0 0 20px;
|
||||
}
|
||||
|
||||
.small-description td {
|
||||
padding: 10px 0 20px 20px;
|
||||
}
|
||||
|
||||
.indent {
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.categoryTableElement td {
|
||||
padding-top: 10px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.medium-description {
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
@@ -53,36 +299,42 @@ body {
|
||||
width: max-content;
|
||||
}
|
||||
|
||||
.option-button:hover {
|
||||
.option-button:hover:not(.disabled) {
|
||||
background-color: #fc0303;
|
||||
}
|
||||
|
||||
.option-button.disabled {
|
||||
cursor: default;
|
||||
|
||||
background-color: #520000;
|
||||
background-color: var(--disabled);
|
||||
color: grey;
|
||||
}
|
||||
|
||||
#options {
|
||||
max-width: 60%;
|
||||
height: 100vh;
|
||||
flex-basis: 80%;
|
||||
overflow: auto;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
padding: 80px 15% 0 3%;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
||||
transition: padding 0.3s;
|
||||
}
|
||||
|
||||
#options.embed {
|
||||
#options.embed > div {
|
||||
max-width: 100%;
|
||||
text-align: left;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#title .profilepic {
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
.switch-container {
|
||||
content: attr(label-name);
|
||||
position: absolute;
|
||||
width: max-content;
|
||||
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
|
||||
display: table;
|
||||
}
|
||||
@@ -94,11 +346,6 @@ body {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.text-label-container {
|
||||
font-size: 14px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
@@ -119,7 +366,7 @@ body {
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #707070;
|
||||
background-color: var(--slider);
|
||||
}
|
||||
|
||||
.animated * {
|
||||
@@ -162,11 +409,8 @@ input:checked + .slider:before {
|
||||
}
|
||||
|
||||
|
||||
/* Boilerplate CSS from https://ajay.app */
|
||||
|
||||
body {
|
||||
background-color: #333333;
|
||||
}
|
||||
/* Boilerplate CSS from https://ajay.app (edited) */
|
||||
|
||||
.projectPreview {
|
||||
position: relative;
|
||||
@@ -196,29 +440,25 @@ body {
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.createdBy {
|
||||
font-size: 14px;
|
||||
#createdBy {
|
||||
text-align: center;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
margin: auto 0 10px 0;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
display: inline-block;
|
||||
#createdBy > * {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
#title {
|
||||
background-color: #636363;
|
||||
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
|
||||
font-size: 50px;
|
||||
color: #212121;
|
||||
font-size: 40px;
|
||||
|
||||
padding: 20px;
|
||||
padding: 40px 20px;
|
||||
|
||||
text-decoration: none;
|
||||
|
||||
transition: font-size 1s;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
@@ -237,7 +477,6 @@ body {
|
||||
}
|
||||
|
||||
.profilepic {
|
||||
background-color: #636363 !important;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
@@ -281,21 +520,9 @@ a {
|
||||
|
||||
p,li {
|
||||
font-size: 20px;
|
||||
color: #c4c4c4;
|
||||
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
@media screen and (orientation:portrait) {
|
||||
#options {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.previewColorOption {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.previewImage {
|
||||
max-height: 200px;
|
||||
}
|
||||
@@ -316,10 +543,6 @@ img {
|
||||
color: #dad8d8;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
color: #dad8d8;
|
||||
}
|
||||
|
||||
svg {
|
||||
text-decoration: none;
|
||||
}
|
||||
@@ -337,8 +560,6 @@ svg {
|
||||
|
||||
.categoryTableElement {
|
||||
font-size: 16px;
|
||||
|
||||
color: white;
|
||||
}
|
||||
|
||||
.categoryTableElement > * {
|
||||
@@ -368,4 +589,83 @@ svg {
|
||||
|
||||
#sbDonate {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
|
||||
/* Top bar navigation for smaller screens */
|
||||
@media only screen and (max-height: 650px), only screen and (max-width: 1200px) {
|
||||
#options-container {
|
||||
flex-direction: column;
|
||||
}
|
||||
#menubar {
|
||||
gap: 8px;
|
||||
min-width: unset;
|
||||
max-width: unset;
|
||||
padding: 8px;
|
||||
}
|
||||
#navigation {
|
||||
gap: 8px;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
}
|
||||
#options {
|
||||
padding: 0 50px;
|
||||
}
|
||||
|
||||
#options > div {
|
||||
max-width: 70%;
|
||||
}
|
||||
|
||||
.tab-heading {
|
||||
width: unset;
|
||||
min-width: unset;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
font-size: 16px;
|
||||
padding: 0 10px;
|
||||
margin: 0;
|
||||
}
|
||||
#title {
|
||||
width: 100%;
|
||||
font-size: 30px;
|
||||
padding: 10px;
|
||||
}
|
||||
#title .profilepic {
|
||||
height: 40px;
|
||||
}
|
||||
#createdBy {
|
||||
margin: 10px 0 0 0;
|
||||
height: unset;
|
||||
width: 100%;
|
||||
}
|
||||
#createdBy > div {
|
||||
display: inline-block;
|
||||
}
|
||||
#sbDonate {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
#version {
|
||||
font-size: 10px;
|
||||
height: 10px;
|
||||
transform: translate(-50px, -5px);
|
||||
}
|
||||
.sticky #menubar {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin: 0 15px;
|
||||
}
|
||||
.sticky #title, .sticky #createdBy {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 800px) {
|
||||
#options {
|
||||
padding: 0 15px;
|
||||
justify-content: left;
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -393,7 +393,7 @@ label>p, #disableExtension>p, #usernameValue, #usernameElement > div > p,#sponso
|
||||
|
||||
/* footer */
|
||||
|
||||
#sbFooter > a {
|
||||
#sbFooter a {
|
||||
color: var(--sb-main-fg-color);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
@@ -138,6 +138,14 @@
|
||||
<span id="sponsorTimeSavedEndWord">__MSG_minsLower__</span></b>).
|
||||
</div>
|
||||
<footer id="sbFooter">
|
||||
<div id="sponsorTimesDonateContainer" style="display: none; align-items: center; justify-content: center;">
|
||||
<img class="sbHeart" src="/icons/heart.svg"/>
|
||||
<a id="sbConsiderDonateLink" href="https://sponsor.ajay.app/donate" target="_blank" rel="noopener">
|
||||
__MSG_considerDonating__
|
||||
</a>
|
||||
<img id="sbCloseDonate" src="/icons/close.png" height="8px" 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>
|
||||
|
||||
@@ -31,24 +31,24 @@ class CategoryChooserComponent extends React.Component<CategoryChooserProps, Cat
|
||||
{/* Headers */}
|
||||
<tr id={"CategoryOptionsRow"}
|
||||
className="categoryTableElement categoryTableHeader">
|
||||
<td id={"CategoryOptionName"}>
|
||||
<th id={"CategoryOptionName"}>
|
||||
{chrome.i18n.getMessage("category")}
|
||||
</td>
|
||||
</th>
|
||||
|
||||
<td id={"CategorySkipOption"}
|
||||
<th id={"CategorySkipOption"}
|
||||
className="skipOption">
|
||||
{chrome.i18n.getMessage("skipOption")}
|
||||
</td>
|
||||
</th>
|
||||
|
||||
<td id={"CategoryColorOption"}
|
||||
<th id={"CategoryColorOption"}
|
||||
className="colorOption">
|
||||
{chrome.i18n.getMessage("seekBarColor")}
|
||||
</td>
|
||||
</th>
|
||||
|
||||
<td id={"CategoryPreviewColorOption"}
|
||||
<th id={"CategoryPreviewColorOption"}
|
||||
className="previewColorOption">
|
||||
{chrome.i18n.getMessage("previewColor")}
|
||||
</td>
|
||||
</th>
|
||||
</tr>
|
||||
|
||||
{this.getCategorySkipOptions()}
|
||||
|
||||
@@ -8,6 +8,7 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
|
||||
import { VoteResponse } from "../messageTypes";
|
||||
import { AnimationUtils } from "../utils/animationUtils";
|
||||
import { GenericUtils } from "../utils/genericUtils";
|
||||
import { Tooltip } from "../render/Tooltip";
|
||||
|
||||
export interface CategoryPillProps {
|
||||
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
|
||||
@@ -21,6 +22,8 @@ export interface CategoryPillState {
|
||||
|
||||
class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryPillState> {
|
||||
|
||||
tooltip?: Tooltip;
|
||||
|
||||
constructor(props: CategoryPillProps) {
|
||||
super(props);
|
||||
|
||||
@@ -35,15 +38,16 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
|
||||
const style: React.CSSProperties = {
|
||||
backgroundColor: this.getColor(),
|
||||
display: this.state.show ? "flex" : "none",
|
||||
color: this.state.segment?.category === "sponsor"
|
||||
|| this.state.segment?.category === "exclusive_access" ? "white" : "black",
|
||||
color: this.getTextColor(),
|
||||
}
|
||||
|
||||
return (
|
||||
<span style={style}
|
||||
className={"sponsorBlockCategoryPill"}
|
||||
title={this.getTitleText()}
|
||||
onClick={(e) => this.toggleOpen(e)}>
|
||||
aria-label={this.getTitleText()}
|
||||
onClick={(e) => this.toggleOpen(e)}
|
||||
onMouseEnter={() => this.openTooltip()}
|
||||
onMouseLeave={() => this.closeTooltip()}>
|
||||
<span className="sponsorBlockCategoryPillTitleSection">
|
||||
<img className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
@@ -116,6 +120,45 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
|
||||
return configObject?.color;
|
||||
}
|
||||
|
||||
private getTextColor(): string {
|
||||
const color = this.getColor();
|
||||
if (!color) return null;
|
||||
|
||||
const existingCalculatedColor = Config.config.categoryPillColors[this.state.segment?.category];
|
||||
if (existingCalculatedColor && existingCalculatedColor.lastColor === color) {
|
||||
return existingCalculatedColor.textColor;
|
||||
} else {
|
||||
const luminance = GenericUtils.getLuminance(color);
|
||||
const textColor = luminance > 128 ? "black" : "white";
|
||||
Config.config.categoryPillColors[this.state.segment?.category] = {
|
||||
lastColor: color,
|
||||
textColor
|
||||
};
|
||||
|
||||
return textColor;
|
||||
}
|
||||
}
|
||||
|
||||
private openTooltip(): void {
|
||||
const tooltipMount = document.querySelector("ytd-video-primary-info-renderer > #container") as HTMLElement;
|
||||
if (tooltipMount) {
|
||||
this.tooltip = new Tooltip({
|
||||
text: this.getTitleText(),
|
||||
referenceNode: tooltipMount,
|
||||
bottomOffset: "70px",
|
||||
opacity: 0.95,
|
||||
displayTriangle: false,
|
||||
showLogo: false,
|
||||
showGotIt: false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private closeTooltip(): void {
|
||||
this.tooltip?.close();
|
||||
this.tooltip = null;
|
||||
}
|
||||
|
||||
getTitleText(): string {
|
||||
const shortDescription = chrome.i18n.getMessage(`category_${this.state.segment?.category}_pill`);
|
||||
return (shortDescription ? shortDescription + ". ": "") + chrome.i18n.getMessage("categoryPillTitleText");
|
||||
|
||||
75
src/components/KeybindComponent.tsx
Normal file
75
src/components/KeybindComponent.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
import * as React from "react";
|
||||
import * as ReactDOM from "react-dom";
|
||||
import Config from "../config";
|
||||
import { Keybind } from "../types";
|
||||
import KeybindDialogComponent from "./KeybindDialogComponent";
|
||||
import { keybindEquals, keybindToString, formatKey } from "../utils/configUtils";
|
||||
|
||||
export interface KeybindProps {
|
||||
option: string;
|
||||
}
|
||||
|
||||
export interface KeybindState {
|
||||
keybind: Keybind;
|
||||
}
|
||||
|
||||
let dialog;
|
||||
|
||||
class KeybindComponent extends React.Component<KeybindProps, KeybindState> {
|
||||
constructor(props: KeybindProps) {
|
||||
super(props);
|
||||
this.state = {keybind: Config.config[this.props.option]};
|
||||
}
|
||||
|
||||
render(): React.ReactElement {
|
||||
return(
|
||||
<>
|
||||
<div className="keybind-buttons inline" title={chrome.i18n.getMessage("change")} onClick={() => this.openEditDialog()}>
|
||||
{this.state.keybind?.ctrl && <div className="key keyControl">Ctrl</div>}
|
||||
{this.state.keybind?.ctrl && <span className="keyControl">+</span>}
|
||||
{this.state.keybind?.alt && <div className="key keyAlt">Alt</div>}
|
||||
{this.state.keybind?.alt && <span className="keyAlt">+</span>}
|
||||
{this.state.keybind?.shift && <div className="key keyShift">Shift</div>}
|
||||
{this.state.keybind?.shift && <span className="keyShift">+</span>}
|
||||
{this.state.keybind?.key != null && <div className="key keyBase">{formatKey(this.state.keybind.key)}</div>}
|
||||
{this.state.keybind == null && <span className="unbound">{chrome.i18n.getMessage("notSet")}</span>}
|
||||
</div>
|
||||
|
||||
{this.state.keybind != null &&
|
||||
<div className="option-button trigger-button inline" onClick={() => this.unbind()}>
|
||||
{chrome.i18n.getMessage("unbind")}
|
||||
</div>
|
||||
}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
equals(other: Keybind): boolean {
|
||||
return keybindEquals(this.state.keybind, other);
|
||||
}
|
||||
|
||||
toString(): string {
|
||||
return keybindToString(this.state.keybind);
|
||||
}
|
||||
|
||||
openEditDialog(): void {
|
||||
dialog = parent.document.createElement("div");
|
||||
dialog.id = "keybind-dialog";
|
||||
parent.document.body.prepend(dialog);
|
||||
ReactDOM.render(<KeybindDialogComponent option={this.props.option} closeListener={(updateWith) => this.closeEditDialog(updateWith)} />, dialog);
|
||||
}
|
||||
|
||||
closeEditDialog(updateWith: Keybind): void {
|
||||
ReactDOM.unmountComponentAtNode(dialog);
|
||||
dialog.remove();
|
||||
if (updateWith != null)
|
||||
this.setState({keybind: updateWith});
|
||||
}
|
||||
|
||||
unbind(): void {
|
||||
this.setState({keybind: null});
|
||||
Config.config[this.props.option] = null;
|
||||
}
|
||||
}
|
||||
|
||||
export default KeybindComponent;
|
||||
165
src/components/KeybindDialogComponent.tsx
Normal file
165
src/components/KeybindDialogComponent.tsx
Normal file
@@ -0,0 +1,165 @@
|
||||
import * as React from "react";
|
||||
import { ChangeEvent } from "react";
|
||||
import Config from "../config";
|
||||
import { Keybind } from "../types";
|
||||
import { keybindEquals, formatKey } from "../utils/configUtils";
|
||||
|
||||
export interface KeybindDialogProps {
|
||||
option: string;
|
||||
closeListener: (updateWith) => void;
|
||||
}
|
||||
|
||||
export interface KeybindDialogState {
|
||||
key: Keybind;
|
||||
error: ErrorMessage;
|
||||
}
|
||||
|
||||
interface ErrorMessage {
|
||||
message: string;
|
||||
blocking: boolean;
|
||||
}
|
||||
|
||||
class KeybindDialogComponent extends React.Component<KeybindDialogProps, KeybindDialogState> {
|
||||
|
||||
constructor(props: KeybindDialogProps) {
|
||||
super(props);
|
||||
this.state = {
|
||||
key: {
|
||||
key: null,
|
||||
code: null,
|
||||
ctrl: false,
|
||||
alt: false,
|
||||
shift: false
|
||||
},
|
||||
error: {
|
||||
message: null,
|
||||
blocking: false
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
render(): React.ReactElement {
|
||||
return(
|
||||
<>
|
||||
<div className="blocker"></div>
|
||||
<div className="dialog">
|
||||
<div id="change-keybind-description">{chrome.i18n.getMessage("keybindDescription")}</div>
|
||||
<div id="change-keybind-settings">
|
||||
<div id="change-keybind-modifiers" className="inline">
|
||||
<div>
|
||||
<input id="change-keybind-ctrl" type="checkbox" onChange={this.keybindModifierChecked} />
|
||||
<label htmlFor="change-keybind-ctrl">Ctrl</label>
|
||||
</div>
|
||||
<div>
|
||||
<input id="change-keybind-alt" type="checkbox" onChange={this.keybindModifierChecked} />
|
||||
<label htmlFor="change-keybind-alt">Alt</label>
|
||||
</div>
|
||||
<div>
|
||||
<input id="change-keybind-shift" type="checkbox" onChange={this.keybindModifierChecked} />
|
||||
<label htmlFor="change-keybind-shift">Shift</label>
|
||||
</div>
|
||||
</div>
|
||||
<div className="key inline">{formatKey(this.state.key.key)}</div>
|
||||
</div>
|
||||
<div id="change-keybind-error">{this.state.error?.message}</div>
|
||||
<div id="change-keybind-buttons">
|
||||
<div className={"option-button save-button inline" + ((this.state.error?.blocking || this.state.key.key == null) ? " disabled" : "")} onClick={() => this.save()}>
|
||||
{chrome.i18n.getMessage("save")}
|
||||
</div>
|
||||
<div className="option-button cancel-button inline" onClick={() => this.props.closeListener(null)}>
|
||||
{chrome.i18n.getMessage("cancel")}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
componentDidMount(): void {
|
||||
parent.document.addEventListener("keydown", this.keybindKeyPressed);
|
||||
document.addEventListener("keydown", this.keybindKeyPressed);
|
||||
}
|
||||
|
||||
componentWillUnmount(): void {
|
||||
parent.document.removeEventListener("keydown", this.keybindKeyPressed);
|
||||
document.removeEventListener("keydown", this.keybindKeyPressed);
|
||||
}
|
||||
|
||||
keybindKeyPressed = (e: KeyboardEvent): void => {
|
||||
if (!e.altKey && !e.shiftKey && !e.ctrlKey && !e.metaKey && !e.getModifierState("AltGraph")) {
|
||||
if (e.code == "Escape") {
|
||||
this.props.closeListener(null);
|
||||
return;
|
||||
}
|
||||
|
||||
this.setState({
|
||||
key: {
|
||||
key: e.key,
|
||||
code: e.code,
|
||||
ctrl: this.state.key.ctrl,
|
||||
alt: this.state.key.alt,
|
||||
shift: this.state.key.shift}
|
||||
}, () => this.setState({ error: this.isKeybindAvailable() }));
|
||||
}
|
||||
}
|
||||
|
||||
keybindModifierChecked = (e: ChangeEvent<HTMLInputElement>): void => {
|
||||
const id = e.target.id;
|
||||
const val = e.target.checked;
|
||||
|
||||
this.setState({
|
||||
key: {
|
||||
key: this.state.key.key,
|
||||
code: this.state.key.code,
|
||||
ctrl: id == "change-keybind-ctrl" ? val: this.state.key.ctrl,
|
||||
alt: id == "change-keybind-alt" ? val: this.state.key.alt,
|
||||
shift: id == "change-keybind-shift" ? val: this.state.key.shift}
|
||||
}, () => this.setState({ error: this.isKeybindAvailable() }));
|
||||
}
|
||||
|
||||
isKeybindAvailable(): ErrorMessage {
|
||||
if (this.state.key.key == null)
|
||||
return null;
|
||||
|
||||
let youtubeShortcuts: Keybind[];
|
||||
if (/[a-zA-Z0-9,.+\-\][:]/.test(this.state.key.key)) {
|
||||
youtubeShortcuts = [{key: "k"}, {key: "j"}, {key: "l"}, {key: "p", shift: true}, {key: "n", shift: true}, {key: ","}, {key: "."}, {key: ",", shift: true}, {key: ".", shift: true},
|
||||
{key: "ArrowRight"}, {key: "ArrowLeft"}, {key: "ArrowUp"}, {key: "ArrowDown"}, {key: "ArrowRight", ctrl: true}, {key: "ArrowLeft", ctrl: true}, {key: "c"}, {key: "o"},
|
||||
{key: "w"}, {key: "+"}, {key: "-"}, {key: "f"}, {key: "t"}, {key: "i"}, {key: "m"}, {key: "a"}, {key: "s"}, {key: "d"}, {key: "Home"}, {key: "End"},
|
||||
{key: "0"}, {key: "1"}, {key: "2"}, {key: "3"}, {key: "4"}, {key: "5"}, {key: "6"}, {key: "7"}, {key: "8"}, {key: "9"}, {key: "]"}, {key: "["}];
|
||||
} else {
|
||||
youtubeShortcuts = [{key: null, code: "KeyK"}, {key: null, code: "KeyJ"}, {key: null, code: "KeyL"}, {key: null, code: "KeyP", shift: true}, {key: null, code: "KeyN", shift: true},
|
||||
{key: null, code: "Comma"}, {key: null, code: "Period"}, {key: null, code: "Comma", shift: true}, {key: null, code: "Period", shift: true}, {key: null, code: "Space"},
|
||||
{key: null, code: "KeyC"}, {key: null, code: "KeyO"}, {key: null, code: "KeyW"}, {key: null, code: "Equal"}, {key: null, code: "Minus"}, {key: null, code: "KeyF"}, {key: null, code: "KeyT"},
|
||||
{key: null, code: "KeyI"}, {key: null, code: "KeyM"}, {key: null, code: "KeyA"}, {key: null, code: "KeyS"}, {key: null, code: "KeyD"}, {key: null, code: "BracketLeft"}, {key: null, code: "BracketRight"}];
|
||||
}
|
||||
|
||||
for (const shortcut of youtubeShortcuts) {
|
||||
const withShift = Object.assign({}, shortcut);
|
||||
if (!/[0-9]/.test(this.state.key.key)) //shift+numbers don't seem to do anything on youtube, all other keys do
|
||||
withShift.shift = true;
|
||||
if (this.equals(shortcut) || this.equals(withShift))
|
||||
return {message: chrome.i18n.getMessage("youtubeKeybindWarning"), blocking: false};
|
||||
}
|
||||
|
||||
if (this.props.option != "skipKeybind" && this.equals(Config.config['skipKeybind']) ||
|
||||
this.props.option != "submitKeybind" && this.equals(Config.config['submitKeybind']) ||
|
||||
this.props.option != "startSponsorKeybind" && this.equals(Config.config['startSponsorKeybind']))
|
||||
return {message: chrome.i18n.getMessage("keyAlreadyUsed"), blocking: true};
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
equals(other: Keybind): boolean {
|
||||
return keybindEquals(this.state.key, other);
|
||||
}
|
||||
|
||||
save(): void {
|
||||
if (this.state.key.key != null && !this.state.error?.blocking) {
|
||||
Config.config[this.props.option] = this.state.key;
|
||||
this.props.closeListener(this.state.key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default KeybindDialogComponent;
|
||||
@@ -1,13 +1,13 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config"
|
||||
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
|
||||
import { Category, ContentContainer, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
|
||||
import NoticeComponent from "./NoticeComponent";
|
||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||
import Utils from "../utils";
|
||||
const utils = new Utils();
|
||||
|
||||
import { getCategoryActionType, getSkippingText } from "../utils/categoryUtils";
|
||||
import { getSkippingText } from "../utils/categoryUtils";
|
||||
import { keybindToString } from "../utils/configUtils";
|
||||
|
||||
import ThumbsUpSvg from "../svg-icons/thumbs_up_svg";
|
||||
import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
|
||||
@@ -326,7 +326,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
getSkipButton(): JSX.Element {
|
||||
if (this.state.showSkipButton && (this.segments.length > 1
|
||||
|| getCategoryActionType(this.segments[0].category) !== CategoryActionType.POI
|
||||
|| this.segments[0].actionType !== ActionType.Poi
|
||||
|| this.props.unskipTime)) {
|
||||
|
||||
const style: React.CSSProperties = {
|
||||
@@ -344,7 +344,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={style}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "")}
|
||||
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + keybindToString(Config.config.skipKeybind) + ")" : "")}
|
||||
</button>
|
||||
</span>
|
||||
);
|
||||
@@ -517,9 +517,10 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
source: SponsorSourceType.Local
|
||||
};
|
||||
|
||||
const segmentTimes = Config.config.segmentTimes.get(sponsorVideoID) || [];
|
||||
const segmentTimes = Config.config.unsubmittedSegments[sponsorVideoID] || [];
|
||||
segmentTimes.push(sponsorTimesSubmitting);
|
||||
Config.config.segmentTimes.set(sponsorVideoID, segmentTimes);
|
||||
Config.config.unsubmittedSegments[sponsorVideoID] = segmentTimes;
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
this.props.contentContainer().sponsorTimesSubmitting.push(sponsorTimesSubmitting);
|
||||
this.props.contentContainer().updatePreviewBar();
|
||||
@@ -547,7 +548,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
getCategoryOptions(): React.ReactElement[] {
|
||||
const elements = [];
|
||||
|
||||
const categories = (CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable))) as Category[];
|
||||
const categories = (CompileConfig.categoryList.filter((cat => CompileConfig.categorySupport[cat].includes(ActionType.Skip)))) as Category[];
|
||||
for (const category of categories) {
|
||||
elements.push(
|
||||
<option value={category}
|
||||
@@ -601,7 +602,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
|
||||
getUnskippedModeInfo(index: number, buttonText: string): SkipNoticeState {
|
||||
const changeCountdown = getCategoryActionType(this.segments[index].category) === CategoryActionType.Skippable;
|
||||
const changeCountdown = this.segments[index].actionType !== ActionType.Poi;
|
||||
|
||||
const maxCountdownTime = changeCountdown ? () => {
|
||||
const sponsorTime = this.segments[index];
|
||||
@@ -645,18 +646,9 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
||||
|
||||
// Change the sponsor locally
|
||||
if (segment) {
|
||||
if (type === 0) {
|
||||
segment.hidden = SponsorHideType.Downvoted;
|
||||
} else if (category) {
|
||||
segment.category = category; // This is the actual segment on the video page
|
||||
this.segments[index].category = category; //this is the segment inside the skip notice.
|
||||
} else if (type === 1) {
|
||||
segment.hidden = SponsorHideType.Visible;
|
||||
}
|
||||
|
||||
this.contentContainer().updatePreviewBar();
|
||||
if (segment && category) {
|
||||
// This is the segment inside the skip notice
|
||||
this.segments[index].category = category;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -693,7 +685,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
clearConfigListener(): void {
|
||||
if (this.configListener) {
|
||||
Config.configListeners.splice(Config.configListeners.indexOf(this.configListener), 1);
|
||||
Config.configSyncListeners.splice(Config.configSyncListeners.indexOf(this.configListener), 1);
|
||||
this.configListener = null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config";
|
||||
import { ActionType, Category, CategoryActionType, ContentContainer, SponsorTime } from "../types";
|
||||
import { ActionType, Category, ContentContainer, SponsorTime } from "../types";
|
||||
import Utils from "../utils";
|
||||
import { getCategoryActionType } from "../utils/categoryUtils";
|
||||
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
|
||||
import { RectangleTooltip } from "../render/RectangleTooltip";
|
||||
|
||||
@@ -38,8 +37,9 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
configUpdateListener: () => void;
|
||||
|
||||
previousSkipType: CategoryActionType;
|
||||
timeBeforeChangingToPOI: number; // Initialized when first selecting POI
|
||||
previousSkipType: ActionType;
|
||||
// Used when selecting POI or Full
|
||||
timesBeforeChanging: number[] = [];
|
||||
fullVideoWarningShown = false;
|
||||
|
||||
constructor(props: SponsorTimeEditProps) {
|
||||
@@ -50,7 +50,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
this.idSuffix = this.props.idSuffix;
|
||||
|
||||
this.previousSkipType = CategoryActionType.Skippable;
|
||||
this.previousSkipType = ActionType.Skip;
|
||||
this.state = {
|
||||
editing: false,
|
||||
sponsorTimeEdits: [null, null],
|
||||
@@ -72,7 +72,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
// Add as a config listener
|
||||
if (!this.configUpdateListener) {
|
||||
this.configUpdateListener = () => this.configUpdate();
|
||||
Config.configListeners.push(this.configUpdate.bind(this));
|
||||
Config.configSyncListeners.push(this.configUpdate.bind(this));
|
||||
}
|
||||
|
||||
this.checkToShowFullVideoWarning();
|
||||
@@ -80,7 +80,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
componentWillUnmount(): void {
|
||||
if (this.configUpdateListener) {
|
||||
Config.configListeners.splice(Config.configListeners.indexOf(this.configUpdate.bind(this)), 1);
|
||||
Config.configSyncListeners.splice(Config.configSyncListeners.indexOf(this.configUpdate.bind(this)), 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +129,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
onWheel={(e) => {this.changeTimesWhenScrolling(0, e, sponsorTime)}}>
|
||||
</input>
|
||||
|
||||
{getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable ? (
|
||||
{sponsorTime.actionType !== ActionType.Poi ? (
|
||||
<span>
|
||||
<span>
|
||||
{" " + chrome.i18n.getMessage("to") + " "}
|
||||
@@ -167,7 +167,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
className="sponsorTimeDisplay"
|
||||
onClick={this.toggleEditTime.bind(this)}>
|
||||
{utils.getFormattedTime(segment[0], true) +
|
||||
((!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable)
|
||||
((!isNaN(segment[1]) && sponsorTime.actionType !== ActionType.Poi)
|
||||
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
|
||||
</div>
|
||||
);
|
||||
@@ -202,13 +202,13 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
{/* Action Type */}
|
||||
{CompileConfig.categorySupport[sponsorTime.category] &&
|
||||
(CompileConfig.categorySupport[sponsorTime.category]?.length > 1
|
||||
|| CompileConfig.categorySupport[sponsorTime.category]?.[0] !== "skip") ? (
|
||||
|| CompileConfig.categorySupport[sponsorTime.category]?.[0] === ActionType.Full) ? (
|
||||
<div style={{position: "relative"}}>
|
||||
<select id={"sponsorTimeActionTypes" + this.idSuffix}
|
||||
className="sponsorTimeEditSelector sponsorTimeActionTypes"
|
||||
defaultValue={sponsorTime.actionType}
|
||||
ref={this.actionTypeOptionRef}
|
||||
onChange={() => this.saveEditTimes()}>
|
||||
onChange={(e) => this.actionTypeSelectionChange(e)}>
|
||||
{this.getActionTypeOptions(sponsorTime)}
|
||||
</select>
|
||||
</div>
|
||||
@@ -224,7 +224,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
{chrome.i18n.getMessage("delete")}
|
||||
</span>
|
||||
|
||||
{(!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable) ? (
|
||||
{(!isNaN(segment[1]) && ![ActionType.Poi, ActionType.Full].includes(sponsorTime.actionType)) ? (
|
||||
<span id={"sponsorTimePreviewButton" + this.idSuffix}
|
||||
className="sponsorTimeEditButton"
|
||||
onClick={(e) => this.previewTime(e.ctrlKey, e.shiftKey)}>
|
||||
@@ -232,7 +232,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
</span>
|
||||
): ""}
|
||||
|
||||
{(!isNaN(segment[1])) ? (
|
||||
{(!isNaN(segment[1]) && sponsorTime.actionType != ActionType.Full) ? (
|
||||
<span id={"sponsorTimeInspectButton" + this.idSuffix}
|
||||
className="sponsorTimeEditButton"
|
||||
onClick={this.inspectTime.bind(this)}>
|
||||
@@ -240,7 +240,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
</span>
|
||||
): ""}
|
||||
|
||||
{(!isNaN(segment[1])) ? (
|
||||
{(!isNaN(segment[1]) && sponsorTime.actionType != ActionType.Full) ? (
|
||||
<span id={"sponsorTimeEditButton" + this.idSuffix}
|
||||
className="sponsorTimeEditButton"
|
||||
onClick={this.toggleEditTime.bind(this)}>
|
||||
@@ -261,7 +261,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
if (0 < difference && difference< 0.5) this.showScrollToEditToolTip();
|
||||
|
||||
sponsorTimeEdits[index] = targetValue;
|
||||
if (index === 0 && getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = targetValue;
|
||||
if (index === 0 && sponsorTime.actionType === ActionType.Poi) sponsorTimeEdits[1] = targetValue;
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
this.saveEditTimes();
|
||||
@@ -290,7 +290,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
timeAsNumber = 0;
|
||||
}
|
||||
sponsorTimeEdits[index] = utils.getFormattedTime(timeAsNumber, true);
|
||||
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = sponsorTimeEdits[0];
|
||||
if (sponsorTime.actionType === ActionType.Poi) sponsorTimeEdits[1] = sponsorTimeEdits[0];
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
this.saveEditTimes();
|
||||
@@ -374,27 +374,58 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
if (confirm(chrome.i18n.getMessage("enableThisCategoryFirst")
|
||||
.replace("{0}", chrome.i18n.getMessage("category_" + chosenCategory)))) {
|
||||
// Open options page
|
||||
chrome.runtime.sendMessage({message: "openConfig", hash: chosenCategory + "OptionsName"});
|
||||
chrome.runtime.sendMessage({message: "openConfig", hash: "behavior"});
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (getCategoryActionType(event.target.value as Category) === CategoryActionType.POI) {
|
||||
if (this.previousSkipType === CategoryActionType.Skippable) this.timeBeforeChangingToPOI = utils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[1]);
|
||||
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
|
||||
this.handleReplacingLostTimes(event.target.value as Category, sponsorTime.actionType, sponsorTime);
|
||||
this.saveEditTimes();
|
||||
}
|
||||
|
||||
actionTypeSelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
|
||||
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
|
||||
|
||||
this.handleReplacingLostTimes(sponsorTime.category, event.target.value as ActionType, sponsorTime);
|
||||
this.saveEditTimes();
|
||||
}
|
||||
|
||||
private handleReplacingLostTimes(category: Category, actionType: ActionType, segment: SponsorTime): void {
|
||||
if (CompileConfig.categorySupport[category]?.includes(ActionType.Poi)) {
|
||||
if (this.previousSkipType !== ActionType.Poi) {
|
||||
this.timesBeforeChanging = [null, segment.segment[1]];
|
||||
}
|
||||
|
||||
this.setTimeTo(1, null);
|
||||
this.props.contentContainer().updateEditButtonsOnPlayer();
|
||||
|
||||
if (this.props.contentContainer().sponsorTimesSubmitting
|
||||
.some((segment, i) => segment.category === event.target.value && i !== this.props.index)) {
|
||||
.some((segment, i) => segment.category === category && i !== this.props.index)) {
|
||||
alert(chrome.i18n.getMessage("poiOnlyOneSegment"));
|
||||
}
|
||||
} else if (getCategoryActionType(event.target.value as Category) === CategoryActionType.Skippable && this.previousSkipType === CategoryActionType.POI) {
|
||||
this.setTimeTo(1, this.timeBeforeChangingToPOI);
|
||||
}
|
||||
|
||||
this.previousSkipType = getCategoryActionType(event.target.value as Category);
|
||||
this.saveEditTimes();
|
||||
this.previousSkipType = ActionType.Poi;
|
||||
} else if (CompileConfig.categorySupport[category]?.length === 1
|
||||
&& CompileConfig.categorySupport[category]?.[0] === ActionType.Full) {
|
||||
if (this.previousSkipType !== ActionType.Full) {
|
||||
this.timesBeforeChanging = [...segment.segment];
|
||||
}
|
||||
|
||||
this.previousSkipType = ActionType.Full;
|
||||
} else if ((category === "chooseACategory" || (CompileConfig.categorySupport[category]?.includes(ActionType.Skip)
|
||||
&& ![ActionType.Poi, ActionType.Full].includes(this.getNextActionType(category, actionType))))
|
||||
&& this.previousSkipType !== ActionType.Skip) {
|
||||
if (this.timesBeforeChanging[0]) {
|
||||
this.setTimeTo(0, this.timesBeforeChanging[0]);
|
||||
}
|
||||
if (this.timesBeforeChanging[1]) {
|
||||
this.setTimeTo(1, this.timesBeforeChanging[1]);
|
||||
}
|
||||
|
||||
this.previousSkipType = ActionType.Skip;
|
||||
}
|
||||
}
|
||||
|
||||
getActionTypeOptions(sponsorTime: SponsorTime): React.ReactElement[] {
|
||||
@@ -429,7 +460,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
if (time === null) time = sponsorTime.segment[0];
|
||||
|
||||
sponsorTime.segment[index] = time;
|
||||
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTime.segment[1] = time;
|
||||
if (sponsorTime.actionType === ActionType.Poi) sponsorTime.segment[1] = time;
|
||||
|
||||
this.setState({
|
||||
sponsorTimeEdits: this.getFormattedSponsorTimesEdits(sponsorTime)
|
||||
@@ -477,11 +508,10 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
sponsorTimesSubmitting[this.props.index].category = category;
|
||||
|
||||
const inputActionType = this.actionTypeOptionRef?.current?.value as ActionType;
|
||||
const actionType = inputActionType && CompileConfig.categorySupport[category]?.includes(inputActionType) ? inputActionType as ActionType
|
||||
: CompileConfig.categorySupport[category]?.[0] ?? ActionType.Skip;
|
||||
sponsorTimesSubmitting[this.props.index].actionType = actionType;
|
||||
sponsorTimesSubmitting[this.props.index].actionType = this.getNextActionType(category, inputActionType);
|
||||
|
||||
Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimesSubmitting);
|
||||
Config.config.unsubmittedSegments[this.props.contentContainer().sponsorVideoID] = sponsorTimesSubmitting;
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
this.props.contentContainer().updatePreviewBar();
|
||||
|
||||
@@ -492,6 +522,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
}
|
||||
|
||||
private getNextActionType(category: Category, actionType: ActionType): ActionType {
|
||||
return actionType && CompileConfig.categorySupport[category]?.includes(actionType) ? actionType
|
||||
: CompileConfig.categorySupport[category]?.[0] ?? ActionType.Skip
|
||||
}
|
||||
|
||||
previewTime(ctrlPressed = false, shiftPressed = false): void {
|
||||
const sponsorTimes = this.props.contentContainer().sponsorTimesSubmitting;
|
||||
const index = this.props.index;
|
||||
@@ -522,7 +557,12 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
sponsorTimes.splice(index, 1);
|
||||
|
||||
//save this
|
||||
Config.config.segmentTimes.set(this.props.contentContainer().sponsorVideoID, sponsorTimes);
|
||||
if (sponsorTimes.length > 0) {
|
||||
Config.config.unsubmittedSegments[this.props.contentContainer().sponsorVideoID] = sponsorTimes;
|
||||
} else {
|
||||
delete Config.config.unsubmittedSegments[this.props.contentContainer().sponsorVideoID];
|
||||
}
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
this.props.contentContainer().updatePreviewBar();
|
||||
|
||||
|
||||
37
src/components/TooltipComponent.tsx
Normal file
37
src/components/TooltipComponent.tsx
Normal file
@@ -0,0 +1,37 @@
|
||||
import * as React from "react";
|
||||
import Config from "../config";
|
||||
import { Category, SegmentUUID, SponsorTime } from "../types";
|
||||
|
||||
export interface TooltipProps {
|
||||
text: string;
|
||||
show: boolean;
|
||||
}
|
||||
|
||||
export interface TooltipState {
|
||||
|
||||
}
|
||||
|
||||
class TooltipComponent extends React.Component<TooltipProps, TooltipState> {
|
||||
|
||||
constructor(props: TooltipProps) {
|
||||
super(props);
|
||||
}
|
||||
|
||||
render(): React.ReactElement {
|
||||
const style: React.CSSProperties = {
|
||||
display: this.props.show ? "flex" : "none",
|
||||
position: "absolute",
|
||||
}
|
||||
|
||||
return (
|
||||
<span style={style}
|
||||
className={"sponsorBlockTooltip"} >
|
||||
<span className="sponsorBlockTooltipText">
|
||||
{this.props.text}
|
||||
</span>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export default TooltipComponent;
|
||||
335
src/config.ts
335
src/config.ts
@@ -1,19 +1,17 @@
|
||||
import * as CompileConfig from "../config.json";
|
||||
import * as invidiousList from "../ci/invidiouslist.json";
|
||||
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes } from "./types";
|
||||
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, StorageChangesObject, UnEncodedSegmentTimes as UnencodedSegmentTimes, 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. */
|
||||
segmentTimes: SBMap<string, SponsorTime[]>,
|
||||
unsubmittedSegments: Record<string, SponsorTime[]>,
|
||||
defaultCategory: Category,
|
||||
whitelistedChannels: string[],
|
||||
forceChannelCheck: boolean,
|
||||
skipKeybind: string,
|
||||
startSponsorKeybind: string,
|
||||
submitKeybind: string,
|
||||
minutesSaved: number,
|
||||
skipCount: number,
|
||||
sponsorTimesContributed: number,
|
||||
@@ -24,6 +22,7 @@ interface SBConfig {
|
||||
fullVideoSegments: boolean,
|
||||
trackViewCount: boolean,
|
||||
trackViewCountInPrivate: boolean,
|
||||
trackDownvotes: boolean,
|
||||
dontShowNotice: boolean,
|
||||
noticeVisibilityMode: NoticeVisbilityMode,
|
||||
hideVideoPlayerControls: boolean,
|
||||
@@ -38,13 +37,15 @@ interface SBConfig {
|
||||
serverAddress: string,
|
||||
minDuration: number,
|
||||
skipNoticeDuration: number,
|
||||
audioNotificationOnSkip,
|
||||
audioNotificationOnSkip: boolean,
|
||||
checkForUnlistedVideos: boolean,
|
||||
testingServer: boolean,
|
||||
refetchWhenNotFound: boolean,
|
||||
ytInfoPermissionGranted: boolean,
|
||||
allowExpirements: boolean,
|
||||
showDonationLink: boolean,
|
||||
showPopupDonationCount: number,
|
||||
donateClicked: number,
|
||||
autoHideInfoButton: boolean,
|
||||
autoSkipOnMusicVideos: boolean,
|
||||
colorPalette: {
|
||||
@@ -54,6 +55,19 @@ interface SBConfig {
|
||||
},
|
||||
scrollToEditTimeUpdate: boolean,
|
||||
categoryPillUpdate: boolean,
|
||||
darkMode: boolean,
|
||||
|
||||
// Used to cache calculated text color info
|
||||
categoryPillColors: {
|
||||
[key in Category]: {
|
||||
lastColor: string,
|
||||
textColor: string
|
||||
}
|
||||
}
|
||||
|
||||
skipKeybind: Keybind,
|
||||
startSponsorKeybind: Keybind,
|
||||
submitKeybind: Keybind,
|
||||
|
||||
// What categories should be skipped
|
||||
categorySelections: CategorySelection[],
|
||||
@@ -83,96 +97,38 @@ interface SBConfig {
|
||||
}
|
||||
}
|
||||
|
||||
export interface SBObject {
|
||||
configListeners: Array<(changes: StorageChangesObject) => unknown>;
|
||||
defaults: SBConfig;
|
||||
localConfig: SBConfig;
|
||||
config: SBConfig;
|
||||
export type VideoDownvotes = { segments: { uuid: HashedValue, hidden: SponsorHideType }[] , lastAccess: number };
|
||||
|
||||
// Functions
|
||||
encodeStoredItem<T>(data: T): T | UnencodedSegmentTimes;
|
||||
convertJSON(): void;
|
||||
interface SBStorage {
|
||||
/* VideoID prefixes to UUID prefixes */
|
||||
downvotedSegments: Record<VideoID & HashedValue, VideoDownvotes>,
|
||||
}
|
||||
|
||||
// Allows a SBMap to be conveted into json form
|
||||
// Currently used for local storage
|
||||
class SBMap<T, U> extends Map {
|
||||
id: string;
|
||||
|
||||
constructor(id: string, entries?: [T, U][]) {
|
||||
super();
|
||||
|
||||
this.id = id;
|
||||
|
||||
// Import all entries if they were given
|
||||
if (entries !== undefined) {
|
||||
for (const item of entries) {
|
||||
super.set(item[0], item[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
get(key): U {
|
||||
return super.get(key);
|
||||
}
|
||||
|
||||
rawSet(key, value) {
|
||||
return super.set(key, value);
|
||||
}
|
||||
|
||||
update() {
|
||||
// Store updated SBMap locally
|
||||
chrome.storage.sync.set({
|
||||
[this.id]: encodeStoredItem(this)
|
||||
});
|
||||
}
|
||||
|
||||
set(key: T, value: U) {
|
||||
const result = super.set(key, value);
|
||||
|
||||
this.update();
|
||||
return result;
|
||||
}
|
||||
|
||||
delete(key) {
|
||||
const result = super.delete(key);
|
||||
|
||||
// Make sure there are no empty elements
|
||||
for (const entry of this.entries()) {
|
||||
if (entry[1].length === 0) {
|
||||
super.delete(entry[0]);
|
||||
}
|
||||
}
|
||||
|
||||
this.update();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
clear() {
|
||||
const result = super.clear();
|
||||
|
||||
this.update();
|
||||
return result;
|
||||
}
|
||||
export interface SBObject {
|
||||
configSyncListeners: Array<(changes: StorageChangesObject) => unknown>;
|
||||
syncDefaults: SBConfig;
|
||||
localDefaults: SBStorage;
|
||||
cachedSyncConfig: SBConfig;
|
||||
cachedLocalStorage: SBStorage;
|
||||
config: SBConfig;
|
||||
local: SBStorage;
|
||||
forceSyncUpdate(prop: string): void;
|
||||
forceLocalUpdate(prop: string): void;
|
||||
}
|
||||
|
||||
const Config: SBObject = {
|
||||
/**
|
||||
* Callback function when an option is updated
|
||||
*/
|
||||
configListeners: [],
|
||||
defaults: {
|
||||
configSyncListeners: [],
|
||||
syncDefaults: {
|
||||
userID: null,
|
||||
isVip: false,
|
||||
lastIsVipUpdate: 0,
|
||||
segmentTimes: new SBMap("segmentTimes"),
|
||||
unsubmittedSegments: {},
|
||||
defaultCategory: "chooseACategory" as Category,
|
||||
whitelistedChannels: [],
|
||||
forceChannelCheck: false,
|
||||
skipKeybind: "Enter",
|
||||
startSponsorKeybind: ";",
|
||||
submitKeybind: "'",
|
||||
minutesSaved: 0,
|
||||
skipCount: 0,
|
||||
sponsorTimesContributed: 0,
|
||||
@@ -183,6 +139,7 @@ const Config: SBObject = {
|
||||
fullVideoSegments: true,
|
||||
trackViewCount: true,
|
||||
trackViewCountInPrivate: true,
|
||||
trackDownvotes: true,
|
||||
dontShowNotice: false,
|
||||
noticeVisibilityMode: NoticeVisbilityMode.FadedForAutoSkip,
|
||||
hideVideoPlayerControls: false,
|
||||
@@ -204,10 +161,26 @@ const Config: SBObject = {
|
||||
ytInfoPermissionGranted: false,
|
||||
allowExpirements: true,
|
||||
showDonationLink: true,
|
||||
showPopupDonationCount: 0,
|
||||
donateClicked: 0,
|
||||
autoHideInfoButton: true,
|
||||
autoSkipOnMusicVideos: false,
|
||||
scrollToEditTimeUpdate: false, // false means the tooltip will be shown
|
||||
categoryPillUpdate: false,
|
||||
darkMode: true,
|
||||
|
||||
categoryPillColors: {},
|
||||
|
||||
/**
|
||||
* Default keybinds should not set "code" as that's gonna be different based on the user's locale. They should also only use EITHER ctrl OR alt modifiers (or none).
|
||||
* Using ctrl+alt, or shift may produce a different character that we will not be able to recognize in different locales.
|
||||
* The exception for shift is letters, where it only capitalizes. So shift+A is fine, but shift+1 isn't.
|
||||
* Don't forget to add the new keybind to the checks in "KeybindDialogComponent.isKeybindAvailable()" and in "migrateOldFormats()"!
|
||||
* TODO: Find a way to skip having to update these checks. Maybe storing keybinds in a Map?
|
||||
*/
|
||||
skipKeybind: {key: "Enter"},
|
||||
startSponsorKeybind: {key: ";"},
|
||||
submitKeybind: {key: "'"},
|
||||
|
||||
categorySelections: [{
|
||||
name: "sponsor" as Category,
|
||||
@@ -310,74 +283,49 @@ const Config: SBObject = {
|
||||
}
|
||||
}
|
||||
},
|
||||
localConfig: null,
|
||||
localDefaults: {
|
||||
downvotedSegments: {}
|
||||
},
|
||||
cachedSyncConfig: null,
|
||||
cachedLocalStorage: null,
|
||||
config: null,
|
||||
|
||||
// Functions
|
||||
encodeStoredItem,
|
||||
convertJSON
|
||||
local: null,
|
||||
forceSyncUpdate,
|
||||
forceLocalUpdate
|
||||
};
|
||||
|
||||
// Function setup
|
||||
|
||||
/**
|
||||
* A SBMap cannot be stored in the chrome storage.
|
||||
* This data will be encoded into an array instead
|
||||
*
|
||||
* @param data
|
||||
*/
|
||||
function encodeStoredItem<T>(data: T): T | UnencodedSegmentTimes {
|
||||
// if data is SBMap convert to json for storing
|
||||
if(!(data instanceof SBMap)) return data;
|
||||
return Array.from(data.entries()).filter((element) => element[1].length > 0); // Remove empty entries
|
||||
}
|
||||
|
||||
/**
|
||||
* An SBMap cannot be stored in the chrome storage.
|
||||
* This data will be decoded from the array it is stored in
|
||||
*
|
||||
* @param {*} data
|
||||
*/
|
||||
function decodeStoredItem<T>(id: string, data: T): T | SBMap<string, SponsorTime[]> {
|
||||
if (!Config.defaults[id]) return data;
|
||||
|
||||
if (Config.defaults[id] instanceof SBMap) {
|
||||
try {
|
||||
if (!Array.isArray(data)) return data;
|
||||
return new SBMap(id, data as UnencodedSegmentTimes);
|
||||
} catch(e) {
|
||||
console.error("Failed to parse SBMap: " + id);
|
||||
}
|
||||
}
|
||||
|
||||
// If all else fails, return the data
|
||||
return data;
|
||||
}
|
||||
|
||||
function configProxy(): SBConfig {
|
||||
chrome.storage.onChanged.addListener((changes: {[key: string]: chrome.storage.StorageChange}) => {
|
||||
for (const key in changes) {
|
||||
Config.localConfig[key] = decodeStoredItem(key, changes[key].newValue);
|
||||
}
|
||||
|
||||
for (const callback of Config.configListeners) {
|
||||
callback(changes);
|
||||
function configProxy(): { sync: SBConfig, local: SBStorage } {
|
||||
chrome.storage.onChanged.addListener((changes: {[key: string]: chrome.storage.StorageChange}, areaName) => {
|
||||
if (areaName === "sync") {
|
||||
for (const key in changes) {
|
||||
Config.cachedSyncConfig[key] = changes[key].newValue;
|
||||
}
|
||||
|
||||
for (const callback of Config.configSyncListeners) {
|
||||
callback(changes);
|
||||
}
|
||||
} else if (areaName === "local") {
|
||||
for (const key in changes) {
|
||||
Config.cachedLocalStorage[key] = changes[key].newValue;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const handler: ProxyHandler<SBConfig> = {
|
||||
const syncHandler: ProxyHandler<SBConfig> = {
|
||||
set<K extends keyof SBConfig>(obj: SBConfig, prop: K, value: SBConfig[K]) {
|
||||
Config.localConfig[prop] = value;
|
||||
Config.cachedSyncConfig[prop] = value;
|
||||
|
||||
chrome.storage.sync.set({
|
||||
[prop]: encodeStoredItem(value)
|
||||
[prop]: value
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
get<K extends keyof SBConfig>(obj: SBConfig, prop: K): SBConfig[K] {
|
||||
const data = Config.localConfig[prop];
|
||||
const data = Config.cachedSyncConfig[prop];
|
||||
|
||||
return obj[prop] || data;
|
||||
},
|
||||
@@ -390,19 +338,73 @@ function configProxy(): SBConfig {
|
||||
|
||||
};
|
||||
|
||||
return new Proxy<SBConfig>({handler} as unknown as SBConfig, handler);
|
||||
const localHandler: ProxyHandler<SBStorage> = {
|
||||
set<K extends keyof SBStorage>(obj: SBStorage, prop: K, value: SBStorage[K]) {
|
||||
Config.cachedLocalStorage[prop] = value;
|
||||
|
||||
chrome.storage.local.set({
|
||||
[prop]: value
|
||||
});
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
get<K extends keyof SBStorage>(obj: SBStorage, prop: K): SBStorage[K] {
|
||||
const data = Config.cachedLocalStorage[prop];
|
||||
|
||||
return obj[prop] || data;
|
||||
},
|
||||
|
||||
deleteProperty(obj: SBStorage, prop: keyof SBStorage) {
|
||||
chrome.storage.local.remove(<string> prop);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
return {
|
||||
sync: new Proxy<SBConfig>({ handler: syncHandler } as unknown as SBConfig, syncHandler),
|
||||
local: new Proxy<SBStorage>({ handler: localHandler } as unknown as SBStorage, localHandler)
|
||||
};
|
||||
}
|
||||
|
||||
function fetchConfig(): Promise<void> {
|
||||
return new Promise((resolve) => {
|
||||
chrome.storage.sync.get(null, function(items) {
|
||||
Config.localConfig = <SBConfig> <unknown> items; // Data is ready
|
||||
resolve();
|
||||
});
|
||||
function forceSyncUpdate(prop: string): void {
|
||||
chrome.storage.sync.set({
|
||||
[prop]: Config.cachedSyncConfig[prop]
|
||||
});
|
||||
}
|
||||
|
||||
function migrateOldFormats(config: SBConfig) {
|
||||
function forceLocalUpdate(prop: string): void {
|
||||
chrome.storage.local.set({
|
||||
[prop]: Config.cachedLocalStorage[prop]
|
||||
});
|
||||
}
|
||||
|
||||
async function fetchConfig(): Promise<void> {
|
||||
await Promise.all([new Promise<void>((resolve) => {
|
||||
chrome.storage.sync.get(null, function(items) {
|
||||
Config.cachedSyncConfig = <SBConfig> <unknown> items;
|
||||
resolve();
|
||||
});
|
||||
}), new Promise<void>((resolve) => {
|
||||
chrome.storage.local.get(null, function(items) {
|
||||
Config.cachedLocalStorage = <SBStorage> <unknown> items;
|
||||
resolve();
|
||||
});
|
||||
})]);
|
||||
}
|
||||
|
||||
function migrateOldSyncFormats(config: SBConfig) {
|
||||
if (config["segmentTimes"]) {
|
||||
const unsubmittedSegments = {};
|
||||
for (const item of config["segmentTimes"]) {
|
||||
unsubmittedSegments[item[0]] = item[1];
|
||||
}
|
||||
|
||||
chrome.storage.sync.remove("segmentTimes", () => config.unsubmittedSegments = unsubmittedSegments);
|
||||
}
|
||||
|
||||
if (!config["exclusive_accessCategoryAdded"] && !config.categorySelections.some((s) => s.name === "exclusive_access")) {
|
||||
config["exclusive_accessCategoryAdded"] = true;
|
||||
|
||||
@@ -450,6 +452,29 @@ function migrateOldFormats(config: SBConfig) {
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof config["skipKeybind"] == "string") {
|
||||
config["skipKeybind"] = {key: config["skipKeybind"]};
|
||||
}
|
||||
|
||||
if (typeof config["startSponsorKeybind"] == "string") {
|
||||
config["startSponsorKeybind"] = {key: config["startSponsorKeybind"]};
|
||||
}
|
||||
|
||||
if (typeof config["submitKeybind"] == "string") {
|
||||
config["submitKeybind"] = {key: config["submitKeybind"]};
|
||||
}
|
||||
|
||||
// Unbind key if it matches a previous one set by the user (should be ordered oldest to newest)
|
||||
const keybinds = ["skipKeybind", "startSponsorKeybind", "submitKeybind"];
|
||||
for (let i = keybinds.length-1; i >= 0; i--) {
|
||||
for (let j = 0; j < keybinds.length; j++) {
|
||||
if (i == j)
|
||||
continue;
|
||||
if (keybindEquals(config[keybinds[i]], config[keybinds[j]]))
|
||||
config[keybinds[i]] = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove some old unused options
|
||||
if (config["sponsorVideoID"] !== undefined) {
|
||||
chrome.storage.sync.remove("sponsorVideoID");
|
||||
@@ -467,32 +492,32 @@ function migrateOldFormats(config: SBConfig) {
|
||||
async function setupConfig() {
|
||||
await fetchConfig();
|
||||
addDefaults();
|
||||
convertJSON();
|
||||
const config = configProxy();
|
||||
migrateOldFormats(config);
|
||||
migrateOldSyncFormats(config.sync);
|
||||
|
||||
Config.config = config;
|
||||
}
|
||||
|
||||
function convertJSON(): void {
|
||||
Object.keys(Config.localConfig).forEach(key => {
|
||||
Config.localConfig[key] = decodeStoredItem(key, Config.localConfig[key]);
|
||||
});
|
||||
Config.config = config.sync;
|
||||
Config.local = config.local;
|
||||
}
|
||||
|
||||
// Add defaults
|
||||
function addDefaults() {
|
||||
for (const key in Config.defaults) {
|
||||
if(!Object.prototype.hasOwnProperty.call(Config.localConfig, key)) {
|
||||
Config.localConfig[key] = Config.defaults[key];
|
||||
for (const key in Config.syncDefaults) {
|
||||
if(!Object.prototype.hasOwnProperty.call(Config.cachedSyncConfig, key)) {
|
||||
Config.cachedSyncConfig[key] = Config.syncDefaults[key];
|
||||
} else if (key === "barTypes") {
|
||||
for (const key2 in Config.defaults[key]) {
|
||||
if(!Object.prototype.hasOwnProperty.call(Config.localConfig[key], key2)) {
|
||||
Config.localConfig[key][key2] = Config.defaults[key][key2];
|
||||
for (const key2 in Config.syncDefaults[key]) {
|
||||
if(!Object.prototype.hasOwnProperty.call(Config.cachedSyncConfig[key], key2)) {
|
||||
Config.cachedSyncConfig[key][key2] = Config.syncDefaults[key][key2];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const key in Config.localDefaults) {
|
||||
if(!Object.prototype.hasOwnProperty.call(Config.cachedLocalStorage, key)) {
|
||||
Config.cachedLocalStorage[key] = Config.localDefaults[key];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sync config
|
||||
|
||||
256
src/content.ts
256
src/content.ts
@@ -1,7 +1,7 @@
|
||||
import Config from "./config";
|
||||
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, CategoryActionType, ChannelIDInfo, ChannelIDStatus, SponsorSourceType, SegmentUUID, Category, SkipToTimeParams, ToggleSkippable, ActionType, ScheduledTime } from "./types";
|
||||
import { SponsorTime, CategorySkipOption, VideoID, SponsorHideType, VideoInfo, StorageChangesObject, ChannelIDInfo, ChannelIDStatus, SponsorSourceType, SegmentUUID, Category, SkipToTimeParams, ToggleSkippable, ActionType, ScheduledTime, HashedValue } from "./types";
|
||||
|
||||
import { ContentContainer } from "./types";
|
||||
import { ContentContainer, Keybind } from "./types";
|
||||
import Utils from "./utils";
|
||||
const utils = new Utils();
|
||||
|
||||
@@ -13,11 +13,10 @@ import SkipNoticeComponent from "./components/SkipNoticeComponent";
|
||||
import SubmissionNotice from "./render/SubmissionNotice";
|
||||
import { Message, MessageResponse, VoteResponse } from "./messageTypes";
|
||||
import * as Chat from "./js-components/chat";
|
||||
import { getCategoryActionType } from "./utils/categoryUtils";
|
||||
import { SkipButtonControlBar } from "./js-components/skipButtonControlBar";
|
||||
import { Tooltip } from "./render/Tooltip";
|
||||
import { getStartTimeFromUrl } from "./utils/urlParser";
|
||||
import { findValidElement, getControls, getHashParams, isVisible } from "./utils/pageUtils";
|
||||
import { isSafari, keybindEquals } from "./utils/configUtils";
|
||||
import { CategoryPill } from "./render/CategoryPill";
|
||||
import { AnimationUtils } from "./utils/animationUtils";
|
||||
import { GenericUtils } from "./utils/genericUtils";
|
||||
@@ -46,6 +45,7 @@ let lockedCategories: Category[] = [];
|
||||
// Skips are rescheduled every seeking event.
|
||||
// Skips are canceled every seeking event
|
||||
let currentSkipSchedule: NodeJS.Timeout = null;
|
||||
let currentSkipInterval: NodeJS.Timeout = null;
|
||||
|
||||
/** Has the sponsor been skipped */
|
||||
let sponsorSkipped: boolean[] = [];
|
||||
@@ -92,15 +92,14 @@ const playerButtons: Record<string, {button: HTMLButtonElement, image: HTMLImage
|
||||
|
||||
// Direct Links after the config is loaded
|
||||
utils.wait(() => Config.config !== null, 1000, 1).then(() => videoIDChange(getYouTubeVideoID(document)));
|
||||
// wait for hover preview to appear, and refresh attachments if ever found
|
||||
window.addEventListener("DOMContentLoaded", () => utils.waitForElement(".ytp-inline-preview-ui").then(() => refreshVideoAttachments()));
|
||||
addPageListeners();
|
||||
addHotkeyListener();
|
||||
|
||||
//the amount of times the sponsor lookup has retried
|
||||
//this only happens if there is an error
|
||||
let sponsorLookupRetries = 0;
|
||||
|
||||
/** Segments created by the user which have not yet been submitted. */
|
||||
let sponsorTimesSubmitting: SponsorTime[] = [];
|
||||
let loadedPreloadedSegment = false;
|
||||
|
||||
//becomes true when isInfoFound is called
|
||||
//this is used to close the popup on YouTube when the other popup opens
|
||||
@@ -138,6 +137,9 @@ const manualSkipPercentCount = 0.5;
|
||||
|
||||
//get messages from the background script and the popup
|
||||
chrome.runtime.onMessage.addListener(messageListener);
|
||||
|
||||
//store pressed modifier keys
|
||||
const pressedKeys = new Set();
|
||||
|
||||
function messageListener(request: Message, sender: unknown, sendResponse: (response: MessageResponse) => void): void | boolean {
|
||||
//messages from popup script
|
||||
@@ -203,6 +205,15 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
}));
|
||||
|
||||
return true;
|
||||
case "submitVote":
|
||||
vote(request.type, request.UUID).then((response) => sendResponse(response));
|
||||
return true;
|
||||
case "hideSegment":
|
||||
utils.getSponsorTimeFromUUID(sponsorTimes, request.UUID).hidden = request.type;
|
||||
utils.addHiddenSegment(sponsorVideoID, request.UUID, request.type);
|
||||
updatePreviewBar();
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -223,8 +234,8 @@ function contentConfigUpdateListener(changes: StorageChangesObject) {
|
||||
}
|
||||
}
|
||||
|
||||
if (!Config.configListeners.includes(contentConfigUpdateListener)) {
|
||||
Config.configListeners.push(contentConfigUpdateListener);
|
||||
if (!Config.configSyncListeners.includes(contentConfigUpdateListener)) {
|
||||
Config.configSyncListeners.push(contentConfigUpdateListener);
|
||||
}
|
||||
|
||||
function resetValues() {
|
||||
@@ -233,7 +244,6 @@ function resetValues() {
|
||||
|
||||
//reset sponsor times
|
||||
sponsorTimes = null;
|
||||
sponsorLookupRetries = 0;
|
||||
sponsorSkipped = [];
|
||||
|
||||
videoInfo = null;
|
||||
@@ -418,9 +428,13 @@ function videoOnReadyListener(): void {
|
||||
function cancelSponsorSchedule(): void {
|
||||
if (currentSkipSchedule !== null) {
|
||||
clearTimeout(currentSkipSchedule);
|
||||
|
||||
currentSkipSchedule = null;
|
||||
}
|
||||
|
||||
if (currentSkipInterval !== null) {
|
||||
clearInterval(currentSkipInterval);
|
||||
currentSkipInterval = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -482,14 +496,15 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
// Don't skip if this category should not be skipped
|
||||
if (!shouldSkip(currentSkip) && !sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment)) return;
|
||||
|
||||
const skippingFunction = () => {
|
||||
const skippingFunction = (forceVideoTime?: number) => {
|
||||
let forcedSkipTime: number = null;
|
||||
let forcedIncludeIntersectingSegments = false;
|
||||
let forcedIncludeNonIntersectingSegments = true;
|
||||
|
||||
if (incorrectVideoCheck(videoID, currentSkip)) return;
|
||||
forceVideoTime ||= video.currentTime;
|
||||
|
||||
if (video.currentTime >= skipTime[0] && video.currentTime < skipTime[1]) {
|
||||
if (forceVideoTime >= skipTime[0] && forceVideoTime < skipTime[1]) {
|
||||
skipToTime({
|
||||
v: video,
|
||||
skipTime,
|
||||
@@ -513,7 +528,22 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
if (timeUntilSponsor <= 0) {
|
||||
skippingFunction();
|
||||
} else {
|
||||
currentSkipSchedule = setTimeout(skippingFunction, timeUntilSponsor * 1000 * (1 / video.playbackRate));
|
||||
const delayTime = timeUntilSponsor * 1000 * (1 / video.playbackRate);
|
||||
if (delayTime < 300 && utils.isFirefox() && !isSafari()) {
|
||||
// For Firefox, use interval instead of timeout near the end to combat imprecise video time
|
||||
const startIntervalTime = performance.now();
|
||||
const startVideoTime = video.currentTime;
|
||||
currentSkipInterval = setInterval(() => {
|
||||
const intervalDuration = performance.now() - startIntervalTime;
|
||||
if (intervalDuration >= delayTime || video.currentTime >= skipTime[0]) {
|
||||
clearInterval(currentSkipInterval);
|
||||
skippingFunction(Math.max(video.currentTime, startVideoTime + intervalDuration / 1000));
|
||||
}
|
||||
}, 5);
|
||||
} else {
|
||||
// Schedule for right before to be more precise than normal timeout
|
||||
currentSkipSchedule = setTimeout(skippingFunction, Math.max(0, delayTime - 30));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -682,21 +712,15 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
|
||||
setupVideoMutationListener();
|
||||
|
||||
//check database for sponsor times
|
||||
//made true once a setTimeout has been created to try again after a server error
|
||||
let recheckStarted = false;
|
||||
// Create categories list
|
||||
const categories: string[] = [];
|
||||
for (const categorySelection of Config.config.categorySelections) {
|
||||
categories.push(categorySelection.name);
|
||||
}
|
||||
const categories: string[] = Config.config.categorySelections.map((category) => category.name);
|
||||
|
||||
const extraRequestData: Record<string, unknown> = {};
|
||||
const hashParams = getHashParams();
|
||||
if (hashParams.requiredSegment) extraRequestData.requiredSegment = hashParams.requiredSegment;
|
||||
|
||||
// Check for hashPrefix setting
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
const hashPrefix = (await utils.getHash(id, 1)).slice(0, 4) as VideoID & HashedValue;
|
||||
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories,
|
||||
actionTypes: getEnabledActionTypes(),
|
||||
@@ -731,10 +755,10 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
|
||||
// Hide all submissions smaller than the minimum duration
|
||||
if (Config.config.minDuration !== 0) {
|
||||
for (let i = 0; i < sponsorTimes.length; i++) {
|
||||
if (sponsorTimes[i].segment[1] - sponsorTimes[i].segment[0] < Config.config.minDuration
|
||||
&& getCategoryActionType(sponsorTimes[i].category) !== CategoryActionType.POI) {
|
||||
sponsorTimes[i].hidden = SponsorHideType.MinimumDuration;
|
||||
for (const segment of sponsorTimes) {
|
||||
const duration = segment.segment[1] - segment.segment[0];
|
||||
if (duration > 0 && duration < Config.config.minDuration) {
|
||||
segment.hidden = SponsorHideType.MinimumDuration;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -750,6 +774,18 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
}
|
||||
}
|
||||
|
||||
// See if some segments should be hidden
|
||||
const downvotedData = Config.local.downvotedSegments[hashPrefix];
|
||||
if (downvotedData) {
|
||||
for (const segment of sponsorTimes) {
|
||||
const hashedUUID = await utils.getHash(segment.UUID, 1);
|
||||
const segmentDownvoteData = downvotedData.segments.find((downvote) => downvote.uuid === hashedUUID);
|
||||
if (segmentDownvoteData) {
|
||||
segment.hidden = segmentDownvoteData.hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startSkipScheduleCheckingForStartSponsors();
|
||||
|
||||
//update the preview bar
|
||||
@@ -759,29 +795,15 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
//otherwise the listener can handle it
|
||||
updatePreviewBar();
|
||||
}
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
} else if (response?.status === 404) {
|
||||
retryFetch();
|
||||
} else if (sponsorLookupRetries < 15 && !recheckStarted) {
|
||||
recheckStarted = true;
|
||||
|
||||
//TODO lower when server becomes better (back to 1 second)
|
||||
//some error occurred, try again in a second
|
||||
setTimeout(() => {
|
||||
if (sponsorVideoID && sponsorTimes?.length === 0) {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
}
|
||||
}, 5000 + Math.random() * 15000 + 5000 * sponsorLookupRetries);
|
||||
|
||||
sponsorLookupRetries++;
|
||||
}
|
||||
|
||||
lookupVipInformation(id);
|
||||
}
|
||||
|
||||
function getEnabledActionTypes(): ActionType[] {
|
||||
const actionTypes = [ActionType.Skip];
|
||||
const actionTypes = [ActionType.Skip, ActionType.Poi];
|
||||
if (Config.config.muteSegments) {
|
||||
actionTypes.push(ActionType.Mute);
|
||||
}
|
||||
@@ -826,7 +848,7 @@ async function updateVipInfo(): Promise<boolean> {
|
||||
}
|
||||
|
||||
async function lockedCategoriesLookup(id: string): Promise<void> {
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
const hashPrefix = (await utils.getHash(id, 1)).slice(0, 4);
|
||||
const response = await utils.asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
|
||||
|
||||
if (response.ok) {
|
||||
@@ -849,8 +871,6 @@ function retryFetch(): void {
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
}
|
||||
}, 10000 + Math.random() * 30000);
|
||||
|
||||
sponsorLookupRetries = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -866,7 +886,7 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
let startingSegment: SponsorTime = null;
|
||||
for (const time of sponsorTimes) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
|
||||
&& time.actionType !== ActionType.Poi) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
found = true;
|
||||
@@ -876,7 +896,7 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
if (!found) {
|
||||
for (const time of sponsorTimesSubmitting) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
|
||||
&& time.actionType !== ActionType.Poi) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
found = true;
|
||||
@@ -887,7 +907,7 @@ function startSkipScheduleCheckingForStartSponsors() {
|
||||
|
||||
// For highlight category
|
||||
const poiSegments = sponsorTimes
|
||||
.filter((time) => time.segment[1] > video.currentTime && getCategoryActionType(time.category) === CategoryActionType.POI)
|
||||
.filter((time) => time.segment[1] > video.currentTime && time.actionType === ActionType.Poi)
|
||||
.sort((a, b) => b.segment[0] - a.segment[0]);
|
||||
for (const time of poiSegments) {
|
||||
const skipOption = utils.getCategorySelection(time.category)?.option;
|
||||
@@ -938,6 +958,8 @@ async function getVideoInfo(): Promise<void> {
|
||||
|
||||
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 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/
|
||||
@@ -945,7 +967,7 @@ function getYouTubeVideoID(document: Document): string | boolean {
|
||||
// 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
|
||||
return getYouTubeVideoIDFromURL(url) || getYouTubeVideoIDFromDocument(document);
|
||||
return getYouTubeVideoIDFromURL(url) || getYouTubeVideoIDFromDocument(document, false);
|
||||
}
|
||||
|
||||
function getYouTubeVideoIDFromDocument(document: Document, hideIcon = true): string | boolean {
|
||||
@@ -991,8 +1013,8 @@ function getYouTubeVideoIDFromURL(url: string): string | boolean {
|
||||
return id.length == 11 ? id : false;
|
||||
} else if (urlObject.pathname.startsWith("/embed/") || urlObject.pathname.startsWith("/shorts/")) {
|
||||
try {
|
||||
const id = urlObject.pathname.split("/")[2];
|
||||
if (id && id.length >= 11) return id.substr(0, 11);
|
||||
const id = urlObject.pathname.split("/")[2]
|
||||
if (id?.length >=11 ) return id.slice(0, 11);
|
||||
} catch (e) {
|
||||
console.error("[SB] Video ID not valid for " + url);
|
||||
return false;
|
||||
@@ -1030,7 +1052,7 @@ function updatePreviewBar(): void {
|
||||
category: segment.category,
|
||||
unsubmitted: false,
|
||||
actionType: segment.actionType,
|
||||
showLarger: getCategoryActionType(segment.category) === CategoryActionType.POI
|
||||
showLarger: segment.actionType === ActionType.Poi
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -1041,7 +1063,7 @@ function updatePreviewBar(): void {
|
||||
category: segment.category,
|
||||
unsubmitted: true,
|
||||
actionType: segment.actionType,
|
||||
showLarger: getCategoryActionType(segment.category) === CategoryActionType.POI
|
||||
showLarger: segment.actionType === ActionType.Poi
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1064,7 +1086,8 @@ async function whitelistCheck() {
|
||||
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 > .channel-profile")?.parentElement?.getAttribute("href")?.replace(/\/.+\//, "") // Invidious
|
||||
?? document.querySelector("a.slim-owner-icon-and-title")?.getAttribute("href")?.replace(/\/.+\//, ""); // Mobile YouTube
|
||||
|
||||
try {
|
||||
await utils.wait(() => !!getChannelID(), 6000, 20);
|
||||
@@ -1214,7 +1237,7 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments:
|
||||
|| (includeIntersectingSegments && possibleTimes[i].scheduledTime < minimum && possibleTimes[i].segment[1] > minimum)))
|
||||
&& (!onlySkippableSponsors || shouldSkip(possibleTimes[i]))
|
||||
&& (!hideHiddenSponsors || possibleTimes[i].hidden === SponsorHideType.Visible)
|
||||
&& getCategoryActionType(possibleTimes[i].category) === CategoryActionType.Skippable) {
|
||||
&& possibleTimes[i].actionType !== ActionType.Poi) {
|
||||
|
||||
scheduledTimes.push(possibleTimes[i].scheduledTime);
|
||||
includedTimes.push(possibleTimes[i]);
|
||||
@@ -1268,6 +1291,7 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
if ((autoSkip || sponsorTimesSubmitting.some((time) => time.segment === skippingSegments[0].segment))
|
||||
&& v.currentTime !== skipTime[1]) {
|
||||
switch(skippingSegments[0].actionType) {
|
||||
case ActionType.Poi:
|
||||
case ActionType.Skip: {
|
||||
// Fix for looped videos not working when skipping to the end #426
|
||||
// for some reason you also can't skip to 1 second before the end
|
||||
@@ -1295,14 +1319,21 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
if (autoSkip && Config.config.audioNotificationOnSkip) {
|
||||
const beep = new Audio(chrome.runtime.getURL("icons/beep.ogg"));
|
||||
beep.volume = video.volume * 0.1;
|
||||
const oldMetadata = navigator.mediaSession.metadata
|
||||
beep.play();
|
||||
beep.addEventListener("ended", () => {
|
||||
navigator.mediaSession.metadata = null;
|
||||
setTimeout(() =>
|
||||
navigator.mediaSession.metadata = oldMetadata
|
||||
);
|
||||
})
|
||||
}
|
||||
|
||||
if (!autoSkip
|
||||
&& skippingSegments.length === 1
|
||||
&& getCategoryActionType(skippingSegments[0].category) === CategoryActionType.POI) {
|
||||
&& skippingSegments[0].actionType === ActionType.Poi) {
|
||||
skipButtonControlBar.enable(skippingSegments[0]);
|
||||
if (onMobileYouTube) skipButtonControlBar.setShowKeybindHint(false);
|
||||
if (onMobileYouTube || Config.config.skipKeybind == null) skipButtonControlBar.setShowKeybindHint(false);
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
activeSkipKeybindElement = skipButtonControlBar;
|
||||
@@ -1311,7 +1342,7 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
//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) newSkipNotice.setShowKeybindHint(false);
|
||||
if (onMobileYouTube || Config.config.skipKeybind == null) newSkipNotice.setShowKeybindHint(false);
|
||||
skipNotices.push(newSkipNotice);
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
@@ -1391,7 +1422,7 @@ function createButton(baseID: string, title: string, callback: () => void, image
|
||||
function shouldAutoSkip(segment: SponsorTime): boolean {
|
||||
return utils.getCategorySelection(segment.category)?.option === CategorySkipOption.AutoSkip ||
|
||||
(Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic")
|
||||
&& getCategoryActionType(segment.category) === CategoryActionType.Skippable);
|
||||
&& segment.actionType !== ActionType.Poi);
|
||||
}
|
||||
|
||||
function shouldSkip(segment: SponsorTime): boolean {
|
||||
@@ -1518,7 +1549,8 @@ function startOrEndTimingNewSegment() {
|
||||
}
|
||||
|
||||
// Save the newly created segment
|
||||
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||
Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting;
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
// Make sure they know if someone has already submitted something it while they were watching
|
||||
sponsorsLookup(sponsorVideoID);
|
||||
@@ -1540,7 +1572,8 @@ function isSegmentCreationInProgress(): boolean {
|
||||
function cancelCreatingSegment() {
|
||||
if (isSegmentCreationInProgress()) {
|
||||
sponsorTimesSubmitting.splice(sponsorTimesSubmitting.length - 1, 1);
|
||||
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||
Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting;
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
if (sponsorTimesSubmitting.length <= 0) resetSponsorSubmissionNotice();
|
||||
}
|
||||
@@ -1550,7 +1583,7 @@ function cancelCreatingSegment() {
|
||||
}
|
||||
|
||||
function updateSponsorTimesSubmitting(getFromConfig = true) {
|
||||
const segmentTimes = Config.config.segmentTimes.get(sponsorVideoID);
|
||||
const segmentTimes = Config.config.unsubmittedSegments[sponsorVideoID];
|
||||
|
||||
//see if this data should be saved in the sponsorTimesSubmitting variable
|
||||
if (getFromConfig && segmentTimes != undefined) {
|
||||
@@ -1638,11 +1671,15 @@ function openInfoMenu() {
|
||||
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);
|
||||
@@ -1679,7 +1716,7 @@ function closeInfoMenuAnd<T>(func: () => T): T {
|
||||
function clearSponsorTimes() {
|
||||
const currentVideoID = sponsorVideoID;
|
||||
|
||||
const sponsorTimes = Config.config.segmentTimes.get(currentVideoID);
|
||||
const sponsorTimes = Config.config.unsubmittedSegments[currentVideoID];
|
||||
|
||||
if (sponsorTimes != undefined && sponsorTimes.length > 0) {
|
||||
const confirmMessage = chrome.i18n.getMessage("clearThis") + getSegmentsMessage(sponsorTimes)
|
||||
@@ -1689,7 +1726,8 @@ function clearSponsorTimes() {
|
||||
resetSponsorSubmissionNotice();
|
||||
|
||||
//clear the sponsor times
|
||||
Config.config.segmentTimes.delete(currentVideoID);
|
||||
delete Config.config.unsubmittedSegments[currentVideoID];
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
//clear sponsor times submitting
|
||||
sponsorTimesSubmitting = [];
|
||||
@@ -1700,7 +1738,7 @@ function clearSponsorTimes() {
|
||||
}
|
||||
|
||||
//if skipNotice is null, it will not affect the UI
|
||||
async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent): Promise<void> {
|
||||
async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent): Promise<VoteResponse> {
|
||||
if (skipNotice !== null && skipNotice !== undefined) {
|
||||
//add loading info
|
||||
skipNotice.addVoteButtonInfo.bind(skipNotice)(chrome.i18n.getMessage("Loading"))
|
||||
@@ -1728,6 +1766,8 @@ async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNo
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
async function voteAsync(type: number, UUID: SegmentUUID, category?: Category): Promise<VoteResponse> {
|
||||
@@ -1757,7 +1797,29 @@ async function voteAsync(type: number, UUID: SegmentUUID, category?: Category):
|
||||
type: type,
|
||||
UUID: UUID,
|
||||
category: category
|
||||
}, resolve);
|
||||
}, (response) => {
|
||||
if (response.successType === 1) {
|
||||
// Change the sponsor locally
|
||||
const segment = utils.getSponsorTimeFromUUID(sponsorTimes, UUID);
|
||||
if (segment) {
|
||||
if (type === 0) {
|
||||
segment.hidden = SponsorHideType.Downvoted;
|
||||
} else if (category) {
|
||||
segment.category = category;
|
||||
} else if (type === 1) {
|
||||
segment.hidden = SponsorHideType.Visible;
|
||||
}
|
||||
|
||||
if (!category && !Config.config.isVip) {
|
||||
utils.addHiddenSegment(sponsorVideoID, segment.UUID, segment.hidden);
|
||||
}
|
||||
|
||||
updatePreviewBar();
|
||||
}
|
||||
}
|
||||
|
||||
resolve(response);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1816,7 +1878,8 @@ async function sendSubmitMessage() {
|
||||
}
|
||||
|
||||
//update sponsorTimes
|
||||
Config.config.segmentTimes.set(sponsorVideoID, sponsorTimesSubmitting);
|
||||
Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting;
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
// Check to see if any of the submissions are below the minimum duration set
|
||||
if (Config.config.minDuration > 0) {
|
||||
@@ -1843,7 +1906,8 @@ async function sendSubmitMessage() {
|
||||
stopAnimation();
|
||||
|
||||
// Remove segments from storage since they've already been submitted
|
||||
Config.config.segmentTimes.delete(sponsorVideoID);
|
||||
delete Config.config.unsubmittedSegments[sponsorVideoID];
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
|
||||
const newSegments = sponsorTimesSubmitting;
|
||||
try {
|
||||
@@ -1870,6 +1934,11 @@ async function sendSubmitMessage() {
|
||||
sponsorTimesSubmitting = [];
|
||||
|
||||
updatePreviewBar();
|
||||
|
||||
const fullVideoSegment = sponsorTimes.filter((time) => time.actionType === ActionType.Full)[0];
|
||||
if (fullVideoSegment) {
|
||||
categoryPill?.setSegment(fullVideoSegment);
|
||||
}
|
||||
} else {
|
||||
// Show that the upload failed
|
||||
playerButtons.submit.button.style.animation = "unset";
|
||||
@@ -1892,7 +1961,7 @@ function getSegmentsMessage(sponsorTimes: SponsorTime[]): string {
|
||||
let timeMessage = utils.getFormattedTime(sponsorTimes[i].segment[s]);
|
||||
//if this is an end time
|
||||
if (s == 1) {
|
||||
timeMessage = " to " + timeMessage;
|
||||
timeMessage = " " + chrome.i18n.getMessage("to") + " " + timeMessage;
|
||||
} else if (i > 0) {
|
||||
//add commas if necessary
|
||||
timeMessage = ", " + timeMessage;
|
||||
@@ -1917,30 +1986,47 @@ function addPageListeners(): void {
|
||||
|
||||
function addHotkeyListener(): void {
|
||||
document.addEventListener("keydown", hotkeyListener);
|
||||
document.addEventListener("keyup", (e) => pressedKeys.delete(e.key));
|
||||
document.addEventListener("focus", (e) => pressedKeys.clear());
|
||||
}
|
||||
|
||||
function hotkeyListener(e: KeyboardEvent): void {
|
||||
if (["textarea", "input"].includes(document.activeElement?.tagName?.toLowerCase())
|
||||
|| document.activeElement?.id?.toLowerCase()?.includes("editable")) return;
|
||||
|
||||
const key = e.key;
|
||||
if (["Alt", "Control", "Shift", "AltGraph"].includes(e.key)) {
|
||||
pressedKeys.add(e.key);
|
||||
return;
|
||||
}
|
||||
|
||||
const key:Keybind = {key: e.key, code: e.code, alt: pressedKeys.has("Alt"), ctrl: pressedKeys.has("Control"), shift: pressedKeys.has("Shift")};
|
||||
|
||||
const skipKey = Config.config.skipKeybind;
|
||||
const startSponsorKey = Config.config.startSponsorKeybind;
|
||||
const submitKey = Config.config.submitKeybind;
|
||||
|
||||
switch (key) {
|
||||
case skipKey:
|
||||
if (activeSkipKeybindElement) {
|
||||
if (!pressedKeys.has("AltGraph")) {
|
||||
if (keybindEquals(key, skipKey)) {
|
||||
if (activeSkipKeybindElement)
|
||||
activeSkipKeybindElement.toggleSkip.call(activeSkipKeybindElement);
|
||||
}
|
||||
break;
|
||||
case startSponsorKey:
|
||||
return;
|
||||
} else if (keybindEquals(key, startSponsorKey)) {
|
||||
startOrEndTimingNewSegment();
|
||||
break;
|
||||
case submitKey:
|
||||
return;
|
||||
} else if (keybindEquals(key, submitKey)) {
|
||||
submitSponsorTimes();
|
||||
break;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//legacy - to preserve keybinds for skipKey, startSponsorKey and submitKey for people who set it before the update. (shouldn't be changed for future keybind options)
|
||||
if (key.key == skipKey?.key && skipKey.code == null && !keybindEquals(Config.syncDefaults.skipKeybind, skipKey)) {
|
||||
if (activeSkipKeybindElement)
|
||||
activeSkipKeybindElement.toggleSkip.call(activeSkipKeybindElement);
|
||||
} else if (key.key == startSponsorKey?.key && startSponsorKey.code == null && !keybindEquals(Config.syncDefaults.startSponsorKeybind, startSponsorKey)) {
|
||||
startOrEndTimingNewSegment();
|
||||
} else if (key.key == submitKey?.key && submitKey.code == null && !keybindEquals(Config.syncDefaults.submitKeybind, submitKey)) {
|
||||
submitSponsorTimes();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1990,7 +2076,6 @@ function sendRequestToCustomServer(type, fullAddress, callback) {
|
||||
function updateAdFlag(): void {
|
||||
const wasAdPlaying = isAdPlaying;
|
||||
isAdPlaying = document.getElementsByClassName('ad-showing').length > 0;
|
||||
|
||||
if(wasAdPlaying != isAdPlaying) {
|
||||
updatePreviewBar();
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
@@ -2026,8 +2111,12 @@ function showTimeWithoutSkips(skippedDuration: number): void {
|
||||
}
|
||||
|
||||
function checkForPreloadedSegment() {
|
||||
if (loadedPreloadedSegment) return;
|
||||
|
||||
loadedPreloadedSegment = true;
|
||||
const hashParams = getHashParams();
|
||||
|
||||
let pushed = false;
|
||||
const segments = hashParams.segments;
|
||||
if (Array.isArray(segments)) {
|
||||
for (const segment of segments) {
|
||||
@@ -2040,8 +2129,15 @@ function checkForPreloadedSegment() {
|
||||
actionType: segment.actionType ? segment.actionType : ActionType.Skip,
|
||||
source: SponsorSourceType.Local
|
||||
});
|
||||
|
||||
pushed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (pushed) {
|
||||
Config.config.unsubmittedSegments[sponsorVideoID] = sponsorTimesSubmitting;
|
||||
Config.forceSyncUpdate("unsubmittedSegments");
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,10 @@ async function init() {
|
||||
|
||||
await utils.wait(() => Config.config !== null);
|
||||
|
||||
if (!Config.config.darkMode) {
|
||||
document.documentElement.setAttribute("data-theme", "light");
|
||||
}
|
||||
|
||||
if (!showDonationLink()) {
|
||||
document.getElementById("sbDonate").style.display = "none";
|
||||
}
|
||||
|
||||
@@ -1,6 +1,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";
|
||||
@@ -180,7 +181,7 @@ export class SkipButtonControlBar {
|
||||
}
|
||||
|
||||
private getTitle(): string {
|
||||
return getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "");
|
||||
return getSkippingText([this.segment], false) + (this.showKeybindHint ? " (" + keybindToString(Config.config.skipKeybind) + ")" : "");
|
||||
}
|
||||
|
||||
private getChapterPrefix(): HTMLElement {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// Message and Response Types
|
||||
//
|
||||
|
||||
import { SponsorTime } from "./types";
|
||||
import { SegmentUUID, SponsorHideType, SponsorTime } from "./types";
|
||||
|
||||
interface BaseMessage {
|
||||
from?: string;
|
||||
@@ -29,7 +29,19 @@ interface IsInfoFoundMessage {
|
||||
updating: boolean;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage);
|
||||
interface SubmitVoteMessage {
|
||||
message: "submitVote";
|
||||
type: number;
|
||||
UUID: SegmentUUID;
|
||||
}
|
||||
|
||||
interface HideSegmentMessage {
|
||||
message: "hideSegment";
|
||||
type: SponsorHideType;
|
||||
UUID: SegmentUUID;
|
||||
}
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage | SubmitVoteMessage | HideSegmentMessage);
|
||||
|
||||
export interface IsInfoFoundMessageResponse {
|
||||
found: boolean;
|
||||
@@ -59,7 +71,8 @@ export type MessageResponse =
|
||||
| GetChannelIDResponse
|
||||
| SponsorStartResponse
|
||||
| IsChannelWhitelistedResponse
|
||||
| Record<string, never>;
|
||||
| Record<string, never>
|
||||
| VoteResponse;
|
||||
|
||||
export interface VoteResponse {
|
||||
successType: number;
|
||||
|
||||
406
src/options.ts
406
src/options.ts
@@ -1,3 +1,6 @@
|
||||
import * as React from "react";
|
||||
import * as ReactDOM from "react-dom";
|
||||
|
||||
import Config from "./config";
|
||||
import * as CompileConfig from "../config.json";
|
||||
import * as invidiousList from "../ci/invidiouslist.json";
|
||||
@@ -7,31 +10,54 @@ window.SB = Config;
|
||||
|
||||
import Utils from "./utils";
|
||||
import CategoryChooser from "./render/CategoryChooser";
|
||||
import KeybindComponent from "./components/KeybindComponent";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
const utils = new Utils();
|
||||
let embed = false;
|
||||
|
||||
window.addEventListener('DOMContentLoaded', init);
|
||||
|
||||
async function init() {
|
||||
utils.localizeHtmlPage();
|
||||
|
||||
// selected tab
|
||||
if (location.hash != "") {
|
||||
const substr = location.hash.slice(1);
|
||||
let menuItem = document.querySelector(`[data-for='${substr}']`);
|
||||
if (menuItem == null)
|
||||
menuItem = document.querySelector(`[data-for='behavior']`);
|
||||
menuItem.classList.add("selected");
|
||||
} else {
|
||||
document.querySelector(`[data-for='behavior']`).classList.add("selected");
|
||||
}
|
||||
|
||||
document.getElementById("version").innerText = "v. " + chrome.runtime.getManifest().version;
|
||||
|
||||
// Remove header if needed
|
||||
if (window.location.hash === "#embed") {
|
||||
embed = true;
|
||||
for (const element of document.getElementsByClassName("titleBar")) {
|
||||
element.classList.add("hidden");
|
||||
}
|
||||
|
||||
document.getElementById("options").classList.add("embed");
|
||||
createStickyHeader();
|
||||
}
|
||||
|
||||
if (!Config.configListeners.includes(optionsConfigUpdateListener)) {
|
||||
Config.configListeners.push(optionsConfigUpdateListener);
|
||||
if (!Config.configSyncListeners.includes(optionsConfigUpdateListener)) {
|
||||
Config.configSyncListeners.push(optionsConfigUpdateListener);
|
||||
}
|
||||
|
||||
await utils.wait(() => Config.config !== null);
|
||||
|
||||
if (!Config.config.darkMode) {
|
||||
document.documentElement.setAttribute("data-theme", "light");
|
||||
}
|
||||
|
||||
const donate = document.getElementById("sbDonate");
|
||||
donate.addEventListener("click", () => Config.config.donateClicked = Config.config.donateClicked + 1);
|
||||
if (!showDonationLink()) {
|
||||
document.getElementById("sbDonate").style.visibility = "hidden";
|
||||
donate.classList.add("hidden");
|
||||
}
|
||||
|
||||
// Set all of the toggle options to the correct option
|
||||
@@ -39,31 +65,32 @@ async function init() {
|
||||
const optionsElements = optionsContainer.querySelectorAll("*");
|
||||
|
||||
for (let i = 0; i < optionsElements.length; i++) {
|
||||
if ((optionsElements[i].getAttribute("private-mode-only") === "true" && !(await isIncognitoAllowed()))
|
||||
|| (optionsElements[i].getAttribute("no-safari") === "true" && navigator.vendor === "Apple Computer, Inc.")
|
||||
|| (optionsElements[i].getAttribute("if-false") && Config.config[optionsElements[i].getAttribute("if-false")])) {
|
||||
optionsElements[i].classList.add("hidden");
|
||||
continue;
|
||||
const dependentOnName = optionsElements[i].getAttribute("data-dependent-on");
|
||||
const dependentOn = optionsContainer.querySelector(`[data-sync='${dependentOnName}']`);
|
||||
let isDependentOnReversed = false;
|
||||
if (dependentOn)
|
||||
isDependentOnReversed = dependentOn.getAttribute("data-toggle-type") === "reverse" || optionsElements[i].getAttribute("data-dependent-on-inverted") === "true";
|
||||
|
||||
if (await shouldHideOption(optionsElements[i]) || (dependentOn && (isDependentOnReversed ? Config.config[dependentOnName] : !Config.config[dependentOnName]))) {
|
||||
optionsElements[i].classList.add("hidden", "hiding");
|
||||
if (!dependentOn)
|
||||
continue;
|
||||
}
|
||||
|
||||
const option = optionsElements[i].getAttribute("sync-option");
|
||||
const option = optionsElements[i].getAttribute("data-sync");
|
||||
|
||||
switch (optionsElements[i].getAttribute("option-type")) {
|
||||
switch (optionsElements[i].getAttribute("data-type")) {
|
||||
case "toggle": {
|
||||
const optionResult = Config.config[option];
|
||||
|
||||
const checkbox = optionsElements[i].querySelector("input");
|
||||
const reverse = optionsElements[i].getAttribute("toggle-type") === "reverse";
|
||||
const reverse = optionsElements[i].getAttribute("data-toggle-type") === "reverse";
|
||||
|
||||
const confirmMessage = optionsElements[i].getAttribute("confirm-message");
|
||||
const confirmMessage = optionsElements[i].getAttribute("data-confirm-message");
|
||||
const confirmOnTrue = optionsElements[i].getAttribute("data-confirm-on") !== "false";
|
||||
|
||||
if (optionResult != undefined) {
|
||||
checkbox.checked = optionResult;
|
||||
|
||||
if (reverse) {
|
||||
optionsElements[i].querySelector("input").checked = !optionResult;
|
||||
}
|
||||
}
|
||||
if (optionResult != undefined)
|
||||
checkbox.checked = reverse ? !optionResult : optionResult;
|
||||
|
||||
// See if anything extra should be run first time
|
||||
switch (option) {
|
||||
@@ -73,10 +100,11 @@ async function init() {
|
||||
}
|
||||
|
||||
// Add click listener
|
||||
checkbox.addEventListener("click", () => {
|
||||
checkbox.addEventListener("click", async () => {
|
||||
// Confirm if required
|
||||
if (checkbox.checked && confirmMessage && !confirm(chrome.i18n.getMessage(confirmMessage))){
|
||||
checkbox.checked = false;
|
||||
if (confirmMessage && ((confirmOnTrue && checkbox.checked) || (!confirmOnTrue && !checkbox.checked))
|
||||
&& !confirm(chrome.i18n.getMessage(confirmMessage))){
|
||||
checkbox.checked = !checkbox.checked;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -92,11 +120,41 @@ async function init() {
|
||||
// Enable the notice
|
||||
Config.config["dontShowNotice"] = false;
|
||||
|
||||
const showNoticeSwitch = <HTMLInputElement> document.querySelector("[sync-option='dontShowNotice'] > label > label > input");
|
||||
const showNoticeSwitch = <HTMLInputElement> document.querySelector("[data-sync='dontShowNotice'] > div > label > input");
|
||||
showNoticeSwitch.checked = true;
|
||||
}
|
||||
|
||||
break;
|
||||
case "showDonationLink":
|
||||
if (checkbox.checked)
|
||||
document.getElementById("sbDonate").classList.add("hidden");
|
||||
else
|
||||
document.getElementById("sbDonate").classList.remove("hidden");
|
||||
break;
|
||||
case "darkMode":
|
||||
if (checkbox.checked) {
|
||||
document.documentElement.setAttribute("data-theme", "dark");
|
||||
} else {
|
||||
document.documentElement.setAttribute("data-theme", "light");
|
||||
}
|
||||
break;
|
||||
case "trackDownvotes":
|
||||
if (!checkbox.checked) {
|
||||
Config.local.downvotedSegments = {};
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
// If other options depend on this, hide/show them
|
||||
const dependents = optionsContainer.querySelectorAll(`[data-dependent-on='${option}']`);
|
||||
for (let j = 0; j < dependents.length; j++) {
|
||||
const disableWhenChecked = dependents[j].getAttribute("data-dependent-on-inverted") === "true";
|
||||
if (!await shouldHideOption(dependents[j]) && (!disableWhenChecked && checkbox.checked || disableWhenChecked && !checkbox.checked)) {
|
||||
dependents[j].classList.remove("hidden");
|
||||
setTimeout(() => dependents[j].classList.remove("hiding"), 1);
|
||||
} else {
|
||||
dependents[j].classList.add("hiding");
|
||||
setTimeout(() => dependents[j].classList.add("hidden"), 400);
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
@@ -144,7 +202,7 @@ async function init() {
|
||||
textChangeResetButton.addEventListener("click", () => {
|
||||
if (!confirm(chrome.i18n.getMessage("areYouSureReset"))) return;
|
||||
|
||||
Config.config[option] = Config.defaults[option];
|
||||
Config.config[option] = Config.syncDefaults[option];
|
||||
|
||||
textChangeInput.value = Config.config[option];
|
||||
});
|
||||
@@ -155,7 +213,15 @@ async function init() {
|
||||
const button = optionsElements[i].querySelector(".trigger-button");
|
||||
button.addEventListener("click", () => activatePrivateTextChange(<HTMLElement> optionsElements[i]));
|
||||
|
||||
const privateTextChangeOption = optionsElements[i].getAttribute("sync-option");
|
||||
if (option == "*") {
|
||||
const downloadButton = optionsElements[i].querySelector(".download-button");
|
||||
downloadButton.addEventListener("click", downloadConfig);
|
||||
|
||||
const uploadButton = optionsElements[i].querySelector(".upload-button");
|
||||
uploadButton.addEventListener("change", (e) => uploadConfig(e));
|
||||
}
|
||||
|
||||
const privateTextChangeOption = optionsElements[i].getAttribute("data-sync");
|
||||
// See if anything extra must be done
|
||||
switch (privateTextChangeOption) {
|
||||
case "invidiousInstances":
|
||||
@@ -167,7 +233,7 @@ async function init() {
|
||||
case "button-press": {
|
||||
const actionButton = optionsElements[i].querySelector(".trigger-button");
|
||||
|
||||
switch(optionsElements[i].getAttribute("sync-option")) {
|
||||
switch(optionsElements[i].getAttribute("data-sync")) {
|
||||
case "copyDebugInformation":
|
||||
actionButton.addEventListener("click", copyDebugOutputToClipboard);
|
||||
break;
|
||||
@@ -176,9 +242,7 @@ async function init() {
|
||||
break;
|
||||
}
|
||||
case "keybind-change": {
|
||||
const keybindButton = optionsElements[i].querySelector(".trigger-button");
|
||||
keybindButton.addEventListener("click", () => activateKeybindChange(<HTMLElement> optionsElements[i]));
|
||||
|
||||
ReactDOM.render(React.createElement(KeybindComponent, {option: option}), optionsElements[i].querySelector("div"));
|
||||
break;
|
||||
}
|
||||
case "display": {
|
||||
@@ -190,7 +254,7 @@ async function init() {
|
||||
const numberInput = optionsElements[i].querySelector("input");
|
||||
|
||||
if (isNaN(configValue) || configValue < 0) {
|
||||
numberInput.value = Config.defaults[option];
|
||||
numberInput.value = Config.syncDefaults[option];
|
||||
} else {
|
||||
numberInput.value = configValue;
|
||||
}
|
||||
@@ -220,10 +284,57 @@ async function init() {
|
||||
}
|
||||
}
|
||||
|
||||
optionsContainer.classList.remove("hidden");
|
||||
// Tab interaction
|
||||
const tabElements = document.getElementsByClassName("tab-heading");
|
||||
for (let i = 0; i < tabElements.length; i++) {
|
||||
const tabFor = tabElements[i].getAttribute("data-for");
|
||||
|
||||
if (tabElements[i].classList.contains("selected"))
|
||||
document.getElementById(tabFor).classList.remove("hidden");
|
||||
|
||||
tabElements[i].addEventListener("click", () => {
|
||||
if (!embed) location.hash = tabFor;
|
||||
|
||||
createStickyHeader();
|
||||
|
||||
document.querySelectorAll(".tab-heading").forEach(element => { element.classList.remove("selected"); });
|
||||
optionsContainer.querySelectorAll(".option-group").forEach(element => { element.classList.add("hidden"); });
|
||||
|
||||
tabElements[i].classList.add("selected");
|
||||
document.getElementById(tabFor).classList.remove("hidden");
|
||||
});
|
||||
}
|
||||
|
||||
window.addEventListener("scroll", () => createStickyHeader());
|
||||
|
||||
optionsContainer.classList.add("animated");
|
||||
}
|
||||
|
||||
function createStickyHeader() {
|
||||
const container = document.getElementById("options-container");
|
||||
const options = document.getElementById("options");
|
||||
|
||||
if (!embed && window.pageYOffset > 90 && (window.innerHeight <= 770 || window.innerWidth <= 1200)) {
|
||||
if (!container.classList.contains("sticky")) {
|
||||
options.style.marginTop = options.offsetTop.toString()+"px";
|
||||
container.classList.add("sticky");
|
||||
}
|
||||
} else {
|
||||
options.style.marginTop = "unset";
|
||||
container.classList.remove("sticky");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle special cases where an option shouldn't show
|
||||
*
|
||||
* @param {String} element
|
||||
*/
|
||||
async function shouldHideOption(element: Element): Promise<boolean> {
|
||||
return (element.getAttribute("data-private-only") === "true" && !(await isIncognitoAllowed()))
|
||||
|| (element.getAttribute("data-no-safari") === "true" && navigator.vendor === "Apple Computer, Inc.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the config is updated
|
||||
*
|
||||
@@ -234,7 +345,7 @@ function optionsConfigUpdateListener() {
|
||||
const optionsElements = optionsContainer.querySelectorAll("*");
|
||||
|
||||
for (let i = 0; i < optionsElements.length; i++) {
|
||||
switch (optionsElements[i].getAttribute("option-type")) {
|
||||
switch (optionsElements[i].getAttribute("data-type")) {
|
||||
case "display":
|
||||
updateDisplayElement(<HTMLElement> optionsElements[i])
|
||||
}
|
||||
@@ -247,15 +358,25 @@ function optionsConfigUpdateListener() {
|
||||
* @param element
|
||||
*/
|
||||
function updateDisplayElement(element: HTMLElement) {
|
||||
const displayOption = element.getAttribute("sync-option")
|
||||
const displayOption = element.getAttribute("data-sync")
|
||||
const displayText = Config.config[displayOption];
|
||||
element.innerText = displayText;
|
||||
|
||||
// See if anything extra must be run
|
||||
switch (displayOption) {
|
||||
case "invidiousInstances":
|
||||
case "invidiousInstances": {
|
||||
element.innerText = displayText.join(', ');
|
||||
let allEquals = displayText.length == invidiousList.length;
|
||||
for (let i = 0; i < invidiousList.length && allEquals; i++) {
|
||||
if (displayText[i] != invidiousList[i])
|
||||
allEquals = false;
|
||||
}
|
||||
if (!allEquals) {
|
||||
const resetButton = element.parentElement.querySelector(".invidious-instance-reset");
|
||||
resetButton.classList.remove("hidden");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,6 +391,8 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
|
||||
const button = element.querySelector(".trigger-button");
|
||||
|
||||
const setButton = element.querySelector(".text-change-set");
|
||||
const cancelButton = element.querySelector(".text-change-reset");
|
||||
const resetButton = element.querySelector(".invidious-instance-reset");
|
||||
setButton.addEventListener("click", async function() {
|
||||
if (textBox.value == "" || textBox.value.includes("/") || textBox.value.includes("http")) {
|
||||
alert(chrome.i18n.getMessage("addInvidiousInstanceError"));
|
||||
@@ -287,19 +410,26 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
|
||||
|
||||
invidiousOnClick(checkbox, "supportInvidious");
|
||||
|
||||
textBox.value = "";
|
||||
resetButton.classList.remove("hidden");
|
||||
|
||||
// Hide this section again
|
||||
textBox.value = "";
|
||||
element.querySelector(".option-hidden-section").classList.add("hidden");
|
||||
button.classList.remove("disabled");
|
||||
}
|
||||
});
|
||||
|
||||
const resetButton = element.querySelector(".invidious-instance-reset");
|
||||
cancelButton.addEventListener("click", async function() {
|
||||
textBox.value = "";
|
||||
element.querySelector(".option-hidden-section").classList.add("hidden");
|
||||
button.classList.remove("disabled");
|
||||
});
|
||||
|
||||
resetButton.addEventListener("click", function() {
|
||||
if (confirm(chrome.i18n.getMessage("resetInvidiousInstanceAlert"))) {
|
||||
// Set to CI populated list
|
||||
Config.config[option] = invidiousList;
|
||||
resetButton.classList.add("hidden");
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -351,91 +481,6 @@ async function invidiousOnClick(checkbox: HTMLInputElement, option: string): Pro
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Will trigger the container to ask the user for a keybind.
|
||||
*
|
||||
* @param element
|
||||
*/
|
||||
function activateKeybindChange(element: HTMLElement) {
|
||||
const button = element.querySelector(".trigger-button");
|
||||
if (button.classList.contains("disabled")) return;
|
||||
|
||||
button.classList.add("disabled");
|
||||
|
||||
const option = element.getAttribute("sync-option");
|
||||
|
||||
const currentlySet = Config.config[option] !== null ? chrome.i18n.getMessage("keybindCurrentlySet") : "";
|
||||
|
||||
const status = <HTMLElement> element.querySelector(".option-hidden-section > .keybind-status");
|
||||
status.innerText = chrome.i18n.getMessage("keybindDescription") + currentlySet;
|
||||
|
||||
if (Config.config[option] !== null) {
|
||||
const statusKey = <HTMLElement> element.querySelector(".option-hidden-section > .keybind-status-key");
|
||||
statusKey.innerText = Config.config[option];
|
||||
}
|
||||
|
||||
element.querySelector(".option-hidden-section").classList.remove("hidden");
|
||||
|
||||
document.addEventListener("keydown", (e) => keybindKeyPressed(element, e), {once: true});
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a key is pressed in an activiated keybind change option.
|
||||
*
|
||||
* @param element
|
||||
* @param e
|
||||
*/
|
||||
function keybindKeyPressed(element: HTMLElement, e: KeyboardEvent) {
|
||||
const key = e.key;
|
||||
|
||||
if (["Shift", "Control", "Meta", "Alt", "ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", "Tab"].indexOf(key) !== -1) {
|
||||
|
||||
// Wait for more
|
||||
document.addEventListener("keydown", (e) => keybindKeyPressed(element, e), {once: true});
|
||||
} else {
|
||||
const button: HTMLElement = element.querySelector(".trigger-button");
|
||||
const option = element.getAttribute("sync-option");
|
||||
|
||||
// Make sure keybind isn't used by the other listener
|
||||
// TODO: If other keybindings are going to be added, we need a better way to find the other keys used.
|
||||
const otherKeybind = (option === "startSponsorKeybind") ? Config.config['submitKeybind'] : Config.config['startSponsorKeybind'];
|
||||
if (key === otherKeybind) {
|
||||
closeKeybindOption(element, button);
|
||||
|
||||
alert(chrome.i18n.getMessage("theKey") + " " + key + " " + chrome.i18n.getMessage("keyAlreadyUsed"));
|
||||
return;
|
||||
}
|
||||
|
||||
// cancel setting a keybind
|
||||
if (key === "Escape") {
|
||||
closeKeybindOption(element, button);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
Config.config[option] = key;
|
||||
|
||||
const status = <HTMLElement> element.querySelector(".option-hidden-section > .keybind-status");
|
||||
status.innerText = chrome.i18n.getMessage("keybindDescriptionComplete");
|
||||
|
||||
const statusKey = <HTMLElement> element.querySelector(".option-hidden-section > .keybind-status-key");
|
||||
statusKey.innerText = key;
|
||||
|
||||
button.classList.remove("disabled");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the menu for editing the keybind
|
||||
*
|
||||
* @param element
|
||||
* @param button
|
||||
*/
|
||||
function closeKeybindOption(element: HTMLElement, button: HTMLElement) {
|
||||
element.querySelector(".option-hidden-section").classList.add("hidden");
|
||||
button.classList.remove("disabled");
|
||||
}
|
||||
|
||||
/**
|
||||
* Will trigger the textbox to appear to be able to change an option's text.
|
||||
*
|
||||
@@ -448,7 +493,7 @@ function activatePrivateTextChange(element: HTMLElement) {
|
||||
button.classList.add("disabled");
|
||||
|
||||
const textBox = <HTMLInputElement> element.querySelector(".option-text-box");
|
||||
const option = element.getAttribute("sync-option");
|
||||
const option = element.getAttribute("data-sync");
|
||||
|
||||
// See if anything extra must be done
|
||||
switch (option) {
|
||||
@@ -458,16 +503,10 @@ function activatePrivateTextChange(element: HTMLElement) {
|
||||
}
|
||||
|
||||
let result = Config.config[option];
|
||||
|
||||
// See if anything extra must be done
|
||||
switch (option) {
|
||||
case "*": {
|
||||
const jsonData = JSON.parse(JSON.stringify(Config.localConfig));
|
||||
|
||||
// Fix segmentTimes data as it is destroyed from the JSON stringify
|
||||
jsonData.segmentTimes = Config.encodeStoredItem(Config.localConfig.segmentTimes);
|
||||
|
||||
result = JSON.stringify(jsonData);
|
||||
result = JSON.stringify(Config.cachedSyncConfig);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -476,38 +515,7 @@ function activatePrivateTextChange(element: HTMLElement) {
|
||||
|
||||
const setButton = element.querySelector(".text-change-set");
|
||||
setButton.addEventListener("click", async () => {
|
||||
const confirmMessage = element.getAttribute("confirm-message");
|
||||
|
||||
if (confirmMessage === null || confirm(chrome.i18n.getMessage(confirmMessage))) {
|
||||
|
||||
// See if anything extra must be done
|
||||
switch (option) {
|
||||
case "*":
|
||||
try {
|
||||
const newConfig = JSON.parse(textBox.value);
|
||||
for (const key in newConfig) {
|
||||
Config.config[key] = newConfig[key];
|
||||
}
|
||||
Config.convertJSON();
|
||||
|
||||
if (newConfig.supportInvidious) {
|
||||
const checkbox = <HTMLInputElement> document.querySelector("#support-invidious > label > label > input");
|
||||
|
||||
checkbox.checked = true;
|
||||
await invidiousOnClick(checkbox, "supportInvidious");
|
||||
}
|
||||
|
||||
window.location.reload();
|
||||
|
||||
} catch (e) {
|
||||
alert(chrome.i18n.getMessage("incorrectlyFormattedOptions"));
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
Config.config[option] = textBox.value;
|
||||
}
|
||||
}
|
||||
setTextOption(option, element, textBox.value);
|
||||
});
|
||||
|
||||
// See if anything extra must be done
|
||||
@@ -531,6 +539,75 @@ function activatePrivateTextChange(element: HTMLElement) {
|
||||
element.querySelector(".option-hidden-section").classList.remove("hidden");
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to run when a textbox change is submitted
|
||||
*
|
||||
* @param option data-sync value
|
||||
* @param element main container div
|
||||
* @param value new text
|
||||
* @param callbackOnError function to run if confirmMessage was denied
|
||||
*/
|
||||
async function setTextOption(option: string, element: HTMLElement, value: string, callbackOnError?: () => void) {
|
||||
const confirmMessage = element.getAttribute("data-confirm-message");
|
||||
|
||||
if (confirmMessage === null || confirm(chrome.i18n.getMessage(confirmMessage))) {
|
||||
|
||||
// See if anything extra must be done
|
||||
switch (option) {
|
||||
case "*":
|
||||
try {
|
||||
const newConfig = JSON.parse(value);
|
||||
for (const key in newConfig) {
|
||||
Config.config[key] = newConfig[key];
|
||||
}
|
||||
|
||||
if (newConfig.supportInvidious) {
|
||||
const checkbox = <HTMLInputElement> document.querySelector("#support-invidious > div > label > input");
|
||||
|
||||
checkbox.checked = true;
|
||||
await invidiousOnClick(checkbox, "supportInvidious");
|
||||
}
|
||||
|
||||
window.location.reload();
|
||||
|
||||
} catch (e) {
|
||||
alert(chrome.i18n.getMessage("incorrectlyFormattedOptions"));
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
Config.config[option] = value;
|
||||
}
|
||||
} else {
|
||||
if (typeof callbackOnError == "function")
|
||||
callbackOnError();
|
||||
}
|
||||
}
|
||||
|
||||
function downloadConfig() {
|
||||
const file = document.createElement("a");
|
||||
const jsonData = JSON.parse(JSON.stringify(Config.cachedSyncConfig));
|
||||
file.setAttribute("href", "data:text/json;charset=utf-8," + encodeURIComponent(JSON.stringify(jsonData)));
|
||||
file.setAttribute("download", "SponsorBlockConfig.json");
|
||||
document.body.append(file);
|
||||
file.click();
|
||||
file.remove();
|
||||
}
|
||||
|
||||
function uploadConfig(e) {
|
||||
if (e.target.files.length == 1) {
|
||||
const file = e.target.files[0];
|
||||
const reader = new FileReader();
|
||||
const element = document.querySelector("[data-sync='*']") as HTMLElement;
|
||||
reader.onload = function(ev) {
|
||||
setTextOption("*", element, ev.target.result as string, () => {
|
||||
e.target.value = null;
|
||||
});
|
||||
};
|
||||
reader.readAsText(file);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates the value used for the database server address.
|
||||
* Returns null and alerts the user if there is an issue.
|
||||
@@ -563,12 +640,9 @@ function copyDebugOutputToClipboard() {
|
||||
language: navigator.language,
|
||||
extensionVersion: chrome.runtime.getManifest().version
|
||||
},
|
||||
config: JSON.parse(JSON.stringify(Config.localConfig)) // Deep clone config object
|
||||
config: JSON.parse(JSON.stringify(Config.cachedSyncConfig)) // Deep clone config object
|
||||
};
|
||||
|
||||
// Fix segmentTimes data as it is destroyed from the JSON stringify
|
||||
output.config.segmentTimes = Config.encodeStoredItem(Config.localConfig.segmentTimes);
|
||||
|
||||
// Sanitise sensitive user config values
|
||||
delete output.config.userID;
|
||||
output.config.serverAddress = (output.config.serverAddress === CompileConfig.serverAddress)
|
||||
|
||||
124
src/popup.ts
124
src/popup.ts
@@ -1,10 +1,9 @@
|
||||
import Config from "./config";
|
||||
|
||||
import Utils from "./utils";
|
||||
import { SponsorTime, SponsorHideType, CategoryActionType, ActionType } from "./types";
|
||||
import { SponsorTime, SponsorHideType, ActionType } from "./types";
|
||||
import { Message, MessageResponse, IsInfoFoundMessageResponse } from "./messageTypes";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
import { getCategoryActionType } from "./utils/categoryUtils";
|
||||
import { AnimationUtils } from "./utils/animationUtils";
|
||||
import { GenericUtils } from "./utils/genericUtils";
|
||||
const utils = new Utils();
|
||||
@@ -109,13 +108,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//"downloadedSponsorMessageTimes",
|
||||
"refreshSegmentsButton",
|
||||
"whitelistButton",
|
||||
"sbDonate"
|
||||
"sbDonate",
|
||||
"sponsorTimesDonateContainer",
|
||||
"sbConsiderDonateLink",
|
||||
"sbCloseDonate"
|
||||
].forEach(id => PageElements[id] = document.getElementById(id));
|
||||
|
||||
// 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);
|
||||
|
||||
//setup click listeners
|
||||
PageElements.sponsorStart.addEventListener("click", sendSponsorStartMessage);
|
||||
@@ -126,7 +129,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
unwhitelistChannel();
|
||||
}
|
||||
});
|
||||
PageElements.whitelistForceCheck.addEventListener("click", openOptions);
|
||||
PageElements.whitelistForceCheck.addEventListener("click", () => {openOptionsAt("behavior")});
|
||||
PageElements.toggleSwitch.addEventListener("change", function () {
|
||||
toggleSkipping(!this.checked);
|
||||
});
|
||||
@@ -193,6 +196,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
PageElements.sponsorTimesViewsDisplay.innerText = viewCount.toLocaleString();
|
||||
PageElements.sponsorTimesViewsContainer.style.display = "unset";
|
||||
}
|
||||
|
||||
showDonateWidget(viewCount);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -242,6 +247,23 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
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) {
|
||||
PageElements.sponsorTimesDonateContainer.style.display = "flex";
|
||||
PageElements.sbConsiderDonateLink.addEventListener("click", () => {
|
||||
Config.config.donateClicked = Config.config.donateClicked + 1;
|
||||
});
|
||||
|
||||
PageElements.sbCloseDonate.addEventListener("click", () => {
|
||||
PageElements.sponsorTimesDonateContainer.style.display = "none";
|
||||
Config.config.showPopupDonationCount = 100;
|
||||
});
|
||||
|
||||
Config.config.showPopupDonationCount = Config.config.showPopupDonationCount + 1;
|
||||
}
|
||||
}
|
||||
|
||||
function onTabs(tabs, updating: boolean): void {
|
||||
messageHandler.sendMessage(tabs[0].id, { message: 'getVideoID' }, function (result) {
|
||||
if (result !== undefined && result.videoID) {
|
||||
@@ -263,7 +285,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
return;
|
||||
}
|
||||
|
||||
sponsorTimes = Config.config.segmentTimes.get(currentVideoID) ?? [];
|
||||
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] ?? [];
|
||||
updateSegmentEditingUI();
|
||||
|
||||
messageHandler.sendMessage(
|
||||
@@ -338,8 +360,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
// Perform a second update after the config changes take effect as a workaround for a race condition
|
||||
const removeListener = (listener: typeof lateUpdate) => {
|
||||
const index = Config.configListeners.indexOf(listener);
|
||||
if (index !== -1) Config.configListeners.splice(index, 1);
|
||||
const index = Config.configSyncListeners.indexOf(listener);
|
||||
if (index !== -1) Config.configSyncListeners.splice(index, 1);
|
||||
};
|
||||
|
||||
const lateUpdate = () => {
|
||||
@@ -347,7 +369,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
removeListener(lateUpdate);
|
||||
};
|
||||
|
||||
Config.configListeners.push(lateUpdate);
|
||||
Config.configSyncListeners.push(lateUpdate);
|
||||
|
||||
// Remove the listener after 200ms in case the changes were propagated by the time we got the response
|
||||
setTimeout(() => removeListener(lateUpdate), 200);
|
||||
@@ -361,7 +383,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
|
||||
// Only update the segments after a segment was created
|
||||
if (!creatingSegment) {
|
||||
sponsorTimes = Config.config.segmentTimes.get(currentVideoID) || [];
|
||||
sponsorTimes = Config.config.unsubmittedSegments[currentVideoID] || [];
|
||||
}
|
||||
|
||||
// Update the UI
|
||||
@@ -403,6 +425,8 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
} else if (segmentTimes[i].hidden === SponsorHideType.MinimumDuration) {
|
||||
//this one is too short
|
||||
extraInfo = " (" + chrome.i18n.getMessage("hiddenDueToDuration") + ")";
|
||||
} else if (segmentTimes[i].hidden === SponsorHideType.Hidden) {
|
||||
extraInfo = " (" + chrome.i18n.getMessage("manuallyHidden") + ")";
|
||||
}
|
||||
|
||||
const textNode = document.createTextNode(utils.shortCategoryName(segmentTimes[i].category) + extraInfo);
|
||||
@@ -411,7 +435,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
segmentTimeFromToNode.innerText = chrome.i18n.getMessage("full");
|
||||
} else {
|
||||
segmentTimeFromToNode.innerText = utils.getFormattedTime(segmentTimes[i].segment[0], true) +
|
||||
(getCategoryActionType(segmentTimes[i].category) !== CategoryActionType.POI
|
||||
(segmentTimes[i].actionType !== ActionType.Poi
|
||||
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segmentTimes[i].segment[1], true)
|
||||
: "");
|
||||
}
|
||||
@@ -443,8 +467,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
downvoteButton.src = locked && isVip ? chrome.runtime.getURL("icons/thumbs_down_locked.svg") : chrome.runtime.getURL("icons/thumbs_down.svg");
|
||||
downvoteButton.addEventListener("click", () => vote(0, UUID));
|
||||
|
||||
//uuid button
|
||||
|
||||
const uuidButton = document.createElement("img");
|
||||
uuidButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
|
||||
uuidButton.className = "voteButton";
|
||||
@@ -455,10 +477,49 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
stopAnimation();
|
||||
});
|
||||
|
||||
const hideButton = document.createElement("img");
|
||||
hideButton.id = "sponsorTimesCopyUUIDButtonContainer" + UUID;
|
||||
hideButton.className = "voteButton";
|
||||
if (segmentTimes[i].hidden === SponsorHideType.Hidden) {
|
||||
hideButton.src = chrome.runtime.getURL("icons/not_visible.svg");
|
||||
} else {
|
||||
hideButton.src = chrome.runtime.getURL("icons/visible.svg");
|
||||
}
|
||||
hideButton.addEventListener("click", () => {
|
||||
const stopAnimation = AnimationUtils.applyLoadingAnimation(hideButton, 0.4);
|
||||
stopAnimation();
|
||||
|
||||
if (segmentTimes[i].hidden === SponsorHideType.Hidden) {
|
||||
hideButton.src = chrome.runtime.getURL("icons/visible.svg");
|
||||
segmentTimes[i].hidden = SponsorHideType.Visible;
|
||||
} else {
|
||||
hideButton.src = chrome.runtime.getURL("icons/not_visible.svg");
|
||||
segmentTimes[i].hidden = SponsorHideType.Hidden;
|
||||
}
|
||||
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{
|
||||
message: "hideSegment",
|
||||
type: segmentTimes[i].hidden,
|
||||
UUID: UUID
|
||||
}
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
//add thumbs up, thumbs down and uuid copy buttons to the container
|
||||
voteButtonsContainer.appendChild(upvoteButton);
|
||||
voteButtonsContainer.appendChild(downvoteButton);
|
||||
voteButtonsContainer.appendChild(uuidButton);
|
||||
if (segmentTimes[i].actionType === ActionType.Skip
|
||||
&& [SponsorHideType.Visible, SponsorHideType.Hidden].includes(segmentTimes[i].hidden)) {
|
||||
voteButtonsContainer.appendChild(hideButton);
|
||||
}
|
||||
|
||||
//add click listener to open up vote panel
|
||||
sponsorTimeButton.addEventListener("click", function () {
|
||||
@@ -517,6 +578,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
chrome.runtime.sendMessage({ "message": "openConfig" });
|
||||
}
|
||||
|
||||
function openOptionsAt(location) {
|
||||
chrome.runtime.sendMessage({ "message": "openConfig", "hash": location });
|
||||
}
|
||||
|
||||
function openHelp() {
|
||||
chrome.runtime.sendMessage({ "message": "openHelp" });
|
||||
}
|
||||
@@ -586,21 +651,28 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
//add loading info
|
||||
addVoteMessage(chrome.i18n.getMessage("Loading"), UUID);
|
||||
|
||||
//send the vote message to the tab
|
||||
chrome.runtime.sendMessage({
|
||||
message: "submitVote",
|
||||
type: type,
|
||||
UUID: UUID
|
||||
}, function (response) {
|
||||
if (response != undefined) {
|
||||
//see if it was a success or failure
|
||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||
//success (treat rate limits as a success)
|
||||
addVoteMessage(chrome.i18n.getMessage("voted"), UUID);
|
||||
} else if (response.successType == -1) {
|
||||
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
|
||||
messageHandler.query({
|
||||
active: true,
|
||||
currentWindow: true
|
||||
}, tabs => {
|
||||
messageHandler.sendMessage(
|
||||
tabs[0].id,
|
||||
{
|
||||
message: "submitVote",
|
||||
type: type,
|
||||
UUID: UUID
|
||||
}, function (response) {
|
||||
if (response != undefined) {
|
||||
//see if it was a success or failure
|
||||
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
|
||||
//success (treat rate limits as a success)
|
||||
addVoteMessage(chrome.i18n.getMessage("voted"), UUID);
|
||||
} else if (response.successType == -1) {
|
||||
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,9 @@ export interface TooltipProps {
|
||||
bottomOffset?: string
|
||||
timeout?: number;
|
||||
opacity?: number;
|
||||
displayTriangle?: boolean;
|
||||
showLogo?: boolean;
|
||||
showGotIt?: boolean;
|
||||
}
|
||||
|
||||
export class Tooltip {
|
||||
@@ -20,6 +23,9 @@ export class Tooltip {
|
||||
constructor(props: TooltipProps) {
|
||||
props.bottomOffset ??= "70px";
|
||||
props.opacity ??= 0.7;
|
||||
props.displayTriangle ??= true;
|
||||
props.showLogo ??= true;
|
||||
props.showGotIt ??= true;
|
||||
this.text = props.text;
|
||||
|
||||
this.container = document.createElement('div');
|
||||
@@ -40,11 +46,13 @@ export class Tooltip {
|
||||
|
||||
ReactDOM.render(
|
||||
<div style={{bottom: props.bottomOffset, backgroundColor}}
|
||||
className="sponsorBlockTooltip" >
|
||||
className={"sponsorBlockTooltip" + (props.displayTriangle ? " sbTriangle" : "")} >
|
||||
<div>
|
||||
<img className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
</img>
|
||||
{props.showLogo ?
|
||||
<img className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
</img>
|
||||
: null}
|
||||
<span className="sponsorSkipObject">
|
||||
{this.text + (props.link ? ". " : "")}
|
||||
{props.link ?
|
||||
@@ -53,16 +61,18 @@ export class Tooltip {
|
||||
rel="noopener noreferrer"
|
||||
href={props.link}>
|
||||
{chrome.i18n.getMessage("LearnMore")}
|
||||
</a>
|
||||
</a>
|
||||
: null}
|
||||
</span>
|
||||
</div>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style ={{float: "right" }}
|
||||
onClick={() => this.close()}>
|
||||
{props.showGotIt ?
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style ={{float: "right" }}
|
||||
onClick={() => this.close()}>
|
||||
|
||||
{chrome.i18n.getMessage("GotIt")}
|
||||
</button>
|
||||
{chrome.i18n.getMessage("GotIt")}
|
||||
</button>
|
||||
: null}
|
||||
</div>,
|
||||
this.container
|
||||
)
|
||||
|
||||
21
src/types.ts
21
src/types.ts
@@ -31,6 +31,8 @@ export interface FetchResponse {
|
||||
ok: boolean
|
||||
}
|
||||
|
||||
export type HashedValue = string & { __hashBrand: unknown };
|
||||
|
||||
export interface VideoDurationResponse {
|
||||
duration: number;
|
||||
}
|
||||
@@ -49,18 +51,15 @@ export interface CategorySelection {
|
||||
export enum SponsorHideType {
|
||||
Visible = undefined,
|
||||
Downvoted = 1,
|
||||
MinimumDuration
|
||||
}
|
||||
|
||||
export enum CategoryActionType {
|
||||
Skippable = "", // Strings are used to find proper language configs
|
||||
POI = "_POI"
|
||||
MinimumDuration,
|
||||
Hidden,
|
||||
}
|
||||
|
||||
export enum ActionType {
|
||||
Skip = "skip",
|
||||
Mute = "mute",
|
||||
Full = "full"
|
||||
Full = "full",
|
||||
Poi = "poi"
|
||||
}
|
||||
|
||||
export const ActionTypes = [ActionType.Skip, ActionType.Mute];
|
||||
@@ -223,4 +222,12 @@ export enum NoticeVisbilityMode {
|
||||
MiniForAll = 2,
|
||||
FadedForAutoSkip = 3,
|
||||
FadedForAll = 4
|
||||
}
|
||||
|
||||
export type Keybind = {
|
||||
key: string,
|
||||
code?: string,
|
||||
ctrl?: boolean,
|
||||
alt?: boolean,
|
||||
shift?: boolean
|
||||
}
|
||||
98
src/utils.ts
98
src/utils.ts
@@ -1,5 +1,5 @@
|
||||
import Config from "./config";
|
||||
import { CategorySelection, SponsorTime, FetchResponse, BackgroundScriptContainer, Registration } from "./types";
|
||||
import Config, { VideoDownvotes } from "./config";
|
||||
import { CategorySelection, SponsorTime, FetchResponse, BackgroundScriptContainer, Registration, HashedValue, VideoID, SponsorHideType } from "./types";
|
||||
|
||||
import * as CompileConfig from "../config.json";
|
||||
import { findValidElementFromSelector } from "./utils/pageUtils";
|
||||
@@ -21,6 +21,10 @@ export default class Utils {
|
||||
"popup.css"
|
||||
];
|
||||
|
||||
/* Used for waitForElement */
|
||||
waitingMutationObserver:MutationObserver = null;
|
||||
waitingElements: { selector: string, callback: (element: Element) => void }[] = [];
|
||||
|
||||
constructor(backgroundScriptContainer: BackgroundScriptContainer = null) {
|
||||
this.backgroundScriptContainer = backgroundScriptContainer;
|
||||
}
|
||||
@@ -29,6 +33,41 @@ export default class Utils {
|
||||
return GenericUtils.wait(condition, timeout, check);
|
||||
}
|
||||
|
||||
/* Uses a mutation observer to wait asynchronously */
|
||||
async waitForElement(selector: string): Promise<Element> {
|
||||
return await new Promise((resolve) => {
|
||||
this.waitingElements.push({
|
||||
selector,
|
||||
callback: resolve
|
||||
});
|
||||
|
||||
if (!this.waitingMutationObserver) {
|
||||
this.waitingMutationObserver = new MutationObserver(() => {
|
||||
const foundSelectors = [];
|
||||
for (const { selector, callback } of this.waitingElements) {
|
||||
const element = document.querySelector(selector);
|
||||
if (element) {
|
||||
callback(element);
|
||||
foundSelectors.push(selector);
|
||||
}
|
||||
}
|
||||
|
||||
this.waitingElements = this.waitingElements.filter((element) => !foundSelectors.includes(element.selector));
|
||||
|
||||
if (this.waitingElements.length === 0) {
|
||||
this.waitingMutationObserver.disconnect();
|
||||
this.waitingMutationObserver = null;
|
||||
}
|
||||
});
|
||||
|
||||
this.waitingMutationObserver.observe(document.body, {
|
||||
childList: true,
|
||||
subtree: true
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
containsPermission(permissions: chrome.permissions.Permissions): Promise<boolean> {
|
||||
return new Promise((resolve) => {
|
||||
chrome.permissions.contains(permissions, resolve)
|
||||
@@ -219,6 +258,8 @@ 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];
|
||||
@@ -331,9 +372,9 @@ export default class Utils {
|
||||
|
||||
findReferenceNode(): HTMLElement {
|
||||
const selectors = [
|
||||
"#player-container-id",
|
||||
"#movie_player",
|
||||
"#c4-player", // Channel Trailer
|
||||
"#player-container", // Preview on hover
|
||||
"#main-panel.ytmusic-player-page", // YouTube music
|
||||
"#player-container .video-js", // Invidious
|
||||
".main-video-section > .video-container" // Cloudtube
|
||||
@@ -347,7 +388,7 @@ export default class Utils {
|
||||
let index = 1;
|
||||
|
||||
//find the child that is the video player (sometimes it is not the first)
|
||||
while (index < player.children.length && (!referenceNode.classList.contains("html5-video-player") || !referenceNode.classList.contains("ytp-embed"))) {
|
||||
while (index < player.children.length && (!referenceNode.classList?.contains("html5-video-player") || !referenceNode.classList?.contains("ytp-embed"))) {
|
||||
referenceNode = player.children[index] as HTMLElement;
|
||||
|
||||
index++;
|
||||
@@ -434,10 +475,10 @@ export default class Utils {
|
||||
return typeof(browser) !== "undefined";
|
||||
}
|
||||
|
||||
async getHash(value: string, times = 5000): Promise<string> {
|
||||
if (times <= 0) return "";
|
||||
async getHash<T extends string>(value: T, times = 5000): Promise<T & HashedValue> {
|
||||
if (times <= 0) return "" as T & HashedValue;
|
||||
|
||||
let hashHex = value;
|
||||
let hashHex: string = value;
|
||||
for (let i = 0; i < times; i++) {
|
||||
const hashBuffer = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(hashHex).buffer);
|
||||
|
||||
@@ -445,6 +486,47 @@ export default class Utils {
|
||||
hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
||||
}
|
||||
|
||||
return hashHex;
|
||||
return hashHex as T & HashedValue;
|
||||
}
|
||||
|
||||
async addHiddenSegment(videoID: VideoID, segmentUUID: string, hidden: SponsorHideType) {
|
||||
if (chrome.extension.inIncognitoContext || !Config.config.trackDownvotes) return;
|
||||
|
||||
const hashedVideoID = (await this.getHash(videoID, 1)).slice(0, 4) as VideoID & HashedValue;
|
||||
const UUIDHash = await this.getHash(segmentUUID, 1);
|
||||
|
||||
const allDownvotes = Config.local.downvotedSegments;
|
||||
const currentVideoData = allDownvotes[hashedVideoID] || { segments: [], lastAccess: 0 };
|
||||
|
||||
currentVideoData.lastAccess = Date.now();
|
||||
const existingData = currentVideoData.segments.find((segment) => segment.uuid === UUIDHash);
|
||||
if (hidden === SponsorHideType.Visible) {
|
||||
delete allDownvotes[hashedVideoID];
|
||||
} else {
|
||||
if (existingData) {
|
||||
existingData.hidden = hidden;
|
||||
} else {
|
||||
currentVideoData.segments.push({
|
||||
uuid: UUIDHash,
|
||||
hidden
|
||||
});
|
||||
}
|
||||
|
||||
allDownvotes[hashedVideoID] = currentVideoData;
|
||||
}
|
||||
|
||||
const entries = Object.entries(allDownvotes);
|
||||
if (entries.length > 10000) {
|
||||
let min: [string, VideoDownvotes] = null;
|
||||
for (let i = 0; i < entries[0].length; i++) {
|
||||
if (min === null || entries[i][1].lastAccess < min[1].lastAccess) {
|
||||
min = entries[i];
|
||||
}
|
||||
}
|
||||
|
||||
delete allDownvotes[min[0]];
|
||||
}
|
||||
|
||||
Config.forceLocalUpdate("downvotedSegments");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,51 +1,41 @@
|
||||
import { ActionType, Category, CategoryActionType, SponsorTime } from "../types";
|
||||
import { ActionType, Category, SponsorTime } from "../types";
|
||||
|
||||
export function getSkippingText(segments: SponsorTime[], autoSkip: boolean): string {
|
||||
const categoryName = chrome.i18n.getMessage(segments.length > 1 ? "multipleSegments"
|
||||
: "category_" + segments[0].category + "_short") || chrome.i18n.getMessage("category_" + segments[0].category);
|
||||
if (autoSkip) {
|
||||
let messageId = "";
|
||||
if (getCategoryActionType(segments[0].category) === CategoryActionType.Skippable) {
|
||||
switch (segments[0].actionType) {
|
||||
case ActionType.Skip:
|
||||
messageId = "skipped";
|
||||
break;
|
||||
case ActionType.Mute:
|
||||
messageId = "muted";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
messageId = "skipped_to_category";
|
||||
switch (segments[0].actionType) {
|
||||
case ActionType.Skip:
|
||||
messageId = "skipped";
|
||||
break;
|
||||
case ActionType.Mute:
|
||||
messageId = "muted";
|
||||
break;
|
||||
case ActionType.Poi:
|
||||
messageId = "skipped_to_category";
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return chrome.i18n.getMessage(messageId).replace("{0}", categoryName);
|
||||
} else {
|
||||
let messageId = "";
|
||||
if (getCategoryActionType(segments[0].category) === CategoryActionType.Skippable) {
|
||||
switch (segments[0].actionType) {
|
||||
case ActionType.Skip:
|
||||
messageId = "skip_category";
|
||||
break;
|
||||
case ActionType.Mute:
|
||||
messageId = "mute_category";
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
messageId = "skip_to_category";
|
||||
switch (segments[0].actionType) {
|
||||
case ActionType.Skip:
|
||||
messageId = "skip_category";
|
||||
break;
|
||||
case ActionType.Mute:
|
||||
messageId = "mute_category";
|
||||
break;
|
||||
case ActionType.Poi:
|
||||
messageId = "skip_to_category";
|
||||
break;
|
||||
}
|
||||
|
||||
return chrome.i18n.getMessage(messageId).replace("{0}", categoryName);
|
||||
}
|
||||
}
|
||||
|
||||
export function getCategoryActionType(category: Category): CategoryActionType {
|
||||
if (category.startsWith("poi_")) {
|
||||
return CategoryActionType.POI;
|
||||
} else {
|
||||
return CategoryActionType.Skippable;
|
||||
}
|
||||
}
|
||||
|
||||
export function getCategorySuffix(category: Category): string {
|
||||
if (category.startsWith("poi_")) {
|
||||
return "_POI";
|
||||
|
||||
@@ -1,5 +1,48 @@
|
||||
import Config from "../config";
|
||||
import { Keybind } from "../types";
|
||||
|
||||
export function showDonationLink(): boolean {
|
||||
return navigator.vendor !== "Apple Computer, Inc." && Config.config.showDonationLink;
|
||||
}
|
||||
|
||||
export function isSafari(): boolean {
|
||||
return navigator.vendor === "Apple Computer, Inc.";
|
||||
}
|
||||
|
||||
export function keybindEquals(first: Keybind, second: Keybind): boolean {
|
||||
if (first == null || second == null ||
|
||||
Boolean(first.alt) != Boolean(second.alt) || Boolean(first.ctrl) != Boolean(second.ctrl) || Boolean(first.shift) != Boolean(second.shift) ||
|
||||
first.key == null && first.code == null || second.key == null && second.code == null)
|
||||
return false;
|
||||
if (first.code != null && second.code != null)
|
||||
return first.code === second.code;
|
||||
if (first.key != null && second.key != null)
|
||||
return first.key.toUpperCase() === second.key.toUpperCase();
|
||||
return false;
|
||||
}
|
||||
|
||||
export function formatKey(key: string): string {
|
||||
if (key == null)
|
||||
return "";
|
||||
else if (key == " ")
|
||||
return "Space";
|
||||
else if (key.length == 1)
|
||||
return key.toUpperCase();
|
||||
else
|
||||
return key;
|
||||
}
|
||||
|
||||
export function keybindToString(keybind: Keybind): string {
|
||||
if (keybind == null || keybind.key == null)
|
||||
return "";
|
||||
|
||||
let ret = "";
|
||||
if (keybind.ctrl)
|
||||
ret += "Ctrl+";
|
||||
if (keybind.alt)
|
||||
ret += "Alt+";
|
||||
if (keybind.shift)
|
||||
ret += "Shift+";
|
||||
|
||||
return ret += formatKey(keybind.key);
|
||||
}
|
||||
@@ -44,7 +44,30 @@ function getErrorMessage(statusCode: number, responseText: string): string {
|
||||
return errorMessage + postFix;
|
||||
}
|
||||
|
||||
/* Gets percieved luminance of a color */
|
||||
function getLuminance(color: string): number {
|
||||
const {r, g, b} = hexToRgb(color);
|
||||
return Math.sqrt(0.299 * (r * r) + 0.587 * (g * g) + 0.114 * (b * b));
|
||||
}
|
||||
|
||||
/* From https://stackoverflow.com/a/5624139 */
|
||||
function hexToRgb(hex: string): {r: number, g: number, b: number} {
|
||||
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
|
||||
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
|
||||
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
|
||||
return r + r + g + g + b + b;
|
||||
});
|
||||
|
||||
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
||||
return result ? {
|
||||
r: parseInt(result[1], 16),
|
||||
g: parseInt(result[2], 16),
|
||||
b: parseInt(result[3], 16)
|
||||
} : null;
|
||||
}
|
||||
|
||||
export const GenericUtils = {
|
||||
wait,
|
||||
getErrorMessage
|
||||
getErrorMessage,
|
||||
getLuminance
|
||||
}
|
||||
@@ -43,7 +43,7 @@ function findValidElementFromGenerator<T>(objects: T[] | NodeListOf<HTMLElement>
|
||||
}
|
||||
|
||||
export function getHashParams(): Record<string, unknown> {
|
||||
const windowHash = window.location.hash.substr(1);
|
||||
const windowHash = window.location.hash.slice(1);
|
||||
if (windowHash) {
|
||||
const params: Record<string, unknown> = windowHash.split('&').reduce((acc, param) => {
|
||||
const [key, value] = param.split('=');
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/* 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');
|
||||
@@ -32,7 +34,6 @@ module.exports = env => ({
|
||||
},
|
||||
output: {
|
||||
path: path.join(__dirname, '../dist/js'),
|
||||
filename: '[name].js'
|
||||
},
|
||||
optimization: {
|
||||
splitChunks: {
|
||||
@@ -84,12 +85,12 @@ module.exports = env => ({
|
||||
if (env.browser.toLowerCase() === "safari") {
|
||||
parsed.fullName.message = parsed.fullName.message.match(/^.+(?= -)/)?.[0] || parsed.fullName.message;
|
||||
if (parsed.fullName.message.length > 50) {
|
||||
parsed.fullName.message = parsed.fullName.message.substr(0, 47) + "...";
|
||||
parsed.fullName.message = parsed.fullName.message.slice(0, 47) + "...";
|
||||
}
|
||||
|
||||
parsed.Description.message = parsed.Description.message.match(/^.+(?=\. )/)?.[0] || parsed.Description.message;
|
||||
if (parsed.Description.message.length > 80) {
|
||||
parsed.Description.message = parsed.Description.message.substr(0, 77) + "...";
|
||||
parsed.Description.message = parsed.Description.message.slice(0, 77) + "...";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const merge = require('webpack-merge');
|
||||
const common = require('./webpack.common.js');
|
||||
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
/* 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 validateOptions = require('schema-utils');
|
||||
const { validate } = require('schema-utils');
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
@@ -30,12 +31,12 @@ const schema = {
|
||||
|
||||
class BuildManifest {
|
||||
constructor (options = {}) {
|
||||
validateOptions(schema, options, "Build Manifest Plugin");
|
||||
validate(schema, options, "Build Manifest Plugin");
|
||||
|
||||
this.options = options;
|
||||
}
|
||||
|
||||
apply(compiler) {
|
||||
apply() {
|
||||
const distFolder = path.resolve(__dirname, "../dist/");
|
||||
const distManifestFile = path.resolve(distFolder, "manifest.json");
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
||||
const merge = require('webpack-merge');
|
||||
const common = require('./webpack.common.js');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user