mirror of
https://github.com/ajayyy/SponsorBlock.git
synced 2025-12-06 11:37:02 +03:00
Compare commits
168 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b758cbb25f | ||
|
|
f2be7a9c5b | ||
|
|
8763d173bd | ||
|
|
07e3117e22 | ||
|
|
12bc10ea1f | ||
|
|
2db1971190 | ||
|
|
c3107ffcff | ||
|
|
4bca8ad2f7 | ||
|
|
e729e036cf | ||
|
|
7b74307013 | ||
|
|
6aa1665d7c | ||
|
|
a1bae95cdc | ||
|
|
c5b72a01a2 | ||
|
|
8ade66d7b3 | ||
|
|
d42862541b | ||
|
|
54001763a7 | ||
|
|
7186829bc3 | ||
|
|
3d3b261f8f | ||
|
|
33094f2541 | ||
|
|
9f9df9479b | ||
|
|
1c911581db | ||
|
|
071f8b1729 | ||
|
|
8d1b35403d | ||
|
|
a8fee918e4 | ||
|
|
7bca8e508e | ||
|
|
e16aae393f | ||
|
|
44de741e84 | ||
|
|
bc990cd683 | ||
|
|
33098ac659 | ||
|
|
2f8ec7a5e5 | ||
|
|
48f7c1e0a1 | ||
|
|
29c3b80d0b | ||
|
|
dc47b9ffd2 | ||
|
|
eaa47c8d40 | ||
|
|
e4e453a11c | ||
|
|
2209c230e7 | ||
|
|
9d70332c9a | ||
|
|
8150d38df0 | ||
|
|
75b5c31d07 | ||
|
|
c007ac3d86 | ||
|
|
7218be73c6 | ||
|
|
96693342a3 | ||
|
|
d2ff7b5c04 | ||
|
|
9a0f1db31e | ||
|
|
06da4d6556 | ||
|
|
20d0c05049 | ||
|
|
96e4957f71 | ||
|
|
9c5eeac239 | ||
|
|
e685697bbb | ||
|
|
752e515a1c | ||
|
|
ca0f68bb7d | ||
|
|
34884026d9 | ||
|
|
7a38bf0c08 | ||
|
|
5adcec2ca5 | ||
|
|
36989907a2 | ||
|
|
db55778fd8 | ||
|
|
41be51b384 | ||
|
|
e87efe2c67 | ||
|
|
069299e968 | ||
|
|
4d09a603fe | ||
|
|
8b595af5e9 | ||
|
|
41739a8799 | ||
|
|
23bebbca7c | ||
|
|
5f2af12150 | ||
|
|
628abd03f0 | ||
|
|
8e254c5807 | ||
|
|
0647576d6f | ||
|
|
c803ae9499 | ||
|
|
95f45312e1 | ||
|
|
9dda9a583d | ||
|
|
d1e6421e5b | ||
|
|
bd0a6aaaad | ||
|
|
1e8b176c69 | ||
|
|
14018798f7 | ||
|
|
a0d06ca6e8 | ||
|
|
95fe1eef6f | ||
|
|
38b1dda20b | ||
|
|
07cf1764dc | ||
|
|
aeb9c5b203 | ||
|
|
ad3f0c1a06 | ||
|
|
4bc180077e | ||
|
|
510db57666 | ||
|
|
5ee6a2195d | ||
|
|
63d4c1aedb | ||
|
|
e9204be96f | ||
|
|
0863061665 | ||
|
|
8aea74160c | ||
|
|
d375a97e99 | ||
|
|
fe5499e80a | ||
|
|
598da2a7fe | ||
|
|
fcbeeb9fc1 | ||
|
|
d82ef63d89 | ||
|
|
a457a8009e | ||
|
|
7698be8462 | ||
|
|
738868da8d | ||
|
|
fc7fc693ed | ||
|
|
27f5997e5a | ||
|
|
45274f5c72 | ||
|
|
2bdfd3f39b | ||
|
|
9b9174ab9a | ||
|
|
3e3e9796b1 | ||
|
|
ff5fa4c724 | ||
|
|
b8ab05ccad | ||
|
|
93e440385f | ||
|
|
af66a77026 | ||
|
|
75607dea1c | ||
|
|
5b353b05ac | ||
|
|
3162ab93a1 | ||
|
|
b18f631d33 | ||
|
|
2e254cb917 | ||
|
|
77ce9433a7 | ||
|
|
509e54762f | ||
|
|
caeb347137 | ||
|
|
a2b054844a | ||
|
|
5b79d4ef48 | ||
|
|
3de66ebe23 | ||
|
|
60ef51b7f5 | ||
|
|
aa8ee02277 | ||
|
|
b927ebbbf7 | ||
|
|
d72d5dcbcb | ||
|
|
d9f703d808 | ||
|
|
a9cc43c586 | ||
|
|
844567dcdf | ||
|
|
52ed4f73f4 | ||
|
|
907bd68e4e | ||
|
|
f35afaf6bc | ||
|
|
85b1b51b76 | ||
|
|
9dc5449e37 | ||
|
|
6ea226c972 | ||
|
|
44f9ab9806 | ||
|
|
edd1011737 | ||
|
|
08558bfaeb | ||
|
|
4afc2c153a | ||
|
|
988905c155 | ||
|
|
51aab00985 | ||
|
|
84924b6364 | ||
|
|
93f02877a7 | ||
|
|
7baac9dcbf | ||
|
|
4045978b54 | ||
|
|
56bc3fca04 | ||
|
|
c571a9ecb6 | ||
|
|
1ad60720df | ||
|
|
e5fe99c89b | ||
|
|
3fc32a68c3 | ||
|
|
142cc2881f | ||
|
|
4de55ea5fe | ||
|
|
620e75517c | ||
|
|
cba26a42af | ||
|
|
f3f598d6c7 | ||
|
|
fe7d9986fa | ||
|
|
143ca6f6e0 | ||
|
|
69ce065588 | ||
|
|
bfa31429f1 | ||
|
|
66f0cc8883 | ||
|
|
1a0ac27e49 | ||
|
|
7b87ae7b08 | ||
|
|
9ab8e63b1d | ||
|
|
0e147134f3 | ||
|
|
8605e23fbb | ||
|
|
5f34a777f1 | ||
|
|
1f43d07e16 | ||
|
|
a88aaf4590 | ||
|
|
25f78ed55b | ||
|
|
26e73c515c | ||
|
|
028374e62d | ||
|
|
dc1e5ce762 | ||
|
|
8fcf8ac46c | ||
|
|
ef70e71051 |
4
.github/workflows/ci.yml
vendored
4
.github/workflows/ci.yml
vendored
@@ -12,7 +12,9 @@ jobs:
|
||||
# Initialization
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- run: npm install
|
||||
with:
|
||||
node-version: '16'
|
||||
- run: npm ci
|
||||
- name: Copy configuration
|
||||
run: cp config.json.example config.json
|
||||
|
||||
|
||||
4
.github/workflows/release.yml
vendored
4
.github/workflows/release.yml
vendored
@@ -14,7 +14,9 @@ jobs:
|
||||
# Initialization
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
- run: npm install
|
||||
with:
|
||||
node-version: '16'
|
||||
- run: npm ci
|
||||
- name: Copy configuration
|
||||
run: cp config.json.example config.json
|
||||
|
||||
|
||||
20
.github/workflows/tests.yml
vendored
Normal file
20
.github/workflows/tests.yml
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
name: Tests
|
||||
|
||||
on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
name: Run tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
# Initialization
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/setup-node@v2
|
||||
with:
|
||||
node-version: '16'
|
||||
- run: npm ci
|
||||
|
||||
- name: Run tests
|
||||
run: npm run test-without-building
|
||||
26
.github/workflows/updateInvidous.yml
vendored
Normal file
26
.github/workflows/updateInvidous.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
||||
name: update invidious
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: '0 0 1 * *' # check every month
|
||||
|
||||
jobs:
|
||||
check-list:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
- name: Download instance list
|
||||
run: |
|
||||
wget https://api.invidious.io/instances.json -O data.json
|
||||
- name: "Run CI"
|
||||
run: npm run ci:invidious
|
||||
|
||||
- name: Create pull request to update list
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
with:
|
||||
commit-message: Update Invidious List
|
||||
author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
|
||||
branch: ci/update_invidious_list
|
||||
title: Update Invidious List
|
||||
body: Automated Invidious list update
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -6,4 +6,5 @@ web-ext-artifacts
|
||||
.vscode/
|
||||
dist/
|
||||
tmp/
|
||||
.DS_Store
|
||||
.DS_Store
|
||||
ci/data.json
|
||||
19
README.md
19
README.md
@@ -60,19 +60,24 @@ You can read the API docs [here](https://wiki.sponsor.ajay.app/index.php/API_Doc
|
||||
|
||||
# Building
|
||||
|
||||
Rename `config.json.example` to `config.json` and adjust configuration as desired.
|
||||
You must have [Node.js 16](https://nodejs.org/) and npm installed.
|
||||
|
||||
There are also other build scripts available. Install `npm`, then run `npm install` in the repository to install dependencies.
|
||||
1. Copy the file `config.json.example` to `config.json` and adjust configuration as desired.
|
||||
|
||||
Run `npm run build` to generate a Chrome extension.
|
||||
- You will need to repeat this step in the future if you get build errors related to `CompileConfig`. This can happen for example when a new category is added.
|
||||
|
||||
Use `npm run build:firefox` to generate a Firefox extension.
|
||||
2. Run `npm install` in the repository to install dependencies.
|
||||
|
||||
The result is in `dist`. This can be loaded as an unpacked extension
|
||||
3. Run `npm run build:dev` (for Chrome) or `npm run build:dev:firefox` (for Firefox) to generate a development version of the extension with source maps.
|
||||
|
||||
## Developing with a clean profile
|
||||
- You can also run `npm run build` (for Chrome) or `npm run build:firefox` (for Firefox) to generate a production build.
|
||||
|
||||
4. The built extension is now in `dist/`. You can load it in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/#manifest) or in Firefox as a [temporary extension](https://developer.mozilla.org/en-US/docs/Tools/about:debugging#loading_a_temporary_extension).
|
||||
|
||||
### Developing with a clean profile and hot reloading
|
||||
|
||||
Run `npm run dev` (for Chrome) or `npm run dev:firefox` (for Firefox) to run the extension using a clean browser profile with hot reloading. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands).
|
||||
|
||||
Run `npm run dev` to run the extension using a clean browser profile with hot reloading. Use `npm run dev:firefox` for Firefox. This uses [`web-ext run`](https://extensionworkshop.com/documentation/develop/web-ext-command-reference/#commands).
|
||||
Known chromium bug: Extension is not loaded properly on first start. Visit `chrome://extensions/` and reload the extension.
|
||||
|
||||
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.
|
||||
|
||||
55
ci/invidiousCI.ts
Normal file
55
ci/invidiousCI.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
This file is only ran by GitHub Actions in order to populate the Invidious instances list
|
||||
|
||||
This file should not be shipped with the extension
|
||||
*/
|
||||
|
||||
import { writeFile, existsSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
|
||||
// import file from https://api.invidious.io/instances.json
|
||||
if (!existsSync('./data.json')) {
|
||||
process.exit(1);
|
||||
}
|
||||
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
||||
// @ts-ignore
|
||||
import * as data from "./data.json";
|
||||
|
||||
type instanceMap = {
|
||||
name: string,
|
||||
url: string,
|
||||
dailyRatios: {ratio: string, label: string }[],
|
||||
thirtyDayUptime: string
|
||||
}[]
|
||||
|
||||
// only https servers
|
||||
const mapped: instanceMap = data
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
.filter((i: any) => i[1]?.type === 'https')
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
.map((instance: any) => {
|
||||
return {
|
||||
name: instance[0],
|
||||
url: instance[1].uri,
|
||||
dailyRatios: instance[1].monitor.dailyRatios,
|
||||
thirtyDayUptime: instance[1]?.monitor['30dRatio'].ratio,
|
||||
}
|
||||
})
|
||||
|
||||
// reliability and sanity checks
|
||||
const reliableCheck = mapped
|
||||
.filter((instance) => {
|
||||
// 30d uptime >= 90%
|
||||
const thirtyDayUptime = Number(instance.thirtyDayUptime) >= 90
|
||||
// available for at least 80/90 days
|
||||
const dailyRatioCheck = instance.dailyRatios.filter(status => status.label !== "black")
|
||||
return (thirtyDayUptime && dailyRatioCheck.length >= 80)
|
||||
})
|
||||
// url includes name
|
||||
.filter(instance => instance.url.includes(instance.name))
|
||||
|
||||
// finally map to array
|
||||
const result: string[] = reliableCheck.map(instance => instance.name)
|
||||
writeFile(join(__dirname, "./invidiouslist.json"), JSON.stringify(result), (err) => {
|
||||
if (err) return console.log(err);
|
||||
})
|
||||
1
ci/invidiouslist.json
Normal file
1
ci/invidiouslist.json
Normal file
@@ -0,0 +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"]
|
||||
@@ -2,15 +2,29 @@
|
||||
"serverAddress": "https://sponsor.ajay.app",
|
||||
"testingServerAddress": "https://sponsor.ajay.app/test",
|
||||
"serverAddressComment": "This specifies the default SponsorBlock server to connect to",
|
||||
"categoryList": ["sponsor", "selfpromo", "interaction", "poi_highlight", "intro", "outro", "preview", "music_offtopic"],
|
||||
"categoryList": ["sponsor", "selfpromo", "interaction", "poi_highlight", "intro", "outro", "preview", "filler", "music_offtopic"],
|
||||
"categorySupport": {
|
||||
"sponsor": ["skip", "mute"],
|
||||
"selfpromo": ["skip", "mute"],
|
||||
"interaction": ["skip", "mute"],
|
||||
"intro": ["skip"],
|
||||
"outro": ["skip"],
|
||||
"preview": ["skip"],
|
||||
"intro": ["skip", "mute"],
|
||||
"outro": ["skip", "mute"],
|
||||
"preview": ["skip", "mute"],
|
||||
"filler": ["skip", "mute"],
|
||||
"music_offtopic": ["skip"],
|
||||
"poi_highlight": ["skip"]
|
||||
},
|
||||
"wikiLinks": {
|
||||
"sponsor": "https://wiki.sponsor.ajay.app/w/Sponsor",
|
||||
"selfpromo": "https://wiki.sponsor.ajay.app/w/Unpaid/Self_Promotion",
|
||||
"interaction": "https://wiki.sponsor.ajay.app/w/Interaction_Reminder_(Subscribe)",
|
||||
"intro": "https://wiki.sponsor.ajay.app/w/Intermission/Intro_Animation",
|
||||
"outro": "https://wiki.sponsor.ajay.app/w/Endcards/Credits",
|
||||
"preview": "https://wiki.sponsor.ajay.app/w/Preview/Recap",
|
||||
"filler": "https://wiki.sponsor.ajay.app/w/Filler_Tangent",
|
||||
"music_offtopic": "https://wiki.sponsor.ajay.app/w/Music:_Non-Music_Section",
|
||||
"poi_highlight": "https://wiki.sponsor.ajay.app/w/Highlight",
|
||||
"guidelines": "https://wiki.sponsor.ajay.app/w/Guidelines",
|
||||
"mute": "https://wiki.sponsor.ajay.app/w/Mute_Segment"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "__MSG_fullName__",
|
||||
"short_name": "SponsorBlock",
|
||||
"version": "3.3",
|
||||
"version": "3.7.1",
|
||||
"default_locale": "en",
|
||||
"description": "__MSG_Description__",
|
||||
"homepage_url": "https://sponsor.ajay.app",
|
||||
@@ -37,6 +37,7 @@
|
||||
"icons/upvote.png",
|
||||
"icons/downvote.png",
|
||||
"icons/thumbs_down.svg",
|
||||
"icons/thumbs_down_locked.svg",
|
||||
"icons/thumbs_up.svg",
|
||||
"icons/help.svg",
|
||||
"icons/report.png",
|
||||
|
||||
2234
package-lock.json
generated
2234
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -52,6 +52,7 @@
|
||||
"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",
|
||||
"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\"",
|
||||
"dev:firefox-android": "npm run build:dev:firefox && concurrently \"npm run web-run:firefox-android\" \"npm run build:watch:firefox\"",
|
||||
@@ -66,6 +67,6 @@
|
||||
"url": "git+https://github.com/ajayyy/SponsorBlock.git"
|
||||
},
|
||||
"author": "Ajay Ramachandran",
|
||||
"license": "GPL-3.0-only",
|
||||
"license": "LGPL-3.0-or-later",
|
||||
"private": true
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Прескачайте спонсорства, напомняния за абониране, и други неща в YouTube клипове. Докладвайте спонсорства на клиповете които гледате, за да спестите време на други потребители.",
|
||||
"message": "Прескачайте спонсорства, напомняния за абониране и други неща в клипове в YouTube. Докладвайте спонсорства в клиповете, които гледате, за да спестите време на други потребители.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
@@ -23,7 +23,7 @@
|
||||
"message": "сегмент"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "сегменти"
|
||||
"message": "сегмента"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Одобряване на това предложение"
|
||||
@@ -86,7 +86,7 @@
|
||||
"message": "Отказ от създаването на сегмент"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Не е намерен видеоклип в YouTube.\nАко това е неправилно, опреснете раздела."
|
||||
"message": "Не е намерен видеоклип в YouTube.\nАко това не е правилно, опреснете раздела."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Опресняване на сегментите"
|
||||
@@ -131,7 +131,7 @@
|
||||
"message": "Изпратени сегменти"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Вие сте помогнали на хората да пропуснат "
|
||||
"message": "Помогнахте на хората да пропуснат "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Класиране"
|
||||
@@ -156,7 +156,7 @@
|
||||
"message": "Това се използва на страницата с публичната статистика, за да покаже колко сте допринесли. Вижте го"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Потребителско име"
|
||||
"message": "Потребител"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Задайте потребителско име"
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Това скрива бутоните, които се показват в плейъра на YouTube за изпращане на сегменти за пропускане."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Оставяне в плейъра на бутона за преминаване към акцента"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Показване на бутона за информация в плейъра на YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Скриване на бутона за информация в плейъра на YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Това е бутонът, който отваря изскачащ прозорец в страницата на YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Автоматично скриване на бутона за информация"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Показване на бутона за изтриване в плейъра на YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Това е бутонът в плейъра на YouTube, който ще изчисти всичките ви неизпратени сегменти за текущия видеоклип."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Активиране проследяването на броя пропускания"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Показване на бутона за качване"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Този бутон се появява в плейъра на YouTube, след като сте избрали времева отметка и сте готови за изпращане."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Адрес на сървъра на SponsorBlock"
|
||||
},
|
||||
@@ -534,7 +528,7 @@
|
||||
"message": "Платена промоция, платени препоръки и директни реклами. Не за самореклама или безплатни препоръки за каузи/създатели/уебсайтове/продукти, които се харесват на автора."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Неплатени/Самореклама"
|
||||
"message": "Неплатена/Самореклама"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Подобно на „спонсорство“, но за безплатна реклама или самореклама. Това включва търговия със стоки, дарения или информация с кого каналът има сътрудничество."
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Бързо обобщение на предишни епизоди или преглед на това, което предстои по-късно в текущия видеоклип. Предназначен за монтирани заедно клипове, а не за речеви обобщения."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Пълнеж извън темата"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Съпътстващи сцени, добавени само за пълнеж или хумор, които не са необходими за разбирането на основното съдържание на видеоклипа. Това не трябва да включва сегменти, предоставящи контекст или справочни данни."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Пълнеж"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Музика: Част без музика"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Грешно/Неправилно време"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Грешна категория"
|
||||
"message": "Промяна на категорията"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Това видео е категоризирано като музика. Сигурни ли сте, че това има спонсор? Ако това всъщност е „Немузикален сегмент“, отворете опциите на разширението и активирайте тази категория. След това можете да изпратите този сегмент като „Немузикален“ вместо като спонсор. Моля, прочетете указанията, ако сте объркани."
|
||||
@@ -811,10 +814,28 @@
|
||||
"Credits": {
|
||||
"message": "Заслуги"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Ново! Отидете до съществената част на видеоклипа с едно щракване с новата категория „Акцент“"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Научете повече"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Гласуване против и създаване на локално копие, за да го изпратите отново"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Отваряне на wiki страницата на тази категория."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Копиране и гласуване против"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Продължаване на гласуването"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Това незабавно ще се приложи към вашите сегменти"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Използвайте колелото на мишката, докато държите курсора върху полето за редактиране, за да коригирате бързо времето. Комбинации с клавиша ctrl или shift могат да се използват за фина настройка на промените."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Ново! Пропускайте части извън темата и шегите с категорията „Пълнеж“. Активирайте я в опциите"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Skryje tlačítka, která se zobrazí v YouTube přehrávači pro přeskočení segmentů."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Nechat tlačítko přeskočení na zvýraznění v přehrávači"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Zobrazit informační tlačítko v YouTube přehrávači"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Skrýt informační tlačítko v YouTube přehrávači"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Toto je tlačítko, které otevře vyskakovací nabídku na YouTube stránce."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Automaticky skrýt informační tlačítko"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Zobrazit tlačítko Odstranit v YouTube přehrávači"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Toto je tlačítko v YouTube přehrávači, které odebere všechny vaše neodeslané segmenty v současném videu."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Povolit počítadlo přeskočení"
|
||||
},
|
||||
@@ -266,7 +263,7 @@
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Nastavit klíč pro přeskočení segmentu"
|
||||
"message": "Nastavit klávesu pro přeskočení segmentu"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Nastavte klávesu pro spuštění/zastavení segmentu"
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Zobrazit tlačítko Nahrát"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Toto tlačítko se objeví v YouTube přehrávači po vybrání časového razítka a po připravení k odeslání."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresa serveru SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Rychlé shrnutí předchozích epizod nebo náhled toho, co se objeví v aktuálním videu. Myšleno pro upravené sloučené klipy, ne pro mluvená shrnutí."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Výplň"
|
||||
},
|
||||
"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í."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Výplň"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Hudba: nehudební sekce"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Nesprávné / špatné časování"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Špatná kategorie"
|
||||
"message": "Změnit kategorii"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Toto video je kategorizováno jako hudba. Jste si jisti, že je v něm sponzorská sekce? Pokud se opravdu jedná o \"Nehudební segment\", otevřete nastavení a povolte tuto kategorii. Poté budete moct odeslat segment jako \"Nehudební\" místo sponzorského. Pokud jste zmateni, přečtěte si prosím pokyny."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Poděkování"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novinka! Dostaňte se k pointě videa jedním kliknutím s novou kategorií zvýraznění"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Zjistit více"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Zahlasuje proti a vytvoří pro vás lokální kopii pro opětovné odeslání"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Otevřít wiki stránku této kategorie."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Zkopírovat a hlasovat proti"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Pokračovat v hlasování"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Toto bude okamžitě platit pro vaše segmenty"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Použijte kolečko myši při přechodu přes editační okno pro rychlou úpravu času. Kombinace kláves Ctrl nebo Shift mohou být použity k doladění změn."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Novinka! Překakujte výplňové části a vtipy s kategorií výplň. Povolte ji v nastavení"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "Spring over"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Lyd til"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Sat på pause"
|
||||
},
|
||||
@@ -115,7 +118,477 @@
|
||||
"submitCheck": {
|
||||
"message": "Er du sikker på, at du vil indsende dette?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Hvidliste kanal"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Fjern kanal fra hvidliste"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Stem På Et Segment"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Indsendelser"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Du har reddet folk fra "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Topliste"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Indsend"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "Sektionsredigering vises, når du klikker på afsend",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Tip: Du kan opsætte keybinds til indsendelse i indstillingerne"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Ryd Tider"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Indsend Tider"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Dette bruges på siden med offentlige statistikker til at vise, hvor meget du har bidraget. Se det"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Brugernavn"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Angiv Brugernavn"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Kopier Offentligt Bruger-ID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Kom til den officielle Discord-server for at give forslag og feedback!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Skjul dette"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Indstillinger"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Vis Knapper På YouTube-Afspiller"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Skjul Knapper På YouTube-Afspiller"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Dette skjuler knapperne, der vises på YouTube-afspilleren for indsende springe segmenter."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Behold Knappen Spring Til Fremhævning På Afspilleren"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Vis Info-Knap På YouTube-Afspiller"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Skjul Info-Knap På YouTube-Afspiller"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Auto-Skjul Info-Knap"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Skjul Slet-Knappen på YouTube-Afspiller"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Vis Slet-Knappen på YouTube-Afspiller"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Aktiver Optælling Af Antal Spring Over"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Denne funktion registrerer hvilke segmenter, du har sprunget over, så brugere kan se, hvor meget deres bidrag har hjulpet andre, og bruges som en måleenhed sammen med upvotes for at sikre, at spam ikke kommer ind i databasen. Udvidelsen sender en besked til serveren hver gang, du springer et segment over. Forhåbentlig ændrer de fleste ikke denne indstilling, så visningstallene er korrete. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Aktiver Optælling Af Antal Spring Over I Private-/Inkognitovinduer"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Forespørg Efter Hashpræfiks"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "I stedet for at anmode om segmenter fra serveren ved hjælp af videoID'et, sendes de første 4 tegn i hashen af videoID'et. Serveren sender data tilbage for alle videoer med lignende hashes."
|
||||
},
|
||||
"enableRefetchWhenNotFound": {
|
||||
"message": "Opdater Segmenter På Nye Videoer"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Hvis videoen er ny, og der ikke er nogle segmenter fundet, vil den opdatere hvert par minutter, mens du ser."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Vis Bemærkning Igen"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Vis Bemærkning Efter Et Segment Skippes"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Fuld Størrelse Skip-Bemærkninger"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Små Skip-Bemærkninger for Auto-Skip"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Alle Små Skip-Bemærkninger"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Faded Skip-Bemærkninger for Auto-Skip"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Alle Faded Skip-Bemærkninger"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsoBlock lader dig skippe sponsorer, introer, outroer, abonnement påmindelser og andre irriterende dele af YouTube-Videoer. SponsorBlock er en crowdsourced browerudvidelse, hvor alle kan indsende start- og sluttidspunkter for sponsorerede og andre segmenter i YouTube-Videoer. Du kan også springe over de dele af musikvideoer, som ikke er musik.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
"message": "Hjemmeside",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "Kildekode",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"noticeUpdate": {
|
||||
"message": "Meddelelsen er blevet opgraderet!",
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Hvis du stadig ikke kan lide det, så tryk på aldrig vis knappen.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Indstil tast for at springe et segment over"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Indstil tast til start/stop segment tastaturbinding"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Indstil tast til indsendelse tastaturbinding"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Vælg en tast ved at skrive den"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "Tastaturbindingen er blevet sat til: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Forbindelsestimeout. Tjek din internetforbindelse. Hvis dit internet fungerer, er serveren sandsynligvis overbelastet eller nede."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Spring over er aktiveret"
|
||||
},
|
||||
"enableSkipping": {
|
||||
"message": "Spring over er deaktiveret"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Dit Arbejde",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Serveren virker at være overbelastet. Prøv igen om et par sekunder."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Fejlkode: "
|
||||
},
|
||||
"skip": {
|
||||
"message": "Spring Over"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Gør Tavs"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Spring {0} over?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Gør {0} tavs?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Spring til {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} Sprunget Over",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} Tavsgjort",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Skipped til {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Deaktiver Auto-Skip"
|
||||
},
|
||||
"enableAutoSkip": {
|
||||
"message": "Aktiver Auto-Skip"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Lydnofikation på Skip"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Lydnotifikation ved skip vil spille en lyd når et segment skippes. Hvis deaktiveret (eller auto-skip er deaktiveret) vil ingen lyd blive spillet."
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "Vis Tid Med Skip Fjernet"
|
||||
},
|
||||
"showTimeWithSkipsDescription": {
|
||||
"message": "Denne tid vises i parantes ved siden af den aktuelle tid under søgelinjen. Dette viser den totale videovarighed minus alle segmenter. Dette inkluderer segmenter markeret som kun \"Vis I Søgelinjen\"."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Du har sprunget over "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Du har gemt dig selv "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "minut"
|
||||
},
|
||||
"minsLower": {
|
||||
"message": "minutter"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "time"
|
||||
},
|
||||
"hoursLower": {
|
||||
"message": "timer"
|
||||
},
|
||||
"youHaveSavedTime": {
|
||||
"message": "Du har sparret folk"
|
||||
},
|
||||
"youHaveSavedTimeEnd": {
|
||||
"message": " af deres liv"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Tjek status.sponsor.ajay.app for serverstatus."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "Importer/Eksporter Dit Bruger-ID"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Dette bør holdes privat. Det er ligesom en adgangskode og bør ikke deles med nogen. Hvis nogen har dette, kan de udgive sig for at være dig. Hvis du leder efter dit offentlige bruger-ID, skal du klikke på udklipsholderikonet i popup-vinduet."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Indstil Bruger-ID"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Advarsel: Ændring af Bruger-IDet er permanent. Er du sikker på, at du vil gøre det? Sørg for at sikkerhedskopiere din gamle for en sikkerheds skyld."
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Oprettet Af"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Det er i øjeblikket sat til:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "Understøtter tredjeparts YouTube sider"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Understøt tredjeparts YouTube klienter. For at aktivere understøttelse, skal du acceptere de ekstra tilladelser. Dette virker IKKE i inkognito på 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": "Understøttede Sider: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Aktiver Invidious understøttelse, deaktiver auto spring over, skjul knapper og mere."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Tilføj Tredjeparts Klientinstans"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Tilføj brugerdefineret instans. Dette skal formateres med KUN domænet. Eksempel: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Tilføj"
|
||||
},
|
||||
"addInvidiousInstanceError": {
|
||||
"message": "Dette er et ugyldigt domæne. Dette bør KUN omfatte domænedele. Eksempel: invidious.ajay.app"
|
||||
},
|
||||
"resetInvidiousInstance": {
|
||||
"message": "Nulstil Liste over Invidious-Instanser"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Du er ved at nulstille listen over Invidious-instancer"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Nuværende Instans:"
|
||||
},
|
||||
"minDuration": {
|
||||
"message": "Minimumsvarighed (sekunder):"
|
||||
},
|
||||
"minDurationDescription": {
|
||||
"message": "Segmenter kortere end den indstillede værdi vil ikke blive sprunget over eller vist i spilleren."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Spring meddelelsesvarighed over (sekunder):"
|
||||
},
|
||||
"save": {
|
||||
"message": "Gem"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Nulstil"
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Er du sikker på, at du ønsker at nulstille dette?"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "m.youtube.com understøttes nu"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Importer/Eksporter Alle Indstillinger"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Indstil Indstillinger"
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Indsend Segment"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Indsend"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Annuller"
|
||||
},
|
||||
"delete": {
|
||||
"message": "Slet"
|
||||
},
|
||||
"preview": {
|
||||
"message": "Forhåndsvisning"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "Ikke Indsendt"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Undersøg"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Rediger"
|
||||
},
|
||||
"theKey": {
|
||||
"message": "Tasten"
|
||||
},
|
||||
"to": {
|
||||
"message": "til",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Ubetalt/Egen Markedsføring"
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Påmindelse Om Interaktion (Abonnement)"
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Påmindelse Om Interaktion"
|
||||
},
|
||||
"category_intro": {
|
||||
"message": "Pause/Intro-Animation"
|
||||
},
|
||||
"category_intro_short": {
|
||||
"message": "Pause"
|
||||
},
|
||||
"category_outro": {
|
||||
"message": "Slutkort/Kreditter"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Forhåndsvisning/Opsamling"
|
||||
},
|
||||
"skipOption": {
|
||||
"message": "Spring Over Indstillinger",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Aktiver Betatestserver"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Nu)"
|
||||
},
|
||||
"moreCategories": {
|
||||
"message": "Flere Kategorier"
|
||||
},
|
||||
"chooseACategory": {
|
||||
"message": "Vælg en Kategori"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Slut)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "skjult: downvote"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "skjult: for kort"
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Accepter tilladelse"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Tilladelsesandmodning lykkedes!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Tilladelsesanmodning mislykkedes, klikkede du på afvis?"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Ukorrekt/Forkert Timing"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Skift Kategori"
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Adskillige Segmenter"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Retningslinjer"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Læs Retningslinjerne!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Kategorier er her!"
|
||||
},
|
||||
"help": {
|
||||
"message": "Hjælp"
|
||||
},
|
||||
"GotIt": {
|
||||
"message": "Forstået",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Skjul for evigt"
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Doner"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Skjul Donationslink"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Tak for at installere SponsorBlock."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Venligst gennemgå indstillingerne nedenfor"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Hvordan spring over virker"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Indsendelse"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Redigering"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@
|
||||
"message": "Abgestimmt!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Der Server ist anscheinend offline. Bitte unverzüglich dem Entwickler melden."
|
||||
"message": "Der Server ist anscheinend offline. Bitte kontaktiere den Entwickler unverzüglich."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Ein Verbindungsfehler ist aufgetreten. Fehlermeldung: "
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Versteckt die Schaltflächen im YouTube-Videoplayer, um Segmente einzusenden."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "\"Zum Highlight springen\"-Knopf im Player behalten"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Zeige Info-Knopf im Youtube-Videoplayer"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Deaktiviere Info-Knopf im Youtube-Videoplayer"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Dieser Knopf öffnet ein Pop-up auf der Youtube-Seite."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Info-Button automatisch ausblenden"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Zeige den Löschen-Knopf im Youtube-Videoplayer"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Dieser Knopf im YouTube-Videoplayer löscht alle nicht übermittelten Segmente für das aktuelle Video."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Aktiviere das Zählen übersprungener Segmente"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Upload-Knopf anzeigen"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Dieser Knopf erscheint im YouTube-Videoplayer, nachdem du ein Videosegment markiert hast und dazu bereit bist, es zu übermitteln."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock Serveradresse"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Kurze Zusammenfassung bisheriger Videos oder eine Vorschau auf das aktuelle Video. Für zusammengeschnittene Clips gedacht, jedoch nicht für mündliche Zusammenfassungen."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Füller/Nebensächliches"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Füller"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musikvideoteile ohne Musik"
|
||||
},
|
||||
@@ -579,7 +582,7 @@
|
||||
"message": "Musikvideoteile ohne Musik"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Hervorheben"
|
||||
"message": "Highlight"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Der Teil des Videos, nach dem die meisten Leute suchen, ähnlich wie \"Video startet bei x\" Kommentare."
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Nicht korrekt oder falsches Timing"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Falsche Kategorie"
|
||||
"message": "Kategorie ändern"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Dieses Video ist als Musikvideo kategorisiert. Bist du dir sicher, dass es ein gesponsertes Videosegment hat? Wenn dies tatsächlich ein Musikvideoteil ohne Musik ist, öffne die Optionen von SponsorBlock und aktiviere diese Kategorie. Danach kannst du dieses Segment als solches markieren. Bitte lese die Richtlinien, wenn du dir nicht sicher bist."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Mitwirkende"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Neu! Gehe mit einem Klick zum Punkt des Videos mit der neuen \"Hervorheben\" Kategorie"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Erfahre mehr"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Abwerten, und eine lokale Kopie zum erneuten Einreichen erstellen"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Öffne den Wiki-Artikel dieser Kategorie."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopieren und abwerten"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Bewerten fortsetzen"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Dies wirkt sich sofort auf eigene Segmente aus"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Benutze das Mausrad während der Mauszeiger über dem Eingabefeld schwebt um die Zeit schnell anzupassen. Benutze Strg bzw. Shift für gröbere/genauere Änderungen."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Neu! Überspringe Nebensächliches und Witze mit der Füller-Kategorie. Aktiviere sie in den Optionen"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "T",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "S",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,22 @@
|
||||
"message": "SponsorBlock for YouTube - Skip Sponsorships",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Παράλειψη χορηγιών, επαιτείας συνδρομής και άλλων στα βίντεο του YouTube. Αναφέρετε χορηγούς σε βίντεο που βλέπετε για να εξοικονομήσετε τον χρόνο άλλων.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
"message": "Ο διακομιστής είπε πως το αίτημα αυτό ήταν άκυρο"
|
||||
},
|
||||
"429": {
|
||||
"message": "Έχετε υποβάλει πάρα πολλές ώρες χορηγών για αυτό το βίντεο, είστε σίγουροι ότι υπάρχουν τόσες πολλές;"
|
||||
},
|
||||
"409": {
|
||||
"message": "Αυτό έχει ήδη υποβληθεί"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Το κανάλι προστέθηκε στην λίστα επιτρεπόμενων!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "τμήμα"
|
||||
},
|
||||
@@ -139,9 +155,6 @@
|
||||
"chooseACategory": {
|
||||
"message": "Επιλέξτε μια κατηγορία"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Λάθος κατηγορία"
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Πολλαπλά Τμήματα"
|
||||
},
|
||||
|
||||
@@ -183,7 +183,7 @@
|
||||
"message": "This hides the buttons that appear on the YouTube player to submit skip segments."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Keep Skip to Highlight Button on Player"
|
||||
"message": "Keep Skip To Highlight Button On Player"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Show Info Button On YouTube Player"
|
||||
@@ -563,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Quick recap of previous episodes, or a preview of what's coming up later in the current video. Meant for edited together clips, not for spoken summaries."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Filler Tangent"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Filler"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Music: Non-Music Section"
|
||||
},
|
||||
@@ -700,7 +709,7 @@
|
||||
"message": "Incorrect/Wrong Timing"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Wrong Category"
|
||||
"message": "Change Category"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "This video is categorized as music. Are you sure this has a sponsor? If this is actually a \"Non-Music segment\", open up the extension options and enable this category. Then, you can submit this segment as \"Non-Music\" instead of sponsor. Please read the guidelines if you are confused."
|
||||
@@ -805,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Credits"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "New! Get to the point of the video with one click with the new highlight category"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Learn More"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Downvotes and creates a local copy for you to resubmit"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Open this category's wiki page."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Copy and downvote"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Continue Voting"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "This will instantly apply to your segments"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Use your mousewheel while hovering over the edit box to quickly adjust the time. Combinations of the ctrl or shift key can be used to fine tune the changes."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "New! Skip tangents and jokes with the filler category. Enable in options"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
"message": "Salte todos los patrocinios, súplicas por suscripción y más en los vídeos de YouTube. Reporta secciones de patrocinio en los vídeos que veas para ahorrarle tiempo a los demás.",
|
||||
"message": "Salte todos los sponsors, súplicas de suscripción y más en vídeos de YouTube. Reporta sponsors en los vídeos que veas para ahorrarle tiempo a los demás.",
|
||||
"description": "Description of the extension."
|
||||
},
|
||||
"400": {
|
||||
@@ -26,13 +26,13 @@
|
||||
"message": "segmentos"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Votar a favor de esta sumisión"
|
||||
"message": "Votar positivamente este envío"
|
||||
},
|
||||
"reportButtonTitle": {
|
||||
"message": "Denunciar"
|
||||
"message": "Reportar"
|
||||
},
|
||||
"reportButtonInfo": {
|
||||
"message": "Denunciar esta sumisión como incorrecta."
|
||||
"message": "Reportar este envío como incorrecto."
|
||||
},
|
||||
"Dismiss": {
|
||||
"message": "Descartar"
|
||||
@@ -53,7 +53,7 @@
|
||||
"message": "Volver a saltar"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Restaurar sonido"
|
||||
"message": "Quitar silencio"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pausado"
|
||||
@@ -156,7 +156,7 @@
|
||||
"message": "Esto se utiliza en la página de estadísticas públicas para mostrar cuánto has contribuido. Véala"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Usuario"
|
||||
"message": "Nombre de Usuario"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Escoger Nombre De Usuario"
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Esto oculta los botones que aparecen en el reproductor de YouTube que se usan para enviar segmentos saltados."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Mantener el Botón de \"Saltar a Destacado\" en el Reproductor"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostrar botón de información en el reproductor de YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Ocultar botón de información en el reproductor de YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Este es el botón que abre una ventana en la página de YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Ocular automáticamente el Botón de Información"
|
||||
},
|
||||
@@ -200,14 +200,11 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Mostrar botón de eliminar en el reproductor de YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Este es el botón en el reproductor de YouTube que eliminará todos tus segmentos no enviados para el vídeo actual."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Habilitar el conteo de omisiones"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Esta función rastrea los segmentos que se han saltado para que los usuarios sepan en qué medida sus aportes ayudaron a los demás y se utilizan como una métrica junto con los votos favorables para garantizar que no aparezca spam en la base de datos. La extensión envía un mensaje al servidor cada vez que se salta un segmento. Esperemos que la mayoría de la gente no cambie esta configuración para que los números de vista sean exactos. :)"
|
||||
"message": "Esta función rastrea los segmentos que se han saltado para que los usuarios sepan en qué medida sus envíos ayudaron a los demás y se utilizan como una métrica junto con los votos positivos para garantizar que no aparezca spam en la base de datos. La extensión envía un mensaje al servidor cada vez que se salta un segmento. Esperemos que la mayoría de la gente no cambie esta configuración para que los números de vistas sean exactos. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Activar el seguimiento del número de saltos en las pestañas privadas/de incógnito"
|
||||
@@ -272,13 +269,13 @@
|
||||
"message": "Establecer tecla para iniciar/detener un segmento"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Establecer botón de envío"
|
||||
"message": "Establecer tecla para el envío"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Seleccione un botón escribiéndolo"
|
||||
"message": "Seleccione una tecla escribiéndola"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "El botón se ha establecido a: "
|
||||
"message": "Ese atajo de teclas se ha establecido como: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Tiempo de espera agotado. Compruebe su conexión a Internet. Si su internet está funcionando, el servidor probablemente esta sobrecargado o desconectado."
|
||||
@@ -437,14 +434,11 @@
|
||||
"message": "El aviso de omisión permanecerá en la pantalla por lo menos este tiempo. Si la omisión es manual, podría ser visible por más tiempo."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "La siguiente sumisión 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?"
|
||||
"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?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Mostrar botón de subida"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Este botón aparece en el reproductor de YouTube después de que has seleccionado una marca de tiempo y estas listo para enviar."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Dirección del servidor SponsorBlock"
|
||||
},
|
||||
@@ -518,10 +512,10 @@
|
||||
"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": "El botón"
|
||||
"message": "La tecla"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "está enlazado a otra acción. Por favor, seleccione otro botón."
|
||||
"message": "está enlazada a otra acción. Por favor, seleccione otra tecla."
|
||||
},
|
||||
"to": {
|
||||
"message": "a",
|
||||
@@ -531,7 +525,7 @@
|
||||
"message": "Sponsor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Promoción pagada, referencias pagadas y anuncios directos. No para autopromoción o anuncios gratuitos a causas/creadores/sitios web/productos que les gusten."
|
||||
"message": "Promoción pagada, recomendaciones pagadas y anuncios directos. No para promoción propia o anuncios gratuitos a causas/creadores/sitios web/productos que les gusten."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Promoción Propia/No Remunerada"
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Recapitulación rápida de los episodios anteriores, o una vista previa de lo que va a ocurrir más adelante en el vídeo actual. Está pensado para clips editados juntos, no para resúmenes hablados."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Tangente de Relleno"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Relleno"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Música: Sección sin musica"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Tiempo incorrecto/equivocado"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Categoría Incorrecta"
|
||||
"message": "Cambiar Categoría"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Este video está clasificado como música. ¿Estás seguro de que esto tiene un sponsor? Si esto es realmente un \"Segmento Sin Música\", abre las opciones de la extensión y activa esta categoría. Entonces, puedes enviar este segmento como \"Sin Música\" en lugar de sponsor. Por favor, lee las instrucciones si estás confundido/a."
|
||||
@@ -725,7 +728,7 @@
|
||||
"message": "¡Las categorías están aquí!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Abre las opciones de saltarse intros, otros, mercantil, etc."
|
||||
"message": "Abre las opciones de saltarse intros, outros, mercancía, etc."
|
||||
},
|
||||
"help": {
|
||||
"message": "Ayuda"
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Créditos"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "¡Nuevo! Llega al punto del video con un solo clic con la nueva categoría \"destacado\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Aprenda Más"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Vota negativamente y crea una copia local para que la puedas volver a enviar"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Abrir la página de la wiki de esta categoría."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Copiar y votar negativamente"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Continuar Votando"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Esto se aplicará instantáneamente a tus segmentos"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Utilice la rueda del ratón mientras pasa el cursor por encima del cuadro de edición para ajustar el tiempo. Se pueden utilizar combinaciones de la tecla ctrl o shift para afinar los cambios."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "¡Nuevo! Omite tangentes y bromas con la categoría de relleno. Habilítala en opciones"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
"message": "See on juba varasemalt saadetud"
|
||||
},
|
||||
"channelWhitelisted": {
|
||||
"message": "Kanal lubamisnimekirjas!"
|
||||
"message": "Kanal ignoreerimisnimekirjas!"
|
||||
},
|
||||
"Segment": {
|
||||
"message": "segmendi"
|
||||
@@ -41,7 +41,7 @@
|
||||
"message": "Laadimine..."
|
||||
},
|
||||
"Hide": {
|
||||
"message": "Ära näita kunagi"
|
||||
"message": "Ära kunagi näita"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Vajuta \"kuva uuesti\", et jõuda sinna, kust tulid."
|
||||
@@ -119,10 +119,10 @@
|
||||
"message": "Kas soovid kindlasti selle saata?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Lisa kanal lubamisnimekirja"
|
||||
"message": "Lisa kanal ignoreerimisnimekirja"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Eemalda kanal lubamisnimekirjast"
|
||||
"message": "Eemalda kanal ignoreerimisnimekirjast"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Hääleta segmendi sobivust"
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "See peidab nupud, mis kuvatakse YouTube'i mängijal vahelejätmiste segmentide saatmiseks."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Hoia esiletõstuni vahelejätmise nuppu mängijal"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Kuva YouTube'i mängijal infonupp"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Peida YouTube'i mängijal infonupp"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "See on see nupp, mis avab YouTube'i lehel hüpiku."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Peida infonupp automaatselt"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Kuva YouTube'i mängijal kustutusnupp"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "YouTube'i mängija nupp, mis tühjendab kõik sinu praeguse video saatmata segmendid."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Luba vahelejätmiste arvu jälgimine"
|
||||
},
|
||||
@@ -262,7 +259,7 @@
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Kui sulle see ikka ei meeldi, vajuta \"ära näita kunagi\" nuppu.",
|
||||
"message": "Kui sulle see ikka ei meeldi, vajuta \"ära kunagi näita\" nuppu.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Kuva üleslaadimisnupp"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "See nupp kuvatakse YouTube'i mängijal, kui oled ajatempli ära valinud ning saatmiseks valmis."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlocki serveri aadress"
|
||||
},
|
||||
@@ -512,7 +506,7 @@
|
||||
"message": "Lõikelauale kirjutamine ebaõnnestus"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Kopeerib lõikelauale info, mida saad arendajale anda veast teatamisel või siis, kui arendaja seda sinult taotleb. Tundlik info, sealhulgas sinu kasutaja ID, lubamisnimekirjas kanalid ning kohandatud serveri aadress on eemaldatud. Siiski see sisaldab teatud infot, nagu sinu kasutajaagent, brauser, opsüsteem ning laienduse versiooninumber."
|
||||
"message": "Kopeerib lõikelauale info, mida saad arendajale anda veast teatamisel või siis, kui arendaja seda sinult taotleb. Tundlik info, sealhulgas sinu kasutaja ID, ignoreerimisnimekirjas kanalid ning kohandatud serveri aadress on eemaldatud. Siiski see sisaldab teatud infot, nagu sinu kasutajaagent, brauser, opsüsteem ning laienduse versiooninumber."
|
||||
},
|
||||
"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."
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Kiire kokkuvõte eelmistest episoodidest või eelvaade videos hiljem tulevast. Mõeldud valmis töödeldud klippide, mitte suuliste kokkuvõtete jaoks."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Täitesisu"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Täide"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muusika: mitte-muusika jaotis"
|
||||
},
|
||||
@@ -697,7 +700,7 @@
|
||||
"message": "Sunnitud kanalikontroll enne vahelejätmist"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Vaikimisi jätab see segmendid vahele juba siis, kui veel kanalitki ei tea. Vaikimisi võidakse mõned video alguses olevad segmendid lubamisnimekirjas olevatel kanalitel vahele jätta. Selle valiku lubamine väldib seda, kuid võib lisada vahelejätmistele väikese viivituse, sest kanali ID hankimine võib aega võtta. Viivitus võib kiire interneti puhul olla märkamatu."
|
||||
"message": "Vaikimisi jätab see segmendid vahele juba siis, kui veel kanalitki ei tea. Vaikimisi võidakse mõned video alguses olevad segmendid ignoreerimisnimekirjas olevatel kanalitel vahele jätta. Selle valiku lubamine väldib seda, kuid võib lisada vahelejätmistele väikese viivituse, sest kanali ID hankimine võib aega võtta. Viivitus võib kiire interneti puhul olla märkamatu."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Kaalu valiku \"Sunnitud kanalikontroll enne vahelejätmist\" lubamist"
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Sobimatu/vale ajastus"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Vale kategooria"
|
||||
"message": "Muuda kategooriat"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "See video on muusikana kategoriseeritud. Kas oled kindel, et sellel on sponsor? Kui see on tegelikult \"mitte-muusika segment\", ava laienduse valikud ning luba see kategooria. Seejärel saad selle segmendi saata \"mitte-muusika\" kategoorias. Segaduse korral palun loe üle juhised."
|
||||
@@ -760,16 +763,66 @@
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Palun vaata allolevad valikud üle"
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Kuidas vahelejätmine töötab"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Segmentide saatmine"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Redigeerimine"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "See on liiga aeglane"
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Kas ma saaksin andmebaasist koopia? Mis juhtub, kui sa kaod?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Andmebaas on avalik ning saadaval aadressil"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Lähtekood on vabalt saadaval. Seega, isegi kui minuga midagi juhtub, ei ole sinu saadetud segmendid kadunud."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Uudised ja kuidas see on valmistatud"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Kust ma saan selle lähtekoodi?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Tiitrid"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Uus! Mine ühe klõpsuga video eesmärgi juurde uue \"esiletõstu\" kategooriaga"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Lisateave"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Annab vastuhääle ja loob kohaliku koopia, mida saad uuesti saata"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Ava selle kategooria vikileht."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopeeri ja anna vastuhääl"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Jätka hääletamist"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "See rakendub sinu segmentidele koheselt"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Kiireks aja reguleerimiseks keri hiirega muutmiskasti kohal. Täpsemaks reguleerimiseks hoia kerimise ajal all Ctrl või Shift klahvi."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Uus! Jäta täitesisu ja naljad vahele täitesisu kategooriaga. Luba valikutes"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "p",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "t",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,6 +182,9 @@
|
||||
"message": "کار شما",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "به نظر میرسد سرور زیر فشار است. چند ثانیهی دیگر دوباره امتحان کنید."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "کد خطا: "
|
||||
},
|
||||
@@ -191,6 +194,12 @@
|
||||
"mute": {
|
||||
"message": "بیصدا"
|
||||
},
|
||||
"minLower": {
|
||||
"message": "دقیقه"
|
||||
},
|
||||
"hourLower": {
|
||||
"message": "ساعت"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "ایجاد شده توسط"
|
||||
},
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Tämä piilottaa YouTuben soittimessa näkyvät, ohitettavien aikojen lähettämiseen käytetyt painikkeet."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Pidä \"Ohita kohtaan: Kohokohta\" -painike soittimessa"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Näytä info-painike YouTuben soittimessa"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Piilota info-painike YouTuben soittimessa"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Tämä on painike, joka avaa ponnahdusikkunan YouTube-sivulla."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Piilota info-painike automaattisesti"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Näytä poista-painike YouTuben soittimessa"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Tämä on YouTuben soittimen painike, joka poistaa kaikki kyseisen videon sponsorointikohdat, joita et ole vielä lähettänyt."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Ota ohitusten lukumäärän seuranta käyttöön"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Näytä lähetä-painike"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Tämä painike ilmestyy YouTube-soittimeen, kun olet valinnut aikaleiman ja olet valmis lähettämään sen."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock-palvelimen osoite"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Nopea kertaus aiemmista jaksoista, tai esikatselu siitä, mitä on tulossa myöhemmin nykyisessä videossa. Tarkoitettu yhteen editoituja klippejä varten, ei puhutuille yhteenvedoille."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Epäolennainen täytesisältö"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Täytesisältö"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musiikki: Musiikiton osa"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Virheellinen/väärä aika"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Väärä kategoria"
|
||||
"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."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Tekijät"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Uutta! Pääse videon asiaan yhdellä klikkauksella uudella kohokohta kategorialla"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Opi lisää"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Äänestää alas ja luo paikallisen kopion, jonka voit lähettää uudelleen"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Avaa tämän kategorian wiki-sivu."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopioi ja äänestä alas"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Jatka äänestystä"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Tämä vaikuttaa sinun segmentteihin 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."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Uutta! Ohita epäolennaiset kohdat ja vitsit täytesisältö kategorialla. Ota se käyttöön asetuksista"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "pv",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "t",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Cela permet de cacher du lecteur YouTube les boutons utilisés pour soumettre des segments commerciaux. Je peux \ncomprendre que certaines personnes les trouvent perturbants. Au lieu d'utiliser ces boutons, cette fenêtre peut être utilisée \npour soumettre des segments commerciaux. Pour cacher la notification, utilisez le bouton \"Ne plus montrer\" sur la notification. Vous pouvez toujours réactiver ces paramètres plus tard."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Conserver le bouton \"Aller au point essentiel\" sur le lecteur"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Montrer le bouton Info sur le lecteur YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Cacher le bouton Info sur le lecteur YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Il s'agit du bouton qui ouvre l'encart sur la page YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Masquer Automatiquement Le Button Info"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Montrer le bouton Supprimer sur le lecteur YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Il s'agit du bouton qui permet de supprimer tous les segments commerciaux depuis le lecteur YouTube."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Activer le suivi du nombre de sauts de segments"
|
||||
},
|
||||
@@ -309,7 +306,7 @@
|
||||
"message": "Passer {0} ?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Mute {0}?"
|
||||
"message": "Mettre en sourdine {0} ?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Passer à {0}?",
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Afficher le bouton de téléchargement"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Ce bouton apparaît sur le lecteur YouTube dès qu'un segment est prêt à être envoyé."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresse du serveur SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"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"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Remplissage"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musique : Segment non musical"
|
||||
},
|
||||
@@ -579,7 +582,7 @@
|
||||
"message": "Hors musique"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Surligner"
|
||||
"message": "Point essentiel"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "La partie de la vidéo que la plupart des gens veulent voir. Similaire à \"la vidéo commence à x mins\"."
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Segment de mauvaise qualité"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Mauvaise catégorie"
|
||||
"message": "Changer de catégorie"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Cette vidéo est catégorisée comme de la musique. Êtes-vous sûr qu'elle est sponsorisée? S'il s'agit en fait d'un \"Segment non musical\", allez dans les options de l'extension et activez cette catégorie. Ensuite, vous pourrez soumettre ce segment en tant que \"Segment non musical\" au lieu de sponsor. Lisez les instructions en cas de confusion."
|
||||
@@ -741,6 +744,9 @@
|
||||
"hideForever": {
|
||||
"message": "Cacher pour toujours"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Vous avez reçu un avertissement et ne pouvez pas soumettre de segments temporairement. Cela signifie que nous avons remarqué que vous commettiez des erreurs courantes qui ne sont pas malveillantes. Veuillez simplement confirmer que vous comprenez les règles et nous supprimerons l'avertissement. Vous pouvez également rejoindre cette discussion en utilisant discord.gg/SponsorBlock ou matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Le vote a été rejeté en raison d'un avertissement. Cliquez pour ouvrir un chat et y mettre fin , ou revenez plus tard lorsque vous avez le temps.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
@@ -808,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Crédits"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Nouveau! Aller à l'essentiel de la vidéo en un clic avec la nouvelle catégorie points essentiels"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "En savoir plus"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Voter contre et crée une copie locale pour la resoumettre"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Ouvrez la page wiki de cette catégorie."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Copier et voter contre"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Continuer à voter"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Cela s'appliquera instantanément à vos segments"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Nouveau ! Ignorer les digressions et les blagues avec la catégorie \"remplissage\". Activable dans les options"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "j",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,6 +152,10 @@
|
||||
"hideInfoButton": {
|
||||
"message": "החבא כפתור מידע בנגן YouTube"
|
||||
},
|
||||
"website": {
|
||||
"message": "אתר",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"sourceCode": {
|
||||
"message": "קוד מקור",
|
||||
"description": "Used on Firefox Store Page"
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "Preskoči opet"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Uključi zvuk"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Pauzirano"
|
||||
},
|
||||
@@ -79,6 +82,15 @@
|
||||
"sponsorEnd": {
|
||||
"message": "Isječak završava sada"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Otkaži Kreiranje Segmenta"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nijedan YouTube video nije pronađen.\nAko ovo nije točno, osvježite karticu."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Osvježi segmente"
|
||||
},
|
||||
"success": {
|
||||
"message": "Uspjeh!"
|
||||
},
|
||||
@@ -97,15 +109,33 @@
|
||||
"openPopup": {
|
||||
"message": "Otvori okvir SponsorBlock"
|
||||
},
|
||||
"closePopup": {
|
||||
"message": "Zatvori izbornik"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Podnesi isječke"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Jesi li siguran da želiš unijeti ovo?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Dopusti kanal"
|
||||
},
|
||||
"removeFromWhitelist": {
|
||||
"message": "Izbaci kanal iz bijele liste"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Glasaj za isječak"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Prijava"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Sačuvali ste ljude od"
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Ljestvica"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Pošalji"
|
||||
},
|
||||
@@ -113,21 +143,66 @@
|
||||
"message": "Uređivanje dijela prikazat će se nakon što pritisneš gumb za slanje",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Savjet: Možete namjestiti tipke za podnošenje u opcijama"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Očisti vremena"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Unesi vremena"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Ovo se koristi na stranici sa javnim statistikama da se pokaže koliko se pridonijeli. Pogledajte"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Korisničko ime"
|
||||
},
|
||||
"setUsername": {
|
||||
"message": "Postavi korisničko ime"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Kopiraj javni UserID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Pridružite nam se u službenoj Discord zajednici i pošaljite svoje prijedloge i povrate informacije!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Sakrijte ovo"
|
||||
},
|
||||
"Options": {
|
||||
"message": "Opcije"
|
||||
},
|
||||
"showButtons": {
|
||||
"message": "Prikaži gumbe na YouTube Playeru"
|
||||
},
|
||||
"hideButtons": {
|
||||
"message": "Sakrij gumbe na YouTube playeru"
|
||||
},
|
||||
"hideButtonsDescription": {
|
||||
"message": "Ovo skriva gumbe koji se pojavljuju na YouTube playeru za slanje odsječaka za preskakanje."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Zadržite gumb za preskakanje i označavanje na playeru"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Prikaži gumb za informacije na YouTube Playeru"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Sakrij gumb za informacije na YouTube Playeru"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Automatski sakrij info gumb"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Sakrij gumb za brisanje na YouTube playeru"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Pokaži gumb za brisanje na YouTube sviraču"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Omogući brojanje preskakanja"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Pokaži obavijest nakon preskakanja isječka"
|
||||
},
|
||||
@@ -139,6 +214,9 @@
|
||||
"message": "Izvorni kod",
|
||||
"description": "Used on Firefox Store Page"
|
||||
},
|
||||
"0": {
|
||||
"message": "Veza istekla. Provjerite svoju internetski vezu. Ako vaš internet radi, poslužitelj je vjerojatno preopterećen ili nedostupan."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Preskakanje je aktivirano"
|
||||
},
|
||||
@@ -149,6 +227,9 @@
|
||||
"message": "Tvoja slanja",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Čini se da je poslužitelj preopterećen. Pokušajte ponovno za nekoliko sekundi."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Kȏd greške: "
|
||||
},
|
||||
@@ -158,6 +239,17 @@
|
||||
"skip_category": {
|
||||
"message": "Preskočiti {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Utišati {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Preskočiti na {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Preskočeno na {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Deaktiviraj automatsko preskakanje"
|
||||
},
|
||||
@@ -176,6 +268,9 @@
|
||||
"hoursLower": {
|
||||
"message": "h"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "Provjerite status.sponsor.ajay.app za status poslužitelja."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Postavi UserID"
|
||||
},
|
||||
@@ -188,6 +283,9 @@
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". Trenutno je postavljeno na:"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Podržane stranice: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Omogući podržavanje Invidiousa, onemogući automatsko preskakanje, sakrij gumbe i drugo."
|
||||
},
|
||||
@@ -212,12 +310,24 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Isječci kraći od postavljene vrijednosti neće biti preskočeni ili prikazani u playeru."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Duljina trajanja obavijesti o preskakanju (sekunde):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Obavijest o preskakanju ostat će na zaslonu barem ovoliko dugo. Za ručno preskakanje može biti duže vidljivo."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresa SponsorBlock poslužitelja"
|
||||
},
|
||||
"save": {
|
||||
"message": "Spremi"
|
||||
},
|
||||
"reset": {
|
||||
"message": "Resetiraj"
|
||||
},
|
||||
"exportOptions": {
|
||||
"message": "Uvezi/Izvezi sve postavke"
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Postavi opcije"
|
||||
},
|
||||
@@ -236,15 +346,34 @@
|
||||
"preview": {
|
||||
"message": "Pregledaj"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "Neposlano"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "Provjeri"
|
||||
},
|
||||
"edit": {
|
||||
"message": "Uredi"
|
||||
},
|
||||
"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"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Sponzor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Plaćene promocije, plaćene preporuke i izravne reklame. Nije za samopromociju ili besplatno pozivanje na događaje/kreatore/web stranice/proizvode koji im se sviđaju."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Neplaćena promocija ili samopromocija"
|
||||
},
|
||||
@@ -269,6 +398,15 @@
|
||||
"category_outro": {
|
||||
"message": "Završni kadrovi/Zasluge"
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "Pregled/Sažetak"
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Popuna tangenti"
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Popuna"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Glazba: Ne-glazbeni dio"
|
||||
},
|
||||
@@ -278,12 +416,28 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Ne-glazbeni"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Istaknuto"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: čitanje donacija/poruka"
|
||||
},
|
||||
"category_livestream_messages_short": {
|
||||
"message": "Čitanje poruka"
|
||||
},
|
||||
"autoSkip": {
|
||||
"message": "Automatsko preskakanje"
|
||||
},
|
||||
"manualSkip": {
|
||||
"message": "Ručno preskakanje"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Dopustite isječke koji isključuju zvuk umjesto da ga preskaču"
|
||||
},
|
||||
"previewColor": {
|
||||
"message": "Boja neposlanog",
|
||||
"description": "Referring to submissions that have not been sent to the server yet."
|
||||
},
|
||||
"category": {
|
||||
"message": "Kategorija"
|
||||
},
|
||||
@@ -291,6 +445,9 @@
|
||||
"message": "Preskoči opciju",
|
||||
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
|
||||
},
|
||||
"enableTestingServer": {
|
||||
"message": "Omogućite poslužitelj za beta testiranje"
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(sada)"
|
||||
},
|
||||
@@ -300,6 +457,10 @@
|
||||
"chooseACategory": {
|
||||
"message": "Odaberi kategoriju"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Da biste poslali segmente s kategorijom \"{0}\", morate je omogućiti u postavkama. Sada ćete biti preusmjereni na postavke.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Moraš odabrati kategoriju za sve segmente koje šalješ!"
|
||||
},
|
||||
@@ -310,7 +471,7 @@
|
||||
"message": "Neispravno/krivo vrijeme"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Kriva kategorija"
|
||||
"message": "Promijenite kategoriju"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Ovaj je video kategoriziran kao glazba. Je li stvarno ima sponzora? Ako je ovo zapravo „Ne-glazbeni segment”, otvori opcije proširenja i aktiviraj ovu kategoriju. Zatim ovaj segment možeš posalti kao „Ne-glazbeni” umjesto sponzora. Pročitaj smjernice ako nešto nije jasno."
|
||||
@@ -330,5 +491,44 @@
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Otvori opcije za preskakanje uvoda, kraja, proizvoda itd."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Doniraj"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Hvala na instaliranju SponsorBlocka."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Slanje"
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Klikom na gumb za reprodukciju označava se početak segmenta, a klik na ikonu za zaustavljanje označava kraj. Možete pripremiti više sponzora prije nego što pritisnete \"Pošalji\". Klikom na gumb za slanje bit će poslano. Klikom na kantu za smeće izbrisat će se."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Uređivanje"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Ovo je presporo"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Gdje mogu pronaći izvorni kod?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Zasluge"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Saznajte više"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Otvorite wiki stranicu ove kategorije."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopiraj i glasaj protiv"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Nastavite glasati"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Ovo će se odmah primijeniti na vaše isječke"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"fullName": {
|
||||
"message": "SponorBlock YouTube-ra - Szponzorok átugrására",
|
||||
"message": "SponsorBlock YouTube-ra - Szponzorok átugrására",
|
||||
"description": "Name of the extension."
|
||||
},
|
||||
"Description": {
|
||||
@@ -11,7 +11,7 @@
|
||||
"message": "Szerver: Ez a kérés érvénytelen"
|
||||
},
|
||||
"429": {
|
||||
"message": "Túl sok szponzoridőt jelölt be ezen a videón. Biztos benne, hogy van ennyi?"
|
||||
"message": "Túl sok szponzoridőt jelöltél be ezen a videón. Biztosan van ennyi?"
|
||||
},
|
||||
"409": {
|
||||
"message": "Ez már korábban be lett küldve"
|
||||
@@ -23,7 +23,7 @@
|
||||
"message": "szegmens"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "szegmensek"
|
||||
"message": "szegmens"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Részlet felszavazása"
|
||||
@@ -44,7 +44,7 @@
|
||||
"message": "Ne mutassa többé"
|
||||
},
|
||||
"hitGoBack": {
|
||||
"message": "Kattintson a visszaugrásra, hogy visszakerüljön oda, ahonnan ugrott."
|
||||
"message": "Kattints a visszaugrásra, hogy visszakerülj oda, ahonnan ugrottál."
|
||||
},
|
||||
"unskip": {
|
||||
"message": "Visszaugrás"
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "Újra-átugrás"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Némítás feloldása"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Szüneteltetve"
|
||||
},
|
||||
@@ -59,13 +62,13 @@
|
||||
"message": "Időzítő megállítva"
|
||||
},
|
||||
"confirmMSG": {
|
||||
"message": "Ahhoz, hogy értékeket szerkesszen, vagy töröljön kattintson az info gombra, vagy nyissa meg a bővítmény felugró ablakát a bővítmény ikonjával a jobb felső sarokban."
|
||||
"message": "Az egyes értékek szerkesztéséhez vagy törléséhez kattints az info gombra, vagy nyisd meg a bővítmény felugró ablakát a bővítmény ikonjával a jobb felső sarokban."
|
||||
},
|
||||
"clearThis": {
|
||||
"message": "Biztosan törölni akarja?\n\n"
|
||||
"message": "Biztosan törölni szeretnéd?\n\n"
|
||||
},
|
||||
"Unknown": {
|
||||
"message": "Hiba történt a szponzoridők bejelentésekor. Kérjük, próbálja újra."
|
||||
"message": "Hiba történt a szponzoridők beküldésekor. Kérjük, próbáld újra később."
|
||||
},
|
||||
"sponsorFound": {
|
||||
"message": "Ennek a videónak már vannak szegmensei az adatbázisban!"
|
||||
@@ -80,7 +83,7 @@
|
||||
"message": "Szegmens vége"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "Szegmens Készítés Visszavonása"
|
||||
"message": "Szegmens készítés visszavonása"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "Nem találtunk YouTube videót.\nHa ez helytelen, frissítsd a lapot."
|
||||
@@ -92,13 +95,13 @@
|
||||
"message": "Siker!"
|
||||
},
|
||||
"voted": {
|
||||
"message": "Szavazott!"
|
||||
"message": "Szavaztál!"
|
||||
},
|
||||
"serverDown": {
|
||||
"message": "Úgy tűnik a szerver nem működik. Kérjük, mihamarabb értesítse a fejlesztőket."
|
||||
"message": "Úgy tűnik, a szerver nem működik. Kérjük, mihamarabb értesítsd a fejlesztőket!"
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Kapcsolódási probléma merült fel. Error kód: "
|
||||
"message": "Kapcsolódási probléma merült fel. Hibakód: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Szegmensek törlése"
|
||||
@@ -110,10 +113,10 @@
|
||||
"message": "Felugró ablak bezárása"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Szegmens beküldése"
|
||||
"message": "Szegmensek beküldése"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Biztosan be akarja küldeni?"
|
||||
"message": "Biztosan be akarod küldeni?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Csatorna fehérlistára tétele"
|
||||
@@ -128,29 +131,29 @@
|
||||
"message": "Beküldések"
|
||||
},
|
||||
"savedPeopleFrom": {
|
||||
"message": "Megspóroltál másoknak "
|
||||
"message": "Megspóroltál másoknak: "
|
||||
},
|
||||
"viewLeaderboard": {
|
||||
"message": "Ranglista"
|
||||
},
|
||||
"recordTimesDescription": {
|
||||
"message": "Küldés"
|
||||
"message": "Beküldés"
|
||||
},
|
||||
"submissionEditHint": {
|
||||
"message": "A szegmens szerkesztés azután fog megjelenni miután a közzétételre kattintasz",
|
||||
"message": "A szegmens szerkesztés azután fog megjelenni, hogy a beküldésre kattintasz",
|
||||
"description": "Appears in the popup to inform them that editing has been moved to the video player."
|
||||
},
|
||||
"popupHint": {
|
||||
"message": "Tipp: A beállításokban készíthetsz gyorsbillentyűket a közzétetelhez"
|
||||
"message": "Tipp: A beállításokban megadhatsz gyorsbillentyűket a beküldéshez"
|
||||
},
|
||||
"clearTimesButton": {
|
||||
"message": "Időpontok törlése"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Időpontok megadása"
|
||||
"message": "Időpontok beküldése"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Ezt használja a nyilvános ranglistán, hogy megmutassa mennyit járult hozzá. Nézze meg"
|
||||
"message": "Ez a nyilvános ranglistán használatos, ami mutatja, mennyit segítettél. Nézd meg"
|
||||
},
|
||||
"Username": {
|
||||
"message": "Felhasználónév"
|
||||
@@ -158,8 +161,11 @@
|
||||
"setUsername": {
|
||||
"message": "Felhasználónév megadása"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Nyilvános UserID másolása"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Csatlakozzon a hivatalos discord szerverhez, hogy javaslatokat és visszajelzést adhasson!"
|
||||
"message": "Gyere, csatlakozz a hivatalos discord szerverhez, hogy javaslatokat és visszajelzést adhass!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Elrejtés"
|
||||
@@ -176,17 +182,17 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Ez elrejti az átugrandó szegmensek megjelöléséhez használt gombokat a YouTube lejátszón."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Kiemeléshez ugrás gomb maradjon a lejátszón"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Info gomb mutatása a YouTube lejátszón"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Info gomb elrejtése a YouTube lejátszón"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Ez a gomb felhoz egy felugró dobozt a YouTube oldalon."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Automatikus elrejtése az Információ Gombnak"
|
||||
"message": "Info gomb automatikus elrejtése"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Törlés gomb elrejtése a YouTube lejátszón"
|
||||
@@ -194,14 +200,14 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Törlés gomb mutatása a YouTube lejátszón"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Ez egy gomb a lejátszón, ami törli az összes beküldetlen szegmensét a jelenlegi videón."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Átugrás-számláló követés bekapcsolása"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "Ez a funkció követi, mely szegmenseket ugrotta át, hogy más felhasználók megtudhassák mennyit segítettek a bejelentéseik és a szavazatokkal együtt egy mértékegységként van használva, hogy ne kerülhessen spam az adatbázisba. A bővítmény küld egy üzenetet a szervernek, minden alkalommal, mikor átugrik egy szegmenst. Remélhetőleg nem sokan állítják át ezt a beállítást, hogy a számok pontosak maradhassanak. :)"
|
||||
"message": "Ez a funkció követi, mely szegmenseket ugrottad át, hogy a felhasználók megtudhassák mennyit segítettek a bejelentéseik, és a szavazatokkal együtt egy mértékegységként van használva, hogy ne kerülhessen szemét az adatbázisba. A bővítmény küld egy üzenetet a szervernek, minden alkalommal, mikor átugrasz egy szegmenst. Remélhetőleg nem sokan állítják át ezt a beállítást, hogy a számok pontosak maradhassanak. :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "Átugrások számlálásának engedélyezése privát/inkognitó füleken"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Lekérdezés Hash előtaggal"
|
||||
@@ -213,7 +219,7 @@
|
||||
"message": "Szegmensek újrakeresése új videókon"
|
||||
},
|
||||
"whatRefetchWhenNotFound": {
|
||||
"message": "Ha a videó új, és még nem találhatóak szegmensek, a bővítmény pár percenkét újra keresi őket, miközben nézi."
|
||||
"message": "Ha a videó új, és még nem találhatóak szegmensek, a bővítmény pár percenkét újra keresi őket, miközben nézed."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Értesítés megjelenítése ismét"
|
||||
@@ -221,8 +227,23 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Jelezzen, ha egy szegmens át lett ugorva"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Teljes méretű átugrási értesítők"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Kis méretű átugrási értesítők Auto átugrás esetén"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Csak kis méretű átugrási értesítők"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Halvány átugrási értesítők Auto átugrás esetén"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Csak halvány átugrási értesítők"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "A SponsorBlock-al átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé tesz bárkit arra, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Ha megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a zene videók nem-zene részei is átugorhatóak.",
|
||||
"message": "A SponsorBlockkal átugorhatja a szponzorokat, introkat, outrokat, feliratkozás emlékeztetőket és a YouTube videók többi idegesítő részeit. A SponsorBlock egy közösség által vezérelt böngészőbővítmény, ami lehetővé teszi bárkinek, hogy megjelölhesse egy szponzor vagy más szegmens kezdő és végpontjait. Amint valaki megosztja ezt az információt, mindenki más ennek a bővítménynek a birtokában egyenesen átugorja majd ezt a szponzorszegmenst. Emellett például a videóklipek nem-zene részei is átugorhatóak.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
},
|
||||
"website": {
|
||||
@@ -238,23 +259,26 @@
|
||||
"description": "The first line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"noticeUpdate2": {
|
||||
"message": "Ha még mindig nem tetszik, kattintson a ne mutassa többé gombra.",
|
||||
"message": "Ha még mindig nem tetszik, kattints a ne mutassa többé gombra.",
|
||||
"description": "The second line of the message displayed after the notice was upgraded."
|
||||
},
|
||||
"setSkipShortcut": {
|
||||
"message": "Billentyű beállítása szegmens átugráshoz"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "Billentyű beállítása a szegmens kezdéséhez/befejezéséhez"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "Billentyű beállítása a beküldés gombhoz"
|
||||
},
|
||||
"keybindDescription": {
|
||||
"message": "Válasszon billentyűt azzal, hogy lenyomja"
|
||||
"message": "Válassz egy billentyűt azzal, hogy lenyomod"
|
||||
},
|
||||
"keybindDescriptionComplete": {
|
||||
"message": "A funkció erre a billentyűre lett állítva: "
|
||||
},
|
||||
"0": {
|
||||
"message": "Kapcsolati időtúllépés. Ellenőrizze az internetkapcsolatot. Ha az internet működik, a kiszolgáló valószínűleg túlterhelt vagy leállt."
|
||||
"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."
|
||||
},
|
||||
"disableSkipping": {
|
||||
"message": "Átugrás bekapcsolva"
|
||||
@@ -267,7 +291,7 @@
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
"message": "Úgy tűnik, hogy a szerver túlterhelt. Néhány másodperc múlva próbálkozzon újra."
|
||||
"message": "Úgy tűnik, hogy a szerver túlterhelt. Próbálkozz újra néhány másodperc múlva."
|
||||
},
|
||||
"errorCode": {
|
||||
"message": "Hibakód: "
|
||||
@@ -275,9 +299,31 @@
|
||||
"skip": {
|
||||
"message": "Átugrás"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Némítás"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Átugorja ezt: {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "{0} némítása?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Ugrás ide: {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} átugorva",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} némítva",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Ide ugorva: {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Auto átugrás kikapcsolása"
|
||||
},
|
||||
@@ -288,7 +334,7 @@
|
||||
"message": "Hangjelzés átugráskor"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "A hangjelzés átugráskor lejátszik egy hangot minden alkalommal amikor átugrik egy szegmenst. Ha kikapcsolja (vagy az auto átugrás ki van kapcsolva) nem lesz hangjelzés lejátszva."
|
||||
"message": "A hangjelzés átugráskor lejátszik egy hangot minden alkalommal, amikor egy szegmens átugrásra kerül. Ha kikapcsolod (vagy az auto átugrás ki van kapcsolva), nem lesz hangjelzés lejátszva."
|
||||
},
|
||||
"showTimeWithSkips": {
|
||||
"message": "Idő megtekintése az átugrandók nélkül"
|
||||
@@ -297,10 +343,10 @@
|
||||
"message": "Ez az idő zárójelben jelenik meg az aktuális idő mellett a keresősáv alatt. Megmutatja a videó teljes időtartamát, levonva a szegmenseket. Beletartoznak a csak \"Megjelenítés a keresősávban\" jelöléssel ellátott szegmensek is."
|
||||
},
|
||||
"youHaveSkipped": {
|
||||
"message": "Átugrottál "
|
||||
"message": "Átugrottál: "
|
||||
},
|
||||
"youHaveSaved": {
|
||||
"message": "Megtakarított magának "
|
||||
"message": "Megtakarítottál magadnak: "
|
||||
},
|
||||
"minLower": {
|
||||
"message": "perc"
|
||||
@@ -321,16 +367,19 @@
|
||||
"message": " az életükből"
|
||||
},
|
||||
"statusReminder": {
|
||||
"message": "A szerver állapotához tekintse meg a status.sponsor.ajay.app oldalt."
|
||||
"message": "A szerver állapotához tekintsd meg a status.sponsor.ajay.app oldalt."
|
||||
},
|
||||
"changeUserID": {
|
||||
"message": "UserID importálása / exportálása"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Ez privát információnak minősül. Ez olyan, mint egy jelszó, így nem ajánlott megosztani senkivel. Ha valakinek birtokában van, megszemélyesíthet téged. Ha a nyilvános userID-dat keresed, kattints a vágólap ikonra a felugró ablakban."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "UserID beállítása"
|
||||
},
|
||||
"userIDChangeWarning": {
|
||||
"message": "Figyelem: A UserID megváltoztatása végleges. Biztosan szeretné megtenni? Minden esetben készítsen biztonsági másolatot a régiről."
|
||||
"message": "Figyelem: A UserID megváltoztatása végleges. Biztosan szeretnéd megtenni? Minden esetben készíts biztonsági másolatot a régiről!"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "Készítette"
|
||||
@@ -341,9 +390,22 @@
|
||||
"supportOtherSites": {
|
||||
"message": "Harmadik fél Youtube oldalainak támogatása"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Harmadik fél YouTube oldalainak támogatása. A támogatás bekapcsolásához el kell fogadnod az extra engedélyeket. NEM működik inkognitó módban Chrome-ban és egyéb Chromium változatokban.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Támogatott oldalak: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Invidious támogatás engedélyezése, autoátugrás kikapcsolása, gombok eltűntetése és több."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Harmadik fél kliens példányának hozzáadása"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Egyedi példány hozzáadása. Formátuma CSAK a domain legyen. Például: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Hozzáadás"
|
||||
},
|
||||
@@ -354,7 +416,7 @@
|
||||
"message": "Invidious példányok listájának visszaállítása"
|
||||
},
|
||||
"resetInvidiousInstanceAlert": {
|
||||
"message": "Épp visszaállítja az Invidious példányok listát"
|
||||
"message": "Az Invidious példányok listájának visszaállítására készülsz"
|
||||
},
|
||||
"currentInstances": {
|
||||
"message": "Jelenlegi példányok:"
|
||||
@@ -365,20 +427,23 @@
|
||||
"minDurationDescription": {
|
||||
"message": "A beállított értéknél rövidebb szegmenseket nem ugorja át és nem jeleníti meg a lejátszó."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Átugrási értesítés hossza (másodpercekben):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Az átugrási értesítés ennyi ideig marad a képernyőn. Manuális átugrásnál tovább is látható maradhat."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "A következő szegmens rövidebb, mint az Ön által beállított minimális időtartam. Ez azt jelentheti, hogy már beküldhették, csak emiatt az opció miatt Önnek figyelmen kívül marad. Biztosan beküldi?"
|
||||
"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?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Feltöltés gomb megjelenítése"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Ez a gomb a YouTube lejátszón jelenik meg, miután kiválasztott egy időtartamot és készen áll a beküldésre."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock szerver címe"
|
||||
},
|
||||
"customServerAddressDescription": {
|
||||
"message": "A SponsorBlock által használt cím a szerverre történő hívások kezdeményezésére szolgál.\nHacsak nincs saját szerverpéldánya, ezt nem szabad megváltoztatni."
|
||||
"message": "A SponsorBlock által használt cím a szerverre történő hívások kezdeményezésére szolgál.\nHacsak nincs saját szerverpéldányod, ezt nem szabad megváltoztatni."
|
||||
},
|
||||
"save": {
|
||||
"message": "Mentés"
|
||||
@@ -387,10 +452,10 @@
|
||||
"message": "Visszaállítás"
|
||||
},
|
||||
"customAddressError": {
|
||||
"message": "A cím helytelenül van formázva. Győződjön meg róla, hogy http:// vagy https:// van az elején, és nem fordított perjeleket használ."
|
||||
"message": "A cím helytelenül van formázva. Győződj meg róla, hogy http:// vagy https:// van az elején, és nincsenek perjelek a végén."
|
||||
},
|
||||
"areYouSureReset": {
|
||||
"message": "Biztosan vissza szeretné állítani?"
|
||||
"message": "Biztosan vissza szeretnéd állítani?"
|
||||
},
|
||||
"mobileUpdateInfo": {
|
||||
"message": "az m.youtube.com már támogatott"
|
||||
@@ -399,16 +464,16 @@
|
||||
"message": "Összes beállítás importálása / exportálása"
|
||||
},
|
||||
"whatExportOptions": {
|
||||
"message": "Ez az össze beállítása JSON-ban. Ebbe bele tartozik a userID-ja, szóval csak ésszel ossza meg."
|
||||
"message": "Ez az összes beállításod JSON formátumban. Ebbe bele tartozik a userID-d is, szóval csak ésszel oszd meg."
|
||||
},
|
||||
"setOptions": {
|
||||
"message": "Beállítások"
|
||||
"message": "Beállítások módosítása"
|
||||
},
|
||||
"exportOptionsWarning": {
|
||||
"message": "Figyelem: Az beállítások megváltoztatása végleges, és tönkreteheti a bővítményét. Biztosan meg szeretné tenni? Készítsen egy biztonsági mentést a régi beállításairól, biztos, ami biztos."
|
||||
"message": "Figyelem: A beállítások megváltoztatása végleges, és tönkreteheti a bővítményed. Biztosan meg szeretnéd tenni? Készíts egy biztonsági mentést a régi beállításaidról, biztos, ami biztos."
|
||||
},
|
||||
"incorrectlyFormattedOptions": {
|
||||
"message": "Ez a JSON helytelenül van formázva. A beállításai nem lettek megváltoztatva."
|
||||
"message": "Ez a JSON helytelenül van formázva. A beállításaid nem lettek megváltoztatva."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Szegmens beküldése"
|
||||
@@ -441,38 +506,38 @@
|
||||
"message": "Hiba a vágólapra másoláskor"
|
||||
},
|
||||
"copyDebugInformationOptions": {
|
||||
"message": "Információt másol a vágólapra, amit megadhat egy fejlesztőnek, ha bejelent egy hibát, vagy egy fejlesztő kéri öntől. Az érzékeny információkat, például a felhasználói azonosítót, az engedélyezőlistán szereplő csatornákat és az egyéni szerver címét eltávolítottuk. Azonban tartalmaz olyan információkat, mint a böngésző, az operációs rendszer és a bővítmény verziószáma. "
|
||||
"message": "Információt másol a vágólapra, amit megadhatsz egy fejlesztőnek, ha bejelentesz egy hibát, vagy egy fejlesztő kéri tőled. Az érzékeny információkat, például a userID-t, az engedélyezőlistán szereplő csatornákat és az egyéni szerver címét eltávolítottuk. Azonban tartalmaz olyan információkat, mint a böngésző, az operációs rendszer és a bővítmény verziószáma. "
|
||||
},
|
||||
"copyDebugInformationComplete": {
|
||||
"message": "A hibakeresési információ másolva lett a vágólapjára. Nyugodtan távolítson el belőle olyan információkat, amiket nem szívesen osztana meg. Mentse el szöveges fájlként, vagy másolja a hibajelentésbe."
|
||||
"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 billentyű"
|
||||
"message": "A(z)"
|
||||
},
|
||||
"keyAlreadyUsed": {
|
||||
"message": "már máshoz van állítva. Kérem, válasszon egy másik billentyűt."
|
||||
"message": "billentyű már máshoz van állítva. Kérlek, válassz egy másik billentyűt."
|
||||
},
|
||||
"to": {
|
||||
"message": "-tól eddig:",
|
||||
"message": "–",
|
||||
"description": "Used between segments. Example: 1:20 to 1:30"
|
||||
},
|
||||
"category_sponsor": {
|
||||
"message": "Szponzor"
|
||||
},
|
||||
"category_sponsor_description": {
|
||||
"message": "Fizetett promóció, vagy közvetlen reklám. Nem ön-promóció vagy ingyenes ajánlat (/shoutout) emberekről/termékekről/weboldalakról amik tetszenek nekik."
|
||||
"message": "Fizetett promóció, vagy közvetlen reklám. Nem önpromóció vagy ingyenes ajánlat (shoutout) emberekről/termékekről/weboldalakról amik tetszenek nekik."
|
||||
},
|
||||
"category_selfpromo": {
|
||||
"message": "Nem fizetett/ön-promóció"
|
||||
"message": "Nem fizetett/önpromóció"
|
||||
},
|
||||
"category_selfpromo_description": {
|
||||
"message": "Hasonló a szponzorhoz, de nem fizetett vagy ön-promóció. Beletartozik a saját ruhaáru, adományok, vagy infó arról hogy kivel működtek együtt."
|
||||
"message": "Hasonló a szponzorhoz, de nem fizetett, vagy önpromóció. Beletartozik a saját ruhaáru, adományok, vagy infó arról, hogy kivel működtek együtt."
|
||||
},
|
||||
"category_interaction": {
|
||||
"message": "Emlékeztető (Feliratkozás)"
|
||||
},
|
||||
"category_interaction_description": {
|
||||
"message": "Egy rövid emlékeztető arról, hogy likeoljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább a az ön-promóció alá tartozik."
|
||||
"message": "Egy rövid emlékeztető arról, hogy likeoljunk, iratkozzunk fel, vagy kövessük a tartalom közben. Ha hosszabb szakasz, vagy egy adott témáról van, inkább az önpromóció alá tartozik."
|
||||
},
|
||||
"category_interaction_short": {
|
||||
"message": "Emlékeztető"
|
||||
@@ -495,9 +560,24 @@
|
||||
"category_preview": {
|
||||
"message": "Előzetes/Ismétlés"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "Az előző részekben történtek rövid ismétlése, vagy a videó további tartalmának előzetese. Összevágott jelenetekhez, nem szóbeli összegzéshez."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Témától eltérő töltelék"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Töltelék"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Zene: nem-zene szegmens"
|
||||
},
|
||||
"category_music_offtopic_description": {
|
||||
"message": "Csak videóklipekhez. Ezt csak videóklipek olyan részeihez szabad használni, amiket nem fed le a többi kategória."
|
||||
},
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Nem-Zene"
|
||||
},
|
||||
@@ -525,9 +605,28 @@
|
||||
"disable": {
|
||||
"message": "Kikapcsol"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Auto ugrás a kezdetéhez"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Kérdezzen rá a videó betöltésekor"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Megjelenítés a keresősávban"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Minden szegmens automatikus átugrása, ha van nem-zene szegmens"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Szegmensek engedélyezése, amelyek lenémítják a hangot az átugrás helyett"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"seekBarColor": {
|
||||
"message": "Keresősáv színe"
|
||||
},
|
||||
@@ -542,10 +641,10 @@
|
||||
"message": "Bétateszt szerver bekapcsolása"
|
||||
},
|
||||
"whatEnableTestingServer": {
|
||||
"message": "A hozzájárulásai/szavazatai NEM FOGNAK SZÁMÍTANI a fő szerveren. Csak tesztelésre használja."
|
||||
"message": "A beküldéseid és szavazataid NEM FOGNAK SZÁMÍTANI a fő szerveren. Csak tesztelésre használd."
|
||||
},
|
||||
"testingServerWarning": {
|
||||
"message": "Az összes hozzájárulás/szavazat NEM FOG SZÁMÍTANI a fő szerverhez, amíg a tesztszerverhez kapcsolódik. Győződjön meg róla, hogy ki van kapcsolva, ha valódi hozzájárulásokat szeretne megosztani."
|
||||
"message": "Egyik beküldésed vagy szavazatod SEM FOG SZÁMÍTANI a fő szerverhez, amíg a tesztszerverhez kapcsolódsz. Győződj meg róla, hogy ki van kapcsolva, ha valódi beküldéseket akarsz végezni."
|
||||
},
|
||||
"bracketNow": {
|
||||
"message": "(Most)"
|
||||
@@ -554,10 +653,17 @@
|
||||
"message": "További kategóriák"
|
||||
},
|
||||
"chooseACategory": {
|
||||
"message": "Válasszon kategóriát"
|
||||
"message": "Válassz egy kategóriát"
|
||||
},
|
||||
"enableThisCategoryFirst": {
|
||||
"message": "Hogy \"{0}\" kategóriájú szegmenst küldhess be, először engedélyezned kell a beállításokban. Most átirányításra kerülsz a beállításokhoz.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Figyelem: Az ilyen típusú szegmensekből egyszerre csak egy lehet aktív. Több beküldése esetén véletlenszerűen az egyik fog megjelenni."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Minden szegmenshez kategóriát kell választania beküldés előtt!"
|
||||
"message": "Minden szegmenshez kategóriát kell választani beküldés előtt!"
|
||||
},
|
||||
"bracketEnd": {
|
||||
"message": "(Vége)"
|
||||
@@ -568,26 +674,45 @@
|
||||
"hiddenDueToDuration": {
|
||||
"message": "elrejtve: túl rövid"
|
||||
},
|
||||
"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:"
|
||||
},
|
||||
"videoInfoFetchFailed": {
|
||||
"message": "Úgy tűnik, valami korlátozza a SponsorBlock hozzáférését a videó adataihoz. További információkért látogass el ide: https://github.com/ajayyy/SponsorBlock/issues/741 (angol nyelvű)."
|
||||
},
|
||||
"youtubePermissionRequest": {
|
||||
"message": "Úgy tűnik, a SponsorBlock nem tud csatlakozni a YouTube API-hoz. A javításhoz fogadd el a megjelenő engedélykérést, várj néhány másodpercet, majd töltsd újra az oldalt."
|
||||
},
|
||||
"acceptPermission": {
|
||||
"message": "Engedély jóváhagyása"
|
||||
},
|
||||
"permissionRequestSuccess": {
|
||||
"message": "Engedélykérés sikeres!"
|
||||
},
|
||||
"permissionRequestFailed": {
|
||||
"message": "Engedélykérés sikertelen. Nem nyomtál az elutasításra?"
|
||||
},
|
||||
"adblockerIssueWhitelist": {
|
||||
"message": "Ha nem sikerül megoldani a problémát, kapcsold ki a \"Csatorna ellenőrzése átugrás előtt\" opciót, mert a SponsorBlock nem tudja megszerezni a csatorna-információkat ehhez a videóhoz"
|
||||
},
|
||||
"forceChannelCheck": {
|
||||
"message": "Csatorna ellenőrzése átugrás előtt"
|
||||
},
|
||||
"whatForceChannelCheck": {
|
||||
"message": "Alapértelmezett állapotban, a bővítmény átugorhat szegmenseket, mielőtt tudná melyik csatornán van. Alapból ezért, néhány szegmens, ami a videók legelején van, engedélyezett csatornákon is átugródhat. Ennek a bekapcsolásával ez elkerülhető, de minden átugrás előtt lesz egy kis késleltetés, hiszen a channelID megszerzéséhez elkell egy kis idő. Ez a késleltetés akár észrevehetetlen is lehet, ha elég gyors a kapcsolata."
|
||||
"message": "Alapértelmezett állapotban a bővítmény átugorhat szegmenseket, mielőtt tudná melyik csatornán van. Alapból ezért néhány videó eleji szegmens engedélyezett csatornákon is átugródhat. Ennek a bekapcsolásával ez elkerülhető, de minden átugrás előtt lesz egy kis késleltetés, hiszen a channelID megszerzéséhez kell egy kis idő. Ez a késleltetés akár észrevehetetlen is lehet, ha elég gyors a kapcsolatod."
|
||||
},
|
||||
"forceChannelCheckPopup": {
|
||||
"message": "Gondolja át a \"Csatorna ellenőrzése átugrás előtt\" bekapcsolását"
|
||||
"message": "Fontold meg a \"Csatorna ellenőrzése átugrás előtt\" bekapcsolását"
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Helytelen/rossz időzítés"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Hibás kategória"
|
||||
"message": "Kategória módosítása"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Ez a videó zeneként van kategorizálva. Biztos benne, hogy ennek van szponzora? Ha ez valójában egy \"nem-zene szegmens\", nyissa meg a bővítmény beállításait és kapcsolja be azt a kategóriát. Ezt követően elküldheti ezt a szegmenst \"nem-zene\"-ként szponzor helyett. Amennyiben nem érti, kérjük olvassa el az irányelveket."
|
||||
"message": "Ez a videó zeneként van kategorizálva. Biztos vagy benne, hogy ennek van szponzora? Ha ez valójában egy \"nem-zene szegmens\", nyisd meg a bővítmény beállításait és kapcsold be ezt a kategóriát. Ezt követően beküldheted a szegmenst \"nem-zene\"-ként szponzor helyett. Ha nem érthető, kérjük olvasd el az irányelveket."
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Több szegmens"
|
||||
@@ -596,14 +721,14 @@
|
||||
"message": "Irányelvek"
|
||||
},
|
||||
"readTheGuidelines": {
|
||||
"message": "Olvassa el az irányelveket!!",
|
||||
"message": "Olvasd el az irányelveket!!",
|
||||
"description": "Show the first time they submit or if they are \"high risk\""
|
||||
},
|
||||
"categoryUpdate1": {
|
||||
"message": "Itt vannak a kategóriák!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Nyissa meg a beállításokat, hogy átugorhasson introkat, outrokat stb."
|
||||
"message": "Nyisd meg a beállításokat, hogy átugorhass introkat, outrokat stb."
|
||||
},
|
||||
"help": {
|
||||
"message": "Segítség"
|
||||
@@ -612,28 +737,113 @@
|
||||
"message": "Értettem",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Minden további kísérlet elutasítása",
|
||||
"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": "Eltüntetés örökre"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Figyelmeztetést kaptál, és ideiglenesen nem tudsz szegmenseket beküldeni. Ez azt jelenti, hogy észrevettük, hogy néhány ártalmatlan gyakori hibát vétettél. Kérjük erősítsd meg, hogy megértetted a szabályokat és eltávolítjuk a figyelmeztetést. Ehhez a beszélgetéshez csatlakozhatsz a discord.gg/SponsorBlock vagy matrix.to/#/#sponsor:ajay.app címeken is."
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Szavazás visszautasítva figyelmeztetés miatt. Kattints, hogy megnyiss egy beszélgetést a tisztázásához, vagy gyere vissza később, amikor időd van rá.",
|
||||
"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": "Támogatás"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Támogatás link elrejtése"
|
||||
},
|
||||
"helpPageThanksForInstalling": {
|
||||
"message": "Köszönjük, hogy telepítetted a SponsorBlockot."
|
||||
},
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Kérjük, nézd át az alábbi beállításokat"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Sok funkció le van tiltva alapból. Ha át akarsz ugrani bevezetőket, záróképernyőket, Invidioust használnál, stb., engedélyezd őket alább. Lehetőség van a felület különböző elemeinek elrejtésére/megjelenítésére is."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Az átugrás működése"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "A videók szegmensei automatikusan átugrásra kerülnek, ha szerepelnek az adatbázisban. Megnyithatod a felugró ablakot a bővítmény ikonjára kattintva, hogy megtekinthesd őket."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Ahányszor átugrasz egy szegmenst, kapni fogsz egy értesítést. Ha rossznak tűnik az időzítés, szavazd le a leszavazás gombra kattintva! A felugró ablakban is szavazhatsz."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Küldés"
|
||||
"message": "Beküldés"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Beküldeni lehet a felugró ablakban a \"Szegmens eleje\" gombra kattintva, vagy a videó lejátszón lévő gombokkal."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "A lejátszás gomb megnyomása jelezte a szegmens kezdetét és a stop gomb megnyomása jelzi a végét. Több szponzort is előkészíthetsz, mielőtt a beküldésre nyomnál. A feltöltés gombra kattintva beküldésre kerülnek a szegmensek. A szemetesre kattintva kitörlődnek."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Szerkesztés"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Ha hibáztál, szerkesztheted vagy törölheted a szegmenseid, a felfele nyílra kattintást követően."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Ez túl lassú"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Vannak gyorsbillentyűk is, ha használni szeretnéd őket. Nyomd meg a pontosvessző billentyűt egy szponzor szegmens elejének/végének jelzéséhez és nyomd meg a vesszőt a beküldéshez. Ezek módosíthatók a beállításokban. Ha nem QWERTY-t használsz, valószínűleg szükséges lesz megváltoztatni a billentyűket."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Szerezhetek egy másolatot az adatbázisról? Mi történik, ha eltűnik a fejlesztő?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Az adatbázis nyilvános, és elérhető itt:"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "A forráskód szabadon elérhető. Tehát még ha valami történne is velem, a beküldések nem vesznek el."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Hírek és hogyan készül"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Hol szerezhetem meg a forráskódot?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Készítők"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Tudj meg többet"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Leszavazza és készít egy helyi másolatot, amit beküldhetsz"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "A kategória wiki lapjának megnyitása."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Másol és leszavaz"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Szavazás folytatása"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Ez azonnal érvényes lesz a szegmenseidre"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Használd egérgörgődet a szerkesztő mező fölött, hogy gyorsan módosíthasd az időt. A ctrl vagy shift billentyűk kombinációjával finomhangolhatod a változás mértékét."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Új! Ugorj át vicceket és a témához nem tartozó részeket a töltelék kategóriával. Engedélyezd a beállításokban"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "n",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "ó",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "Lewati Ulang"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "Batalkan bisu"
|
||||
},
|
||||
"paused": {
|
||||
"message": "Dijeda"
|
||||
},
|
||||
@@ -85,6 +88,9 @@
|
||||
"noVideoID": {
|
||||
"message": "Video YouTube tidak ditemukan.\nJika terjadi kesalahan, segarkan halaman."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "Perbarui segmen"
|
||||
},
|
||||
"success": {
|
||||
"message": "Sukses!"
|
||||
},
|
||||
@@ -155,6 +161,9 @@
|
||||
"setUsername": {
|
||||
"message": "Atur Nama Pengguna"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "Salin UserID Publik"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Gabung dengan server resmi discord untuk memberikan kritik dan saran!"
|
||||
},
|
||||
@@ -173,14 +182,17 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Ini akan menyembunyikan tombol yang muncul di pemutar YouTube untuk mengirimkan segmen yang dilewati."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Tetap lewati ke tombol Highlight di Pemutar"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Tampilkan Tombol Info Di Pemutar Video YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Sembunyikan Tombol Info Di Pemutar Video YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Ini adalah tombol yang membuka popup di halaman YouTube."
|
||||
"autoHideInfoButton": {
|
||||
"message": "Otomatis Sembunyikan Tombol Info"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Sembunyikan Tombol Hapus Di Pemutar Video YouTube"
|
||||
@@ -188,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Tampilkan Tombol Hapus Di Pemutar Video YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Ini adalah tombol di pemutar YouTube yang akan menghapus semua segmen yang belum dikirim pada video."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Aktifkan Pelacakan Jumlah Lewati"
|
||||
},
|
||||
@@ -201,7 +210,7 @@
|
||||
"message": "Aktifkan Pelacakan Jumlah Lewati Pada Tab Privat/Penyamaran"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "Query By Hash Prefix"
|
||||
"message": "Kueri dengan Hash Prefix"
|
||||
},
|
||||
"whatQueryByHashPrefix": {
|
||||
"message": "Daripada meminta segmen dari server menggunakan videoID, 4 huruf pertama dari hash dari videoID dikirim. Server akan mengirim kembali data untuk semua video dengan hash yang mirip."
|
||||
@@ -218,6 +227,21 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Tampilkan pemberitahuan setelah melewati segmen"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Lewati maklumat ukuran penuh"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Maklumat lewati kecil untuk lewati otomatis"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Lewati semua maklumat kecil"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Pudar maklumat lewati untuk semua lewati otomatis"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Lewati semua maklumat pudar"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock membuat anda melewati sponsor, intro, outro, pengingat berlangganan dan segmen mengganggu lainnya di video YouTube. SponsorBlock adalah ekstensi browser crowdsourced yang membolehkan siapa saja mengirim waktu awal dan akhir dari segmen sponsor dan segmen video YouTube lainnya. Setelah seseorang mengirim informasi ini, orang lain yang memakai ekstensi ini akan melewati segmen sponsor di video yang sama. Anda juga dapat melewati bagian non-musik di musik video.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -275,9 +299,15 @@
|
||||
"skip": {
|
||||
"message": "Lewati"
|
||||
},
|
||||
"mute": {
|
||||
"message": "Bisukan"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "Lewati {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Bisukan {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Lompat ke {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
@@ -286,6 +316,10 @@
|
||||
"message": "{0} dilewati",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} Dibisukan",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Melewati ke {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
@@ -338,6 +372,9 @@
|
||||
"changeUserID": {
|
||||
"message": "Impor/Ekspor UserID"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Ini harus dirahasiakan. Ini seperti kata sandi dan tidak boleh dibagikan kepada siapa pun. Jika seseorang mempunyai ini, mereka bisa menyamar jadi anda. Jika anda mencari UserID publik anda, klik ikon papan tulis di popup."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Atur UserID"
|
||||
},
|
||||
@@ -353,9 +390,22 @@
|
||||
"supportOtherSites": {
|
||||
"message": "Dukung Situs Youtube Pihak Ketiga"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "Dukung klien YouTube pihak ketiga. Untuk mengaktifkan dukungan, anda harus menerima izin tambahan. Ini tidak akan bekerja di Mode Samaran di Chrome dan varian Chromium lainnya.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "Situs yang didukung: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "Aktifkan dukungan Invidious, nonaktifkan lewati otomatis, tombol sembunyi dan lainnya."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "Tambah Instansi Klien Pihak Ketiga"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "Tambahkan instansi khusus. Ini harus diformat Hanya dengan domain. Contoh: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "Tambah"
|
||||
},
|
||||
@@ -377,15 +427,18 @@
|
||||
"minDurationDescription": {
|
||||
"message": "Segmen yang lebih kecil dari nilai yang diatur tidak akan dilewati atau tampil di pemutar."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "Lewati maklumat berdurasi (detik):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "Maklumat lewati akan tetap di layar setidaknya selama ini. Untuk lewati manual, mungkin akan terlihat lebih lama."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "Submisi ini lebih pendek dari opsi durasi minimalmu. Ini dapat berarti ini sudah dikirim, dan hanya akan diabaikan karena opsi ini. Apakah anda yakin ingin mengirim?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "Tampilkan Tombol Unggah"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Tombol ini muncul di pemutar video YouTube setelah anda memilih stempel waktu dan siap untuk dikirimkan."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Alamat Server SponsorBlock"
|
||||
},
|
||||
@@ -510,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Rekapan singkat dari episode sebelumnya, atau pratinjau tentang apa yang akan terjadi nanti di video. Dimaksudkan untuk klip bersama yang di edit, bukan ringkasan yang diucapkan."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Pengisi Tangensial"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Isian"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musik: Bagian Non-Musik"
|
||||
},
|
||||
@@ -519,6 +581,12 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "Non-Musik"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "Sorotan"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Bagian video yang banyak orang lihat. Sama untuk komentar \"Video dimulai di x\"."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Livestream: Baca Pesan/Donasi"
|
||||
},
|
||||
@@ -537,6 +605,9 @@
|
||||
"disable": {
|
||||
"message": "Nonaktif"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Otomatis lewati ke awal"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Tanya saat video dimuat"
|
||||
},
|
||||
@@ -546,6 +617,9 @@
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Lewati semua segmen secara otomatis ketika ada segmen non-music"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "Perbolehkan segmen untuk bisu daripada melewati"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "Warna anda tidak diformat dengan benar. Harusnya terdiri dari 3 atau 6 digit kode heksa dengan tagar di awal."
|
||||
},
|
||||
@@ -585,6 +659,9 @@
|
||||
"message": "Untuk mengirimkan segmen dengan kategori \"{0}\", Anda harus mengaktifkannya di opsi. Anda akan diarahkan ke opsi sekarang.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Perhatian: Tipe segmen ini hanya bisa maksimum aktif satu kali. Mengirimkan beberapa dapat mengakibatkan muncul pada kondisi acak."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Anda harus memilih kategori untuk semua segmen yang anda kirimkan!"
|
||||
},
|
||||
@@ -632,7 +709,7 @@
|
||||
"message": "Salah, Waktu Tidak Tepat"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Salah Kategori"
|
||||
"message": "Ubah Kategori"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Video ini dikategorikan sebagai musik. Apakah anda yakin ini berisi sponsor? Jika ini ternyata adalah \"Segmen non-musik\", buka pengaturan ekstensi dan aktifkan kategorinya. Lalu, anda bisa mengirim segmen ini sebagai \"Non-musik\" bukannya sponsor. Harap membaca panduan jika anda kebingungan."
|
||||
@@ -660,9 +737,20 @@
|
||||
"message": "Mengerti",
|
||||
"description": "Used as the button to dismiss a tooltip"
|
||||
},
|
||||
"experiementOptOut": {
|
||||
"message": "Tidak ikut eksperimen masa depan",
|
||||
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
|
||||
},
|
||||
"hideForever": {
|
||||
"message": "Sembunyikan selamanya"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Anda mendapatkan peringatan dan tidak bisa mengirim segmen sementara. Ini dikarenakan kami melihat kamu melakukan beberapa kesalahan yang umum, mohon konfirmasi bahwa kamu mengerti perundangan dan kami akan hapus peringatan. Kamu bisa bergabung ke obrolan menggunakan discord.gg/SponsorBlock atau matrix.io/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Suara ditolak karena peringatan. Klik untuk buka obrolan untuk menyelesaikannya, atau kembali beberapa saat lagi ketika ada waktu.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Donasi"
|
||||
},
|
||||
@@ -675,7 +763,79 @@
|
||||
"helpPageReviewOptions": {
|
||||
"message": "Haram ditinjau opsi di bawah ini"
|
||||
},
|
||||
"helpPageFeatureDisclaimer": {
|
||||
"message": "Banyak fitur yang dinonaktifkan secara bawaan. Jika kamu ingin lewati mula, akhir, gunakan Invidious, dll, aktifkan mereka dibawah ini.\nKamu bisa menyembunyikan/menghadirkan elemen UI."
|
||||
},
|
||||
"helpPageHowSkippingWorks": {
|
||||
"message": "Cara kerja melewati segmen"
|
||||
},
|
||||
"helpPageHowSkippingWorks1": {
|
||||
"message": "Segmen video akan otomatis dilewati jika ditemukan di databasis. Kamu bisa buka munculan dengan klik ikon ekstensi untuk mendapatkan pratinjau apa adanya."
|
||||
},
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Kapanpun kamu melewati segmen, kamu akan mendapatkan maklumat. Jika waktu terlihat salah dapat menyuarakan turun dengan klik turun-suara! Kamu juga bisa menyuarakan di maklumat."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Mengirim"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Mengirim bisa baik dilakukan di maklumat dengan menekan tombol \"Mulai Segmen Sekarang\" atau di pemutar video dengan tombol di pemutar."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Klik tombol putar indikasikan memulai segmen dan klik tombol ikon stop indikasikan mengakhiri. Kamu bisa persiapkan beberapa sponsor sebelum menekan kirim. Klik tombol unggah akan mengirimkan. Klik tombol sampah akan menghapuskan."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Sunting"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Jika kamu mengacaukan, kamu bisa sunting atau hapus segmen setelah klik tombol panah atas."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Ini terlalu lambat"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Terdapat tombol pintas jika kamu ingin menggunakannya. Tekan tombol semikolon untuk indikasi mulai/akhir segmen sponsor dan tekan tombol kutip untuk mengirimkan. Ini bisa diganti di opsi. Jika kamu tidak menggunakan QWERTY, kamu dimungkinkan harus mengubah tombol."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Bisakah saya mendapatkan salinan Databasis? Apa yang terjadi jika kamu tiada?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Databasis adalah publik dan tersedia di"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Sumber kode tersedia secara bebas. Jadi, jika sesuatu terjadi pada saya, pengajuan kamu tidak akan hilang."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Berita dan bagaimana ini diciptakan"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Dimana saya mendapatkankan sumber kode?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Kredit"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Pelajari Lebih Lanjut"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Menurunkan suara dan membuat salinan lokal untuk Anda kirim ulang"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Membuka halaman wiki kategori ini."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Salin dan berikan turunkan suara"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Lanjutkan Memvoting"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Ini akan menerapkan ke segmen Anda"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Baru! Lewati tangen dan lelucon dengan kategori pengisi. Aktifkan dalam opsi"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Nasconde i pulsanti che appaiono sul video per inviare i segmenti da nascondere."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Mantieni Salta Per Evidenziare il Pulsante Sul Lettore"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostra il pulsante delle informazioni sopra al video"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Nascondi il pulsante d'informazioni sopra al video"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Questo è il pulsante che apre un popup nella pagina YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Nascondi in automatico il Pulsante di Informazioni"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Mostra il pulsante elimina"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Questo è il pulsante che ti permette di cancellare tutti i segmenti non inviati del video attuale."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Attiva il conteggio dei salti"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Mostra Pulsante di Caricamento"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Questo pulsante appare sul riproduttore di YouTube dopo che hai selezionato un marcatore temporale e sei pronto ad inviarlo."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Indirizzo Server SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Riepilogo rapido degli episodi precedenti, o un'anteprima di ciò che sta arrivando più tardi nel video attuale. Inteso per clip, non per riassunti a voce."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Tangente di Riempimento"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Riempimento"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musica: Sezione Non-Musicale"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Tempo Non Corretto/Errato"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Categoria Errata"
|
||||
"message": "Cambia Categoria"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Questo video è classificato come musica. Sei sicuro che questo video contenga uno sponsor? Se questo è in realtà un \"Segmento Non-Musica\", apri le opzioni di questa estensione e abilita questa categoria. Quindi, è possibile inviare questo segmento come \"Non-Music\" invece di sponsor. Si prega di leggere la guida se si è confusi."
|
||||
@@ -741,6 +744,9 @@
|
||||
"hideForever": {
|
||||
"message": "Nascondi per sempre"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Hai ricevuto un avviso e non puoi inviare temporaneamente i segmenti. Questo significa che abbiamo notato che stavi commettendo degli errori comuni, non malevoli; sei pregato di confermare di comprendere le regole e rimuoveremo l'avviso. Puoi anche unirti a questa chat usando discord.gg/SponsorBlock o matrix.to/#/#sponsor:ajay.app"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Voto rifiutato a causa di un ammonimento. Clicca per aprire una chat per risolverlo, oppure torna dopo quando hai tempo.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
@@ -808,10 +814,28 @@
|
||||
"Credits": {
|
||||
"message": "Crediti"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novità! Vai al punto del video con un click con la nuova categoria d'evidenziazione"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Scopri di Più"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Vota negativamente e crea una copia locale per reinviare"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Apri la pagina della wiki di questa categoria."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Copia e vota negativamente"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Continua a Votare"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Questo si applicherà istantaneamente ai tuoi segmenti"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Usa la rotellina del mouse passando sulla casella di modifica per regolare rapidamente il tempo. Le combinazioni dei tasti ctrl o shift sono utilizzabili per perfezionare le modifiche."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Novità! Salta battute e tergiversazioni con il riempitivo. Attivala nelle opzioni"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "再スキップ"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "ミュート解除"
|
||||
},
|
||||
"paused": {
|
||||
"message": "一時停止中"
|
||||
},
|
||||
@@ -80,13 +83,13 @@
|
||||
"message": "セグメント終了を記録"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "区間の作成を取り止める"
|
||||
"message": "セグメントの作成を取り消す"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube動画が見つかりませんでした。\nこれが正しくない場合は、タブを再読み込みしてください。"
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "区域を更新"
|
||||
"message": "セグメントを更新"
|
||||
},
|
||||
"success": {
|
||||
"message": "成功しました!"
|
||||
@@ -158,6 +161,9 @@
|
||||
"setUsername": {
|
||||
"message": "ユーザー名を設定"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "パブリックユーザIDをコピー"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "公式Discordサーバーに参加して意見やフィードバックをお寄せください!"
|
||||
},
|
||||
@@ -176,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "YouTube再生画面のセグメント提出ボタンを非表示にします。"
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "プレイヤーの「ハイライトまでスキップ」ボタン表示を維持する"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTubeプレーヤーの情報ボタンを表示する"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTubeプレーヤーの情報ボタンを隠す"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "これはYouTubeのページ上でポップアップを開くためのボタンです。"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "情報ボタンを自動的に隠す"
|
||||
},
|
||||
@@ -194,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "YouTubeプレーヤーに削除ボタンを表示"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "これはYouTubeプレーヤー上のボタンで、現在の動画から未提出のセグメントを全て消去します。"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "スキップ回数の統計を有効にする"
|
||||
},
|
||||
@@ -225,19 +228,19 @@
|
||||
"message": "セグメントがスキップされた後に通知を表示する"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "飛び越し通知(全体)"
|
||||
"message": "標準サイズのスキップ通知"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "自動飛び越し通知(小)"
|
||||
"message": "自動スキップ通知を小型化"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "すべての飛び越し通知(小)"
|
||||
"message": "すべてのスキップ通知を小型化"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "表示の終了した自動飛び越し通知"
|
||||
"message": "自動スキップ通知を透過"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "表示の終了した全ての飛び越し通知"
|
||||
"message": "すべてのスキップ通知を透過"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlockはスポンサー、イントロ、アウトロ、チャンネル登録のお願いなど、YouTube動画の煩わしい部分をスキップします。SponsorBlockはYouTube動画のスポンサー付きセグメントなどの開始時間と終了時間を誰でも投稿できる、クラウドソースのブラウザ拡張機能です。一人がセグメントの情報を送信すると、この拡張機能を使用している他の全員が、スポンサー付きセグメントをスキップできるようになります。また、ミュージックビデオの音楽がない部分をスキップすることもできます。",
|
||||
@@ -296,9 +299,15 @@
|
||||
"skip": {
|
||||
"message": "スキップ"
|
||||
},
|
||||
"mute": {
|
||||
"message": "ミュート"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "{0} をスキップしますか?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "{0} をミュートしますか?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "{0}まで飛び越しますか?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
@@ -307,6 +316,10 @@
|
||||
"message": "{0}を飛び越しました",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} ミュート済み",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0}まで飛び越しました",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
@@ -359,6 +372,9 @@
|
||||
"changeUserID": {
|
||||
"message": "ユーザーIDのインポート/エクスポート"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "この情報を誰にも開示しないでください。これはパスワードのように、誰とも共有するべきではありません。 誰かがこれを持っている場合、あなたになりすますことができます。パブリックユーザーIDを探している場合は、ポップアップのクリップボードアイコンをクリックしてください。"
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "ユーザーIDを設定"
|
||||
},
|
||||
@@ -423,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "アップロードボタンを表示"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "このボタンはタイムスタンプを選択して投稿の準備ができた後にYouTubeプレーヤーに表示されます。"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock サーバーアドレス"
|
||||
},
|
||||
@@ -550,6 +563,12 @@
|
||||
"category_preview_description": {
|
||||
"message": "前回の粗筋,または動画の後半内容の予告。音声による要約ではなく,編集された映像を指します。"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "脱線したシーンには、動画の主な内容を理解するのに必要がない穴埋めやユーモアのみを追加してください。これには、文脈や背景の詳細を提供するセグメントを含めないでください。"
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "フィラー"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "音楽: 音楽以外のセクション"
|
||||
},
|
||||
@@ -560,10 +579,10 @@
|
||||
"message": "音楽以外の部分"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "強調表示"
|
||||
"message": "ハイライト"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "ほとんどの人が必要としている動画の箇所。「xx:xx 開始」というようなコメントと類似。"
|
||||
"message": "多くの人が求めている動画の部分。「動画はXからスタート」のようなコメントです。"
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "ライブ配信: 寄付/メッセージの読み上げ"
|
||||
@@ -584,7 +603,7 @@
|
||||
"message": "無効"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "動画の開始時刻まで飛び越し"
|
||||
"message": "冒頭へ自動スキップ"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "動画を読み込んだ際に確認する"
|
||||
@@ -595,6 +614,9 @@
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "非音楽区域がある場合,全区域を自動的に飛び越す"
|
||||
},
|
||||
"muteSegments": {
|
||||
"message": "スキップする代わりに音声をミュートしてセグメントを許可"
|
||||
},
|
||||
"colorFormatIncorrect": {
|
||||
"message": "カラーコードの書式が間違っています。 #から始まる3桁または6桁の16進数コードでなければなりません。"
|
||||
},
|
||||
@@ -634,6 +656,9 @@
|
||||
"message": "\"{0}\" のカテゴリでセグメントを送信するには、オプションでセグメントを有効にする必要があります。オプション画面にリダイレクトします。",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "警告: このタイプのセグメントは一度に最大一つだけ有効にすることができます。複数送信するとランダムなものが表示されます。"
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "送信するすべてのセグメントにカテゴリを選択する必要があります!"
|
||||
},
|
||||
@@ -681,7 +706,7 @@
|
||||
"message": "不正確あるいは間違った時刻です"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "カテゴリが違います"
|
||||
"message": "カテゴリーを変更してください"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "この動画は音楽として分類されています。本当にこの動画にスポンサー部分がありますか? 本セグメントが本当に「音楽以外の区域」だった場合は、設定画面からこの分類を有効にしてください。その後、「スポンサー部分」の代わりに「音楽以外のセグメント」としてセグメントを提出できます。よく分からない場合は、ガイドラインを参照してください。"
|
||||
@@ -716,6 +741,9 @@
|
||||
"hideForever": {
|
||||
"message": "二度と表示しない"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "警告のためにあなたは一時的にセグメントを提出することができなくなりました。これはあなたが悪意のない一般的なミスを犯していることに私たちが気づいた事を意味します、ルールを理解していることを確認していただければこの警告を解除します。discord.gg/SponsorBlock または matrix.to/#/#sponsor:ajay.app を使ってこのチャットに参加することもできます。"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "警告により投票が拒否されました。クリックして運営に連絡するか,少し時間を置いてからやりなおしてください。",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
@@ -747,9 +775,30 @@
|
||||
"Submitting": {
|
||||
"message": "提出中"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "提出するにはポップアップの「セグメント開始を記録」ボタン、またはビデオプレーヤー内にあるボタンを押してください。"
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "再生ボタンをクリックするとセグメントの開始、停止アイコンをクリックすると終了となります。 複数のスポンサーを用意してから送信ボタンを押すことができます。アップロードボタンをクリックすると提出されます。ゴミ箱をクリックすると削除されます。"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "編集中"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "もし失敗しても、上矢印ボタンをクリックすれば、セグメントを編集・削除することができます。"
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "遅すぎます"
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "利用可能なホットキーがあります。セミコロンキーを押してスポンサーセグメントの開始/終了を示し、アポストロフィキーを押して送信します。これらはオプションで変更できます。QWERTYを使わない場合は、キーバインドを変更したほうがいいでしょう。"
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "データベースのコピーを取得できますか? あなたがいなくなった場合はどうなりますか?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "データベースは公開されており、次の場所で利用できます:"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "ソースコードは自由に利用できます。運営になにがあろうとも,あなたの貢献(提出された区域)が失われることはありません。"
|
||||
},
|
||||
@@ -764,5 +813,23 @@
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "さらに詳しく"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "反対票を投じ、再提出するためにローカルコピーを作成します。"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "このカテゴリーのWikiページを開きます。"
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "コピーして反対票を投じる"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "投票を続ける"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "この変更は即座にあなたのセグメントに適用されます"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "編集ボックスにカーソルを合わせながらマウスホイールを使用すると、時間をすばやく調整できます。 CtrlキーまたはShiftキーの組み合わせを使用して変更を微調整できます。"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "스킵할 구간을 제출하기 위해 YouTube 플레이어에 나타나는 버튼을 숨깁니다"
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "플레이어에 하이라이트로 건너뛰기 버튼 표시"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTube 플레이어에서 정보 버튼 표시하기"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTube 플레이어에서 정보 버튼 숨기기"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "YouTube 페이지에 팝업으로 표시되는 버튼입니다"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "정보 버튼 자동 숨김"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube 플레이어에서 삭제 버튼 표시하기"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "현재 영상에 제출되지 않은 구간을 YouTube 플레이어 내에서 지우는 버튼입니다"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "스킵 개수 추적 활성화"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "업로드 버튼 표시"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "이 버튼은 타임 스탬프를 설정 후 제출 준비가 되었을 때 YouTube 플레이어에 나타납니다."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock 서버 주소"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "이전 에피소드를 간략히 요약하거나 현재 동영상에서 나중에 나올 내용을 예고해줍니다. 음성 요약이 아니라 편집된 동영상을 통한 요약입니다."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "쓸데없는 잡담"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "쓸데없는 잡담은 동영상의 주요 콘텐츠를 이해하는 데 필요없는 시간 떼우기 장면이나 농담만을 말합니다. 맥락이나 상세한 배경지식을 설명하는 부분은 해당하지 않습니다."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "잡담"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "음악이 아닌 구간"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "잘못된 타이밍입니다"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "잘못된 카테고리입니다"
|
||||
"message": "카테고리 변경"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "이 영상은 음악 영상으로 분류됩니다. 정말로 스폰서가 있는 것이 확실한가요? 만약 음악 이외의 구간인 경우, 확장 옵션을 열어 이 카테고리를 활성화 하세요. 그리고, 이 구간을 스폰서 대신 음악이 아닌 구간으로 제출하세요. 헷갈릴 경우 가이드라인을 읽으세요."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "크레딧"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "새 기능! 새로운 하이라이트 카테고리를 통해 동영상의 중요 지점으로 이동하세요"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "더보기"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "비추천에 투표한 뒤 다시 제출할 수 있도록 미제출 사본을 생성합니다"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "해당 카테고리의 위키 페이지를 엽니다."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "복사 및 비추천"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "계속 투표"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "당신의 구간에 즉시 적용될 것입니다"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "편집 상자 위에 커서를 올린 채 스크롤하면 시간을 빠르게 조정할 수 있습니다. Ctrl이나 Shift 키를 누른 채로 스크롤하면 세밀한 조정이 가능합니다."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "새 기능! 쓸데없는 말이나 농담 구간을 잡담 카테고리로 건너 뛰세요. 설정에서 활성화하세요"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "일",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "시간",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,18 +176,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "YouTube പ്ലെയറിൽ വിവര ബട്ടൺ മറയ്ക്കുക"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "YouTube പേജിൽ ഒരു പോപ്പ്അപ്പ് തുറക്കുന്ന ബട്ടണാണിത്."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ മറയ്ക്കുക"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ കാണിക്കുക"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "നിലവിലെ വീഡിയോയ്ക്കായി നിങ്ങൾ സമർപ്പിക്കാത്ത എല്ലാ സെഗ്മെന്റുകളും മായ്ക്കുന്ന YouTube പ്ലെയറിലെ ബട്ടൺ ഇതാണ്."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "ക Count ണ്ട് ട്രാക്കിംഗ് ഒഴിവാക്കുക പ്രാപ്തമാക്കുക"
|
||||
},
|
||||
@@ -359,9 +353,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "അപ്ലോഡ് ബട്ടൺ കാണിക്കുക"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "നിങ്ങൾ ഒരു ടൈംസ്റ്റാമ്പ് തിരഞ്ഞെടുത്ത് സമർപ്പിക്കാൻ തയ്യാറായ ശേഷം ഈ ബട്ടൺ YouTube പ്ലെയറിൽ ദൃശ്യമാകും."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "സ്പോൺസർബ്ലോക്ക് സെർവർ വിലാസം"
|
||||
},
|
||||
@@ -563,9 +554,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "തെറ്റായ / തെറ്റായ സമയം"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "തെറ്റായ വിഭാഗം"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "ഈ വീഡിയോയെ സംഗീതമായി വർഗ്ഗീകരിച്ചിരിക്കുന്നു. ഇതിന് ഒരു സ്പോൺസർ ഉണ്ടെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് യഥാർത്ഥത്തിൽ \"സംഗീതേതര വിഭാഗമാണ്\" എങ്കിൽ, വിപുലീകരണ ഓപ്ഷനുകൾ തുറന്ന് ഈ വിഭാഗം പ്രാപ്തമാക്കുക. തുടർന്ന്, സ്പോൺസറിന് പകരം \"നോൺ-മ്യൂസിക്\" എന്ന് നിങ്ങൾക്ക് ഈ സെഗ്മെന്റ് സമർപ്പിക്കാൻ കഴിയും. നിങ്ങൾ ആശയക്കുഴപ്പത്തിലാണെങ്കിൽ ദയവായി മാർഗ്ഗനിർദ്ദേശങ്ങൾ വായിക്കുക."
|
||||
},
|
||||
|
||||
@@ -176,18 +176,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "Sembunyikan Butang Maklumat Pada Pemain YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Ini adalah butang yang membuka pop timbul di halaman YouTube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Sembunyikan Butang Padam Pada Pemain YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Tunjukkan Butang Padam Pada Pemain YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Ini adalah butang pada pemain YouTube yang akan membersihkan semua segmen anda yang belum dihantar untuk video semasa."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Dayakan Skip Count Tracking"
|
||||
},
|
||||
@@ -359,9 +353,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Tunjukkan Butang Muat Naik"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Butang ini muncul di pemain YouTube setelah anda memilih cap waktu dan siap untuk dihantar."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Alamat Pelayan Sponsorblock"
|
||||
},
|
||||
@@ -563,9 +554,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "Pemasaan Tidak Betul / Salah"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Kategori Salah"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Video ini dikategorikan sebagai muzik. Adakah anda pasti ini mempunyai penaja? Sekiranya ini sebenarnya adalah \"Segmen Bukan Muzik\", buka pilihan peluasan dan aktifkan kategori ini. Kemudian, anda boleh menghantar segmen ini sebagai \"Bukan Muzik\" dan bukannya penaja. Sila baca panduan sekiranya anda keliru."
|
||||
},
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Dit verbergt de knoppen die verschijnen op de YouTube-speler om segmenten over te slaan."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Knop voor \"overslaan naar hoogtepunt\" op speler houden"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Info-knop op YouTube-speler weergeven"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Info-knop op YouTube-speler verbergen"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Dit is de knop die een pop-up opent op de YouTube-pagina."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Infoknop automatisch verbergen"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Verwijderen-knop op YouTube-speler weergeven"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Dit is de knop op de YouTube-speler die al uw niet-ingediende segmenten van de huidige video zal wissen."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Bijhouden van het aantal keren overslaan inschakelen"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Uploaden-knop weergeven"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Deze knop verschijnt op de YouTube-speler nadat u een tijdstempel heeft geselecteerd en klaar bent om in te dienen."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock-serveradres"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Snelle samenvatting van vorige afleveringen of een voorbeeld van wat er later komt in de huidige video. Bedoeld voor samengevoegde clips, niet voor gesproken samenvattingen."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Zijspoor-opvulling"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Opvulling"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muziek: sectie niet-muziek"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Verkeerde timing"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Verkeerde categorie"
|
||||
"message": "Categorie wijzigen"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Deze video is gecategoriseerd als muziek. Weet u zeker dat dit een sponsor heeft? Als dit eigenlijk een \"niet-muzieksegment\" is, open dan de extensie-opties en schakel deze categorie in. Vervolgens kunt u dit segment indienen als \"niet-muziek\" in plaats van als sponsor. Lees de richtlijnen als u in de war bent."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Dank aan"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Nieuw! Ga met één klik naar de kern van de video met de nieuwe hoogtepunt-categorie"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Meer informatie"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Doet een downvote en maakt een lokale kopie aan die u opnieuw kunt indienen"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Wikipagina van deze categorie openen."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopiëren en downvote doen"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Doorgaan met stemmen"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Dit is direct van toepassing op uw segmenten"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Gebruik het muiswiel terwijl u over het invoerveld beweegt om de tijd snel aan te passen. Combinaties van de ctrl- of shift-toets kunnen worden gebruikt om de wijzigingen te verfijnen."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Nieuw! Zijsporen en grapjes overslaan met de opvulling-categorie. Inschakelen via opties"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": " d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": " h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,18 +176,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "Skjul infoknappen på YouTube-avspilleren"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Dette er knappen som åpner et oppsprett på YouTube-siden."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Skjul Slett-knappen på YouTube-avspilleren"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Vis Slett-knappen på YouTube-avspilleren"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Dette er knappen på YouTube-avspilleren som tømmer alle dine uinnsendte segmenter for den nåværende videoen."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Skru på telling av hopp"
|
||||
},
|
||||
@@ -359,9 +353,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Vis opplastingsknapp"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Denne knappen dukker opp på YouTube-avspilleren etter at du har valgt et tidsstempel og er klar til å sende inn."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock-tjeneradresse"
|
||||
},
|
||||
@@ -575,9 +566,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "Feil tidtaking"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Feil kategori"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Denne videoen er kategorisert som musikk. Er du sikker på at dette har en sponsor? Hvis det egentlig er et \"Ikke-musikk-segment\", åpne opp innstillingene til utvidelsen og skru på denne kategorien. Deretter kan du sende dette segmentet som \"Ikke-musikk\" i stedet for som sponsing. Vennligst les retningslinjene hvis du er forvirret."
|
||||
},
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Ta opcja ukrywa przyciski do zamieszczania segmentów pojawiające się na odtwarzaczu YouTube."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Kontynuuj wyświetlanie przycisku pomijania"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Pokaż przycisk informacyjny na odtwarzaczu YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Ukryj przycisk informacyjny na odtwarzaczu YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Jest to przycisk otwierający okienko pop-up na stronie YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Autoukrywanie przycisku informacji"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Pokaż przycisk usuwania na odtwarzaczu YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Ten przycisk na odtwarzaczu YouTube wyczyści wszystkie twoje niewysłane segmenty dla bieżącego filmu."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Włącz monitorowanie liczby pominięć"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Pokaż przycisk wysyłania"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Ten przycisk pojawia się na odtwarzaczu YouTube po wybraniu przedziału czasowego, gdy segment jest gotowy do wysłania."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adres serwera SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Wypełniacz"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Muzyka: Sekcja niemuzyczna"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Niepoprawne/Zły czas"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Zła kategoria"
|
||||
"message": "Zmień kategorię"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Ten film jest skategoryzowany jako muzyka. Czy masz pewność, że jest tutaj sponsor? Jeśli w rzeczywistości jest to „Sekcja Niemuzyczna”, otwórz opcje rozszerzenia i włącz tę kategorię. Wtedy będziesz w stanie zamieścić ten segment jako „Bez Muzyki” zamiast sponsora. Przeczytaj proszę wytyczne, jeśli masz wątpliwości."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Autorzy"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Nowość! Przejdź do interesującej części filmu jednym kliknięciem z nową kategorią wyróżnione"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Dowiedz się więcej"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Minusuje i tworzy lokalną kopię, abyś mógł przesłać poprawioną wersję"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Otwórz stronę wiki dla tej kategorii."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Skopiuj i zminusuj"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Kontynuuj głosowanie"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "To natychmiastowo zostanie zastosowane do twoich segmentów"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Użyj scroll'a myszy po najechaniu nad pole edycji, aby szybko dostosować czas. Kombinacje z ctrl'em i shift'em mogą być użyte, aby doszlifować zmiany."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Nowość! Pomiń nietematyczne sceny i żarty z kategorią wypełnienia. Włącz w opcjach"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Esta opção esconde os botões que aparecem para enviar segmentos no player do YouTube."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Manter botão Pular para os Destaques no player"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Mostrar botão de Informações no player do Youtube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Esconder botão de Informações no player do Youtube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Este é o botão que abre o popup na pagina do Youtube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Esconder Automaticamente o Botão de Informação"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Mostrar botão de Apagar no player do Youtube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Ativar Contador de Segmentos Pulados"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Mostrar botão de envio"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Este botão aparece no reprodutor do YouTube depois de ter selecionado um carimbo de data/hora e está pronto para ser enviado."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Endereço do servidor do SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Enrolação"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Música: Seção sem música"
|
||||
},
|
||||
@@ -656,6 +659,9 @@
|
||||
"message": "Para enviar os segmentos com a categoria de \"{0}\", você deve ativá-la nas opções. Você será redirecionado para as opções agora.",
|
||||
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
|
||||
},
|
||||
"poiOnlyOneSegment": {
|
||||
"message": "Aviso: Este tipo de segmento pode ter no máximo um ativo por vez. Enviar múltiplos fará com que um aleatório seja mostrado."
|
||||
},
|
||||
"youMustSelectACategory": {
|
||||
"message": "Você deve selecionar uma categoria para todos os segmentos que você está enviando!"
|
||||
},
|
||||
@@ -703,7 +709,7 @@
|
||||
"message": "Tempo errado ou incorreto"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Categoria errada"
|
||||
"message": "Mudar Categoria"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Este vídeo é categorizado como música. Tem certeza de que isto tem um patrocinador? Se este é realmente um \"Segmento Não Musical\", abra as opções da extensão e habilite esta categoria. Assim você pode enviar este segmento como \"Não-Musical\" ao invés de patrocinador. Por favor leia as diretrizes se estiver confuso."
|
||||
@@ -808,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Créditos"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novo! Vá direto ao ponto do vídeo com um clique com a nova categoria de Destaque"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Saiba mais"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Dá voto negativo e cria uma cópia local para você reenviar"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Abrir a wiki dessa categoria."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Copiar e dar voto negativo"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Continuar Votando"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Isto irá aplicar instantaneamente seus segmentos"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Novo! Pule tangentes e piadas com a categoria filler. Ative em opções"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,18 +99,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "Esconder botão de Informações no player do Youtube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Este é o botão que abre o popup na pagina do Youtube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Esconder botão de Apagar no player do Youtube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Mostrar botão de Apagar no player do Youtube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Este é o botão que lhe permite saltar todos os patrocínios do player do Youtube."
|
||||
},
|
||||
"showNotice": {
|
||||
"message": "Mostrar notificação outra vez"
|
||||
},
|
||||
|
||||
@@ -176,18 +176,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "Ascunde Butoanele De Informații Pe Playerul De YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Acesta este butonul care deschide popup-ul pe pagina de YouTube."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "Ascunde Butonul De Ștergere Pe Playerul De YouTube"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "Arată Butonul De Ștergere Pe Playerul De YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Acest buton de pe playerul de YouTube va șterge toate segmentele netrimise pentru videoclipul curent."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Activează Urmărirea Săriturilor"
|
||||
},
|
||||
@@ -359,9 +353,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Arată Butonul De Încărcare"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Acest buton apare pe playerul YouTube după ce ați selectat un marcaj de timp și sunteți gata să îl trimiteți."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresa Serverului SponsorBlock"
|
||||
},
|
||||
@@ -560,9 +551,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "Timpi Incorecți/Greșiți"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Categorie Greșită"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Acest videoclip este categorisit ca muzică. Ești sigur ca există un sponsor? Dacă acesta este defapt un segment non-muzical, deschideți opțiunile extensiei și activați această categorie. Apoi, puteți trimite acest segment ca non-muzical în loc de sponsol. Vă rugăm să citiți ghidul dacă sunteți confuz."
|
||||
},
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Эта настройка скрывает кнопки для отправки сегментов, расположенные в плеере YouTube."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Не скрывать кнопку \"Пропустить до важного\" в плеере YouTube"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Показывать кнопку информации в плеере YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Скрыть кнопку информации в плеере YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Эта кнопка открывает всплывающее окно на странице YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Автоматически скрывать кнопку Информация"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Показывать кнопку удаления в плеере YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Эта кнопка позволяет Вам очистить все неотправленные сегменты в плеере YouTube для текущего видео."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Включить отслеживание количества пропусков сегментов"
|
||||
},
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Показывать кнопку отправки"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Эта кнопка появляется в плеере YouTube после того, как Вы выбрали отметку времени и готовы к отправке."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Адрес сервера SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Краткое содержание предыдущих эпизодов или предварительный просмотр того, что будет в данном видео. Предназначено для сегментов, смонтированных из кусков видео, а не для устных пересказов."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Заполнение отвлечёнными темами"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Сегменты, которые увеличивают длительность видео за счёт отвлечённых тем или шуток, но не требуются для понимания основного содержания. Не должно иметь сегментов, объясняющие контекст или предысторию."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Заполнитель"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Музыка: Сегмент без музыки"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Не нужен/неверно указано время"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Неверная категория"
|
||||
"message": "Изменить категорию"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Это видео классифицировано как музыкальное. Вы уверены, что в нём есть спонсоры? Если на самом деле это \"Сегмент без музыки\", откройте параметры расширения и включите эту категорию. Затем вы можете отправить этот сегмент как \"Без музыки\", а не как спонсора. Пожалуйста, прочтите руководство, если вы запутались."
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Авторы"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Новинка! Переходите сразу к главному моменту видео с помощью новой категории \"Важное\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Узнать больше"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Голосует против и создаёт локальную копию сегмента для повторной отправки"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Открыть вики-страницу этой категории."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Скопировать и проголосовать против"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Продолжить голосование"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Это мгновенно применится к вашим сегментам"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Наведите курсор на поле редактирования и используйте колесо мыши для быстрой настройки времени. Клавиши Ctrl или Shift могут быть использованы для точной настройки."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Новое! Пропускайте сегменты с отвлечёнными темами или шутками. Включите в настройках"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "д",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "ч",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Skryje tlačidlá pre preskočenie segmentov, ktoré sa zobrazujú v YouTube prehrávači."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Zobrazovať tlačidlo preskočiť na hlavný obsah videa"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Zobraziť info tlačidlo v YouTube prehrávači"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Skryť info tlačidlo v YouTube prehrávači"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Toto tlačidlo zobrazí vyskakovacie okno na YouTube stránke."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Automaticky skryť tlačidlo Info"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Zobraziť tlačidlo Zmazať v YouTube prehrávači"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Toto tlačidlo v YouTube prehrávači zmaže všetky ešte neodoslané segmenty v aktuálnom videu."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Zapnúť počítanie preskočení"
|
||||
},
|
||||
@@ -230,6 +227,21 @@
|
||||
"showSkipNotice": {
|
||||
"message": "Zobraziť upozornenie pri preskočení segmentu"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Veľké upozornenia o preskočení"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "Malé upozornenia o automatickom preskočení"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "Malé upozornenia o všetkých preskočeniach"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "Priehľadné upozornenia o automatickom preskočení"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "Priehľadné upozornenia o všetkých preskočeniach"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "SponsorBlock umožňuje preskočiť sponzorov, úvodné časti, záverečné časti, pripomienky na odber, nehudobné časti videoklipov alebo iné otravné časti YouTube videí. SponsorBlock je crowdsourceové rozšírenie prehliadača, pomocou ktorého môže ktokoľvek označiť začiatok a koniec takéhoto segmentu. Po odoslaní potom všetci ostatní s týmto rozšírením tieto segmenty automaticky preskočia.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -427,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Ukázať Nahrávacie Tlačidlo"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Toto tlačidlo sa zobrazí v YouTube prehrávači po tom ako označíte začiatok a koniec segmentu na odoslanie."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Adresa serveru SponsorBlock"
|
||||
},
|
||||
@@ -554,6 +563,15 @@
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Odbočka"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Hudba: časť bez hudby"
|
||||
},
|
||||
@@ -691,7 +709,7 @@
|
||||
"message": "Nesprávne/Zlé načasovanie"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Nesprávna kategória"
|
||||
"message": "Zmeniť kategóriu"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Toto video je kategorizované ako hudobné. Ste si istý, že obsahuje sponzora? Ak sa skutočne jedná o časť bez hudby, otvorte možnosti rozšírenia a povoľte túto kategóriu. Potom môžete tento segment uložiť ako kategóriu \"Bez hudby\" namiesto sponzora. Ak si neviete rady, tak si prosím prečítajte pravidlá."
|
||||
@@ -796,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Autori"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Novinka! Pomocou novej kategórie \"Hlavný obsah videa\" môžete jedným klikom preskočiť \"k veci\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Zistiť viac"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Dá palec dole a vytvorí kópiu, aby ste mohli segment znova odoslať"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Otvoriť wiki stránku tejto kategórie."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Skopírovať a dať palec dole"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Pokračovať v hodnotení"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Týmto ihneď vykonáte zmeny v segmentoch"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Čas môžete rýchlo zmeniť kolieskom myši, ak je kurozor nad zadávacím políčkom. Pre jemné zmeny pritom držte kláves ctrl alebo shift."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Nové! Preskočte odbočky mimo tému a vtipy s kategóriou filler. Zapnite si ju v nastaveniach"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Detta döljer knapparna på YouTube-spelaren som du kan skicka in segment med som ska hoppas över."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Behåll knappen hoppa till markerat på spelaren"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Visa Infoknapp På YouTube-spelaren"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Dölj Infoknapp På YouTube-spelaren"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Detta är knappen som öppnar popup-rutan på YouTube-sidan."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Dölj informationsknappen automatiskt"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Visa knappen ta bort på YouTube-spelaren"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Den här knappen på YouTube-spelaren rensar bort alla segment som ej har skickats in på aktuell video."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Aktivera spåra antalet hoppa över"
|
||||
},
|
||||
@@ -290,7 +287,7 @@
|
||||
"message": "Hoppa över är inaktiverat"
|
||||
},
|
||||
"yourWork": {
|
||||
"message": "Ditt Bidrag",
|
||||
"message": "Ditt bidrag",
|
||||
"description": "Used to describe the section that will show you the statistics from your submissions."
|
||||
},
|
||||
"502": {
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Visa uppladdningsknapp"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Denna knapp visas på YouTube-spelaren efter att du har valt en tidpunkt och är redo att rapportera."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Serveradress för SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Snabb sammanfattning av tidigare avsnitt eller en förhandsvisning av vad som kommer upp senare i den aktuella videon. Avsett för redigerade klipp, inte för sammanfattningar."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Ämnesavvikelse"
|
||||
},
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Utfyllnad"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Musik: Icke-musikavsnitt"
|
||||
},
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Fel/Fel tidsintervall"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Fel kategori"
|
||||
"message": "Ändra kategori"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Den här videon kategoriseras som musik. Är du säker på att denna har en sponsor? Om detta faktiskt är ett \"icke-musiksegment\", öppna tilläggsalternativen och aktivera denna kategori. Då kan du skicka in detta segment som \"icke-musik\" i stället för sponsor. Läs riktlinjerna om något är oklart."
|
||||
@@ -725,7 +728,7 @@
|
||||
"message": "Kategorier finns här!"
|
||||
},
|
||||
"categoryUpdate2": {
|
||||
"message": "Öppna alternativen för att hoppa över intros, outros, merch, osv."
|
||||
"message": "Öppna alternativen för att hoppa över intros, outros, varor, osv."
|
||||
},
|
||||
"help": {
|
||||
"message": "Hjälp"
|
||||
@@ -800,7 +803,7 @@
|
||||
"message": "Databasen är offentlig och finns på"
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Källkoden är fritt tillgänglig. Så, även om något händer mig, är dina bidrag inte förlorade."
|
||||
"message": "Källkoden är fritt tillgänglig. Så, även om något händer mig, är dina inskickningar inte förlorade."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Nyheter och hur är det gjort"
|
||||
@@ -811,10 +814,36 @@
|
||||
"Credits": {
|
||||
"message": "Medverkande"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Nytt! Ta dig till stället i videon med ett klick med den nya markeringskategorin"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Läs mer"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Rösta ner och skapar en lokal kopia för dig att skicka igen"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Öppna denna kategoris wiki-sida."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Kopiera och rösta ner"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Fortsätt rösta"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Detta kommer omedelbart att verkställas till dina segment"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Använd mushjulet medan du håller muspekaren över redigeringsrutan för att snabbt justera tiden. Kombinationer av CTRL- eller SKIFT-tangenten kan användas för att finjustera tiden."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Nytt! Hoppa över ämnesavvikelser och skämt med utfyllnadskategorin. Aktiveras i alternativen"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,9 @@
|
||||
"reskip": {
|
||||
"message": "ரெஸ்கிப்"
|
||||
},
|
||||
"unmute": {
|
||||
"message": "ஒலியடக்கு"
|
||||
},
|
||||
"paused": {
|
||||
"message": "இடைநிறுத்தப்பட்டது"
|
||||
},
|
||||
@@ -79,9 +82,15 @@
|
||||
"sponsorEnd": {
|
||||
"message": "பிரிவு இப்போது முடிகிறது"
|
||||
},
|
||||
"sponsorCancel": {
|
||||
"message": "உருவாக்கும் பகுதியை ரத்து செய்"
|
||||
},
|
||||
"noVideoID": {
|
||||
"message": "YouTube வீடியோ எதுவும் கிடைக்கவில்லை.\nஇது தவறாக இருந்தால், தாவலைப் புதுப்பிக்கவும்."
|
||||
},
|
||||
"refreshSegments": {
|
||||
"message": "பிரிவுகளைப் புதுப்பிக்கவும்"
|
||||
},
|
||||
"success": {
|
||||
"message": "வெற்றி!"
|
||||
},
|
||||
@@ -152,6 +161,9 @@
|
||||
"setUsername": {
|
||||
"message": "பயனர்பெயரை அமைக்கவும்"
|
||||
},
|
||||
"copyPublicID": {
|
||||
"message": "பொது பயனர் IDயை நகலெடுக்கவும்"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "பரிந்துரைகள் மற்றும் கருத்துக்களை வழங்க அதிகாரப்பூர்வ டிஸ்கார்ட் சேவையகத்தில் சேர வாருங்கள்!"
|
||||
},
|
||||
@@ -170,14 +182,17 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "ஸ்கிப் பிரிவுகளைச் சமர்ப்பிக்க YouTube பிளேயரில் தோன்றும் பொத்தான்களை இது மறைக்கிறது."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "பிளேயரில் Skip To Highlight பொத்தானை வைக்கவும்"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTube பிளேயரில் தகவல் பொத்தானைக் காட்டு"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTube பிளேயரில் தகவல் பொத்தானை மறைக்கவும்"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "YouTube பக்கத்தில் ஒரு பாப்அப்பைத் திறக்கும் பொத்தான் இது."
|
||||
"autoHideInfoButton": {
|
||||
"message": "தகவல் பொத்தானை தானாக மறைக்கவும்"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "YouTube பிளேயரில் நீக்கு பொத்தானை மறைக்க"
|
||||
@@ -185,15 +200,15 @@
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube பிளேயரில் நீக்கு பொத்தானைக் காட்டு"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "இது YouTube பிளேயரில் உள்ள பொத்தானாகும், இது தற்போதைய வீடியோவிற்கு நீங்கள் சமர்ப்பிக்காத அனைத்து பகுதிகளையும் அழிக்கும்."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கு"
|
||||
},
|
||||
"whatViewTracking": {
|
||||
"message": "இந்த அம்சம் பயனர்கள் தங்கள் சமர்ப்பிப்பு மற்றவர்களுக்கு எவ்வளவு உதவியது மற்றும் ஸ்பேம் தரவுத்தளத்தில் வரவில்லை என்பதை உறுதிப்படுத்த அப்வோட்களுடன் ஒரு மெட்ரிக்காகப் பயன்படுத்தப்படுவதை பயனர்களுக்குத் தெரியப்படுத்த நீங்கள் எந்த பகுதிகளைத் தவிர்த்துவிட்டீர்கள் என்பதைக் கண்காணிக்கிறது. ஒவ்வொரு முறையும் நீங்கள் ஒரு பகுதியைத் தவிர்க்கும்போது நீட்டிப்பு சேவையகத்திற்கு ஒரு செய்தியை அனுப்புகிறது. பார்வை எண்கள் துல்லியமாக இருக்க பெரும்பாலான மக்கள் இந்த அமைப்பை மாற்ற மாட்டார்கள் என்று நம்புகிறோம். :)"
|
||||
},
|
||||
"enableViewTrackingInPrivate": {
|
||||
"message": "தனிப்பட்ட/மறைநிலை தாவல்களில் ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கவும்"
|
||||
},
|
||||
"enableQueryByHashPrefix": {
|
||||
"message": "ஹாஷ் முன்னொட்டு மூலம் வினவல்"
|
||||
},
|
||||
@@ -212,6 +227,21 @@
|
||||
"showSkipNotice": {
|
||||
"message": "ஒரு பிரிவு தவிர்க்கப்பட்ட பிறகு அறிவிப்பைக் காட்டு"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "முழு அளவு தவிர்க்கும் அறிவிப்புகள்"
|
||||
},
|
||||
"noticeVisibilityMode1": {
|
||||
"message": "ஆட்டோ ஸ்கிப்பிற்கான சிறிய ஸ்கிப் அறிவிப்புகள்"
|
||||
},
|
||||
"noticeVisibilityMode2": {
|
||||
"message": "அனைத்து சிறிய தவிர்க்கும் அறிவிப்புகள்"
|
||||
},
|
||||
"noticeVisibilityMode3": {
|
||||
"message": "ஆட்டோ ஸ்கிப்பிற்கான மங்கலான தவிர்க்கும் அறிவிப்புகள்"
|
||||
},
|
||||
"noticeVisibilityMode4": {
|
||||
"message": "அனைத்து மங்கலான தவிர்க்கும் அறிவிப்புகள்"
|
||||
},
|
||||
"longDescription": {
|
||||
"message": "ஸ்பான்சர்கள், அறிமுகங்கள், அவுட்ரோஸ், சந்தா நினைவூட்டல்கள் மற்றும் YouTube வீடியோக்களின் பிற எரிச்சலூட்டும் பகுதிகளைத் தவிர்க்க ஸ்பான்சர் பிளாக் உங்களை அனுமதிக்கிறது. ஸ்பான்சர் பிளாக் என்பது ஒரு கூட்ட நெரிசலான உலாவி நீட்டிப்பாகும், இது ஸ்பான்சர் செய்யப்பட்ட பிரிவுகளின் தொடக்க மற்றும் இறுதி நேரங்களையும் YouTube வீடியோக்களின் பிற பிரிவுகளையும் எவரும் சமர்ப்பிக்கலாம். ஒரு நபர் இந்த தகவலைச் சமர்ப்பித்தவுடன், இந்த நீட்டிப்பு உள்ள மற்றவர்கள் ஸ்பான்சர் செய்யப்பட்ட பிரிவைத் தவிர்த்து விடுவார்கள். இசை வீடியோக்களின் இசை அல்லாத பிரிவுகளையும் நீங்கள் தவிர்க்கலாம்.",
|
||||
"description": "Full description of the extension on the store pages."
|
||||
@@ -235,6 +265,9 @@
|
||||
"setSkipShortcut": {
|
||||
"message": "ஒரு பகுதியைத் தவிர்ப்பதற்கான விசையை அமைக்கவும்"
|
||||
},
|
||||
"setStartSponsorShortcut": {
|
||||
"message": "துவக்க/நிறுத்த பிரிவு விசைப்பலகைக்கு விசையை அமைக்கவும்"
|
||||
},
|
||||
"setSubmitKeybind": {
|
||||
"message": "சமர்ப்பிக்கும் விசைப்பலகைக்கு விசையை அமைக்கவும்"
|
||||
},
|
||||
@@ -266,9 +299,31 @@
|
||||
"skip": {
|
||||
"message": "தவிர்"
|
||||
},
|
||||
"mute": {
|
||||
"message": "ஒலியடக்கு"
|
||||
},
|
||||
"skip_category": {
|
||||
"message": "{0} ஐ தவிர்?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "{0} ஐ ஒலியடக்கவா?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "{0} க்குச் செல்லவா?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} தவிர்க்கப்பட்டது",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} ஒலியடக்கப்பட்டது",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "{0} தவிர்க்கப்பட்டது",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "ஆட்டோ ஸ்கிப்பை முடக்கு"
|
||||
},
|
||||
@@ -317,6 +372,9 @@
|
||||
"changeUserID": {
|
||||
"message": "உங்கள் பயனர் ஐடியை இறக்குமதி / ஏற்றுமதி செய்யுங்கள்"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "இதை தனிப்பட்டதாக வைத்திருக்க வேண்டும். இது கடவுச்சொல் போன்றது, அதை யாருடனும் பகிரக்கூடாது. யாரிடமாவது இது இருந்தால், அவர் உங்களைப் போல் ஆள்மாறாட்டம் செய்யலாம். உங்கள் பொது பயனர் IDயை நீங்கள் தேடுகிறீர்களானால், பாப்அப்பில் உள்ள கிளிப்போர்டு ஐகானைக் கிளிக் செய்யவும்."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "UserID ஐ அமைக்கவும்"
|
||||
},
|
||||
@@ -329,9 +387,25 @@
|
||||
"keybindCurrentlySet": {
|
||||
"message": ". இது தற்போது அமைக்கப்பட்டுள்ளது:"
|
||||
},
|
||||
"supportOtherSites": {
|
||||
"message": "3 வது தரப்பு YouTube-தளங்களை ஆதரிக்கவும்"
|
||||
},
|
||||
"supportOtherSitesDescription": {
|
||||
"message": "மூன்றாம் தரப்பு YouTube தளங்களை ஆதரிக்கவும். ஆதரவை இயக்க, நீங்கள் கூடுதல் அனுமதிகளை ஏற்க வேண்டும். இது Chrome மற்றும் பிற Chromium வகைகளில் தனிப்பட்ட தாவல்களில் வேலை செய்யாது.",
|
||||
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
|
||||
},
|
||||
"supportedSites": {
|
||||
"message": "ஆதரிக்கப்படும் தளங்கள்: "
|
||||
},
|
||||
"optionsInfo": {
|
||||
"message": "ஆக்கிரமிப்பு ஆதரவை இயக்கு, ஆட்டோஸ்கிப்பை முடக்கு, பொத்தான்களை மறை மற்றும் பலவற்றை."
|
||||
},
|
||||
"addInvidiousInstance": {
|
||||
"message": "3 வது தரப்பு தளங்களை சேர்க்கவும்"
|
||||
},
|
||||
"addInvidiousInstanceDescription": {
|
||||
"message": "தனிப்பட்ட தளங்களை சேர்க்கவும். இது Domain வடிவமைப்பில் இருக்க வேண்டும். உதாரணம்: invidious.ajay.app"
|
||||
},
|
||||
"add": {
|
||||
"message": "சேர்"
|
||||
},
|
||||
@@ -353,15 +427,18 @@
|
||||
"minDurationDescription": {
|
||||
"message": "தொகுப்பு மதிப்பை விடக் குறைவான பகுதிகள் தவிர்க்கப்படாது அல்லது பிளேயரில் காண்பிக்கப்படாது."
|
||||
},
|
||||
"skipNoticeDuration": {
|
||||
"message": "அறிவிப்பு காலத்தை தவிர்க்கவும் (வினாடிகள்):"
|
||||
},
|
||||
"skipNoticeDurationDescription": {
|
||||
"message": "தவிர்க்கும் அறிவிப்பு குறைந்தபட்சம் இவ்வளவு நேரம் திரையில் இருக்கும். மேனுவல் ஸ்கிப்பிங்கிற்கு, இது நீண்ட நேரம் தெரியும்."
|
||||
},
|
||||
"shortCheck": {
|
||||
"message": "பின்வரும் சமர்ப்பிப்பு உங்கள் குறைந்தபட்ச கால விருப்பத்தை விட குறைவாக உள்ளது. இது ஏற்கனவே சமர்ப்பிக்கப்பட்டுள்ளது என்பதையும், இந்த விருப்பத்தின் காரணமாக புறக்கணிக்கப்படுவதையும் இது குறிக்கலாம். நீங்கள் சமர்ப்பிக்க விரும்புகிறீர்களா?"
|
||||
},
|
||||
"showUploadButton": {
|
||||
"message": "பதிவேற்ற பொத்தானைக் காட்டு"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "நீங்கள் நேர முத்திரையைத் தேர்ந்தெடுத்து சமர்ப்பிக்கத் தயாரான பிறகு இந்த பொத்தான் YouTube பிளேயரில் தோன்றும்."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "ஸ்பான்சர் பிளாக் சேவையக முகவரி"
|
||||
},
|
||||
@@ -413,6 +490,9 @@
|
||||
"preview": {
|
||||
"message": "முன்னோட்ட"
|
||||
},
|
||||
"unsubmitted": {
|
||||
"message": "சமர்ப்பிக்கப்படவில்லை"
|
||||
},
|
||||
"inspect": {
|
||||
"message": "ஆய்வு செய்யுங்கள்"
|
||||
},
|
||||
@@ -477,6 +557,12 @@
|
||||
"category_outro_description": {
|
||||
"message": "வரவுகளை அல்லது YouTube எண்ட்கார்டுகள் தோன்றும் போது. தகவலுடன் முடிவுகளுக்கு அல்ல."
|
||||
},
|
||||
"category_preview": {
|
||||
"message": "முன்னோட்டம்/மறுபரிசீலனை"
|
||||
},
|
||||
"category_preview_description": {
|
||||
"message": "முந்தைய எபிசோடுகளின் விரைவான மறுபரிசீலனை அல்லது தற்போதைய வீடியோவில் பின்னர் என்ன வரப்போகிறது என்பதற்கான முன்னோட்டம். ஒன்றாக தொகுக்கப்பட்ட கிளிப்புகள், பேசப்பட்ட சுருக்கங்களுக்கு அல்ல."
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "இசை: இசை அல்லாத பிரிவு"
|
||||
},
|
||||
@@ -486,6 +572,12 @@
|
||||
"category_music_offtopic_short": {
|
||||
"message": "இசை அல்லாதது"
|
||||
},
|
||||
"category_poi_highlight": {
|
||||
"message": "முன்னிலைப்படுத்த"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "பெரும்பாலான மக்கள் தேடும் வீடியோவின் பகுதி. \"வீடியோ x இல் தொடங்குகிறது\" போன்றது."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "லைவ்ஸ்ட்ரீம்: நன்கொடை / செய்தி அளவீடுகள்"
|
||||
},
|
||||
@@ -563,9 +655,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "தவறான / தவறான நேரம்"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "தவறான வகை"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "இந்த வீடியோ இசை என வகைப்படுத்தப்பட்டுள்ளது. இதற்கு ஒரு ஸ்பான்சர் இருப்பதை நீங்கள் உறுதியாக நம்புகிறீர்களா? இது உண்மையில் \"இசை அல்லாத பிரிவு\" என்றால், நீட்டிப்பு விருப்பங்களைத் திறந்து இந்த வகையை இயக்கவும். பின்னர், நீங்கள் இந்த பகுதியை ஸ்பான்சருக்கு பதிலாக \"இசை அல்லாதது\" என்று சமர்ப்பிக்கலாம். நீங்கள் குழப்பமாக இருந்தால் வழிகாட்டுதல்களைப் படிக்கவும்."
|
||||
},
|
||||
|
||||
@@ -176,18 +176,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "YouTube ప్లేయర్లో సమాచారం బటన్ను దాచండి"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "ఇది YouTube పేజీలో పాపప్ను తెరిచే బటన్."
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "YouTube ప్లేయర్లో తొలగించు బటన్ను దాచండి"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube ప్లేయర్లో తొలగించు బటన్ను చూపించు"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "ఇది YouTube ప్లేయర్లోని బటన్, ఇది ప్రస్తుత వీడియో కోసం మీరు సమర్పించని అన్ని విభాగాలను క్లియర్ చేస్తుంది."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "స్కిప్ కౌంట్ ట్రాకింగ్ను ప్రారంభించండి"
|
||||
},
|
||||
@@ -359,9 +353,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "అప్లోడ్ బటన్ చూపించు"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "మీరు టైమ్స్టాంప్ను ఎంచుకుని సమర్పించడానికి సిద్ధంగా ఉన్న తర్వాత ఈ బటన్ YouTube ప్లేయర్లో కనిపిస్తుంది."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "స్పాన్సర్బ్లాక్ సర్వర్ చిరునామా"
|
||||
},
|
||||
@@ -563,9 +554,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "తప్పు / తప్పు సమయం"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "తప్పు వర్గం"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "ఈ వీడియోను సంగీతంగా వర్గీకరించారు. దీనికి స్పాన్సర్ ఉందని మీరు ఖచ్చితంగా అనుకుంటున్నారా? ఇది వాస్తవానికి \"నాన్-మ్యూజిక్ సెగ్మెంట్\" అయితే, పొడిగింపు ఎంపికలను తెరిచి ఈ వర్గాన్ని ప్రారంభించండి. అప్పుడు, మీరు ఈ విభాగాన్ని స్పాన్సర్కు బదులుగా \"నాన్-మ్యూజిక్\" గా సమర్పించవచ్చు. మీరు గందరగోళంలో ఉంటే దయచేసి మార్గదర్శకాలను చదవండి."
|
||||
},
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Bu YouTube oynatıcısındaki bölüm geçişlerini yolladığınız butonları saklayacaktır."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "“Asıl Kısma Atla” Düğmesi Oynatıcıda Kalsın"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "YouTube Oynatıcısındaki Bilgi Butonunu Göster"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "YouTube Oynatıcısındaki Bilgi Butonunu Gizle"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Bu, YouTube sayfasında açılan pencereyi açan butondur."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Bilgi düğmesini otomatik gizle"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "YouTube Oynatıcısında Silme Tuşunu Göster"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Bu, YouTube oynatıcısındaki mevcut video için gönderilmemiş bölümleri temizleyen butondur."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Kısım Atlama Sayaç Takibine İzin Ver"
|
||||
},
|
||||
@@ -436,9 +433,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Karşıya Yükleme Butonunu Göster"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Bu buton, YouTube oynatıcısında bir zaman seçtiğiniz ve göndermeye hazır olduğunuzda gözükür."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock Sunucu Adresi"
|
||||
},
|
||||
@@ -699,9 +693,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "Hatalı/Yanlış Zaman"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Yanlış Kategori"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Bu video müzik olarak sınıflandırılmıştır. Bunun bir sponsor olduğundan emin misin? Bu aslında bir \"Müzik Dışı bölüm\" ise, uzantı seçeneklerini açın ve bu kategoriyi etkinleştirin. Ardından, bu kısmı sponsor yerine \"Müzik Olmayan\" olarak gönderebilirsiniz. Kafanız karıştıysa lütfen yönergeleri okuyun."
|
||||
},
|
||||
@@ -790,9 +781,6 @@
|
||||
"Credits": {
|
||||
"message": "Emeği Geçenler"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Yeni! \"Vurgu\" kategorisi sayesinde tek tıkla videonun asıl yerine gidebilirsiniz"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Dahasını Öğren"
|
||||
}
|
||||
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Це налаштування приховує кнопки для надсилання спонсорських вставок, які з'являються в плеєрі YouTube."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Залишати кнопку \"Перейти до Основне\" на плеєрі"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Показувати кнопку інформації в плеєрі YouTube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Приховати кнопку інформації в плеєрі YouTube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Ця кнопка відкриває спливаюче вікно на сторінці YouTube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Кнопка \"Автоматично сховати інформацію\""
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Показувати кнопку видалення в плеєрі YouTube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Ця кнопка дозволяє очистити всі спонсорські вставки в плеєрі YouTube."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Увімкнути відстеження кількості пропусків сегментів"
|
||||
},
|
||||
@@ -312,7 +309,7 @@
|
||||
"message": "Вимкнути звук {0}?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Пропустить до {0}?",
|
||||
"message": "Пропустити до {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
@@ -442,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Показувати кнопку надсилання"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Ця кнопка з'являється в плеєрі YouTube після того, як Ви вибрали позначку часу і готові до надсилання."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Адреса сервера SponsorBlock"
|
||||
},
|
||||
@@ -569,6 +563,15 @@
|
||||
"category_preview_description": {
|
||||
"message": "Короткий зміст попередніх епізодів або попередній перегляд того, що буде в даному відео. Призначено для сегментів, змонтованих зі шматків відео, а не для усних переказів."
|
||||
},
|
||||
"category_filler": {
|
||||
"message": "Дотичне наповнення"
|
||||
},
|
||||
"category_filler_description": {
|
||||
"message": "Дотичні сцени додані лише для наповнення або гумору, які не потрібні для розуміння основного вмісту відео. Це не повинно включати сегменти, що надають контекст або передісторію."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Наповнення"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Музика: Сегмент без музики"
|
||||
},
|
||||
@@ -582,7 +585,7 @@
|
||||
"message": "Основне"
|
||||
},
|
||||
"category_poi_highlight_description": {
|
||||
"message": "Часть видео, которую ищут большинство людей. Аналогично комментарию «Видео начинается с X:XX»."
|
||||
"message": "Частина відео яку шукає більшість людей (Аналогічно коментарю \"Відео починається з Х:ХХ\")."
|
||||
},
|
||||
"category_livestream_messages": {
|
||||
"message": "Прямі трансляції: пожертвування/читання повідомлення"
|
||||
@@ -597,19 +600,19 @@
|
||||
"message": "Пропуск вручну"
|
||||
},
|
||||
"showOverlay": {
|
||||
"message": "Показувати в смузі прокрутки"
|
||||
"message": "Показувати в смузі перемотування"
|
||||
},
|
||||
"disable": {
|
||||
"message": "Вимкнути"
|
||||
},
|
||||
"autoSkip_POI": {
|
||||
"message": "Автоматический переход к началу"
|
||||
"message": "Автоматично перейти до початку"
|
||||
},
|
||||
"manualSkip_POI": {
|
||||
"message": "Спросите, когда видео загружается"
|
||||
"message": "Спитати поки відео завантажується"
|
||||
},
|
||||
"showOverlay_POI": {
|
||||
"message": "Показать на панели поиска"
|
||||
"message": "Показати в смузі перемотування"
|
||||
},
|
||||
"autoSkipOnMusicVideos": {
|
||||
"message": "Автоматично пропустити усі сегменти, якщо присутній сегмент без музики"
|
||||
@@ -706,7 +709,7 @@
|
||||
"message": "Невірно вказано час"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Невірна категорія"
|
||||
"message": "Змінити категорію"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Це відео класифіковано як музичне. Ви впевнені, що в ньому є спонсори? Якщо насправді це \"Сегмент без музики\", відкрийте параметри розширення і увімкніть цю категорію. Потім ви можете надіслати цей сегмент як \"Без музики\", а не як спонсора. Будь ласка, прочитайте керівництво, якщо ви заплуталися."
|
||||
@@ -811,10 +814,33 @@
|
||||
"Credits": {
|
||||
"message": "Автори"
|
||||
},
|
||||
"highlightNewFeature": {
|
||||
"message": "Новинка! Переходьте відразу до головного моменту відео за допомогою нової категорії \"Важливе\""
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Дізнатися більше"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Голосує проти та створює локальну копію для повторного надсилання"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Відкрити вікі-сторінку цієї категорії."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Скопіювати та проголосувати проти"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Продовжити голосування"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Це миттєво буде застосовано до ваших сегментів"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Навівши курсор на поле редагування, користуйтеся колесом прокрутки, щоб швидко відрегулювати час. Комбінації клавіш ctrl або shift можуть бути використані для точнішої настройки змін."
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "д",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "г",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"message": "đoạn quảng cáo"
|
||||
},
|
||||
"Segments": {
|
||||
"message": "đoạn quảng cáo"
|
||||
"message": "phân đoạn"
|
||||
},
|
||||
"upvoteButtonInfo": {
|
||||
"message": "Tán thành phân đoạn này"
|
||||
@@ -74,7 +74,7 @@
|
||||
"message": "Video này có đoạn quảng cáo trong kho dữ liệu rồi!"
|
||||
},
|
||||
"sponsor404": {
|
||||
"message": "Không tìm thấy đoạn nào"
|
||||
"message": "Không tìm thấy phân đoạn nào"
|
||||
},
|
||||
"sponsorStart": {
|
||||
"message": "Đoạn quảng cáo bắt đầu vào lúc này"
|
||||
@@ -101,10 +101,10 @@
|
||||
"message": "Có vẻ máy chủ đang không hoạt động. Hãy liên hệ nhà phát triển ngay lập tức."
|
||||
},
|
||||
"connectionError": {
|
||||
"message": "Đã xảy ra lỗi kết nối. Mã của lỗi: "
|
||||
"message": "Đã xảy ra lỗi kết nối. Mã lỗi: "
|
||||
},
|
||||
"clearTimes": {
|
||||
"message": "Xóa đoạn quảng cáo"
|
||||
"message": "Xóa các phân đoạn"
|
||||
},
|
||||
"openPopup": {
|
||||
"message": "Mở bảng popup của SponsorBlock"
|
||||
@@ -113,10 +113,10 @@
|
||||
"message": "Đóng bảng popup"
|
||||
},
|
||||
"SubmitTimes": {
|
||||
"message": "Đăng đoạn quảng cáo"
|
||||
"message": "Gửi phân đoạn"
|
||||
},
|
||||
"submitCheck": {
|
||||
"message": "Bạn có chắc là muốn đăng không?"
|
||||
"message": "Bạn có chắc chắn muốn gửi không?"
|
||||
},
|
||||
"whitelistChannel": {
|
||||
"message": "Đưa kênh vào danh sách không chặn"
|
||||
@@ -125,7 +125,7 @@
|
||||
"message": "Loại kênh khỏi danh sách không chặn"
|
||||
},
|
||||
"voteOnTime": {
|
||||
"message": "Bầu chọn một đoạn quảng cáo"
|
||||
"message": "Bầu chọn một phân đoạn"
|
||||
},
|
||||
"Submissions": {
|
||||
"message": "Các phân đoạn"
|
||||
@@ -150,7 +150,7 @@
|
||||
"message": "Xóa thời gian"
|
||||
},
|
||||
"submitTimesButton": {
|
||||
"message": "Đăng thời gian"
|
||||
"message": "Gửi thời gian"
|
||||
},
|
||||
"publicStats": {
|
||||
"message": "Tên này được dùng tại trang thông tin công khai để thể hiện lượng đóng góp của bạn. Xem"
|
||||
@@ -165,7 +165,7 @@
|
||||
"message": "Sao chép Public UserID"
|
||||
},
|
||||
"discordAdvert": {
|
||||
"message": "Hãy tham gia server Discord chính thức để đăng gợi ý và phản hồi!"
|
||||
"message": "Hãy tham gia server Discord chính thức để đưa ra gợi ý và phản hồi!"
|
||||
},
|
||||
"hideThis": {
|
||||
"message": "Đóng lại"
|
||||
@@ -182,15 +182,15 @@
|
||||
"hideButtonsDescription": {
|
||||
"message": "Không hiển thị nút trên trình chạy video Youtube để đăng đoạn quảng cáo."
|
||||
},
|
||||
"showSkipButton": {
|
||||
"message": "Giữ nút bỏ qua Highlight trên trình phát player"
|
||||
},
|
||||
"showInfoButton": {
|
||||
"message": "Hiển thị nút thông tin trên trình chạy video Youtube"
|
||||
},
|
||||
"hideInfoButton": {
|
||||
"message": "Không hiển thị nút thông tin trên trình chạy video Youtube"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "Đây là nút để mở bảng popup trên trang Youtube."
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "Tự động ẩn nút Info"
|
||||
},
|
||||
@@ -200,9 +200,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "Hiển thị nút xóa trên trình chạy video Youtube"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "Đây là nút trên trình chạy video Youtube để xóa tất cả những đoạn quảng cáo chưa đăng của bạn trong video đang xem."
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "Bật tính năng theo dõi số quảng cáo được bỏ qua"
|
||||
},
|
||||
@@ -228,7 +225,7 @@
|
||||
"message": "Hiện thông báo lại"
|
||||
},
|
||||
"showSkipNotice": {
|
||||
"message": "Hiển thị thông báo sau khi bỏ qua quảng cáo"
|
||||
"message": "Hiển thị thông báo sau khi bỏ qua phân đoạn"
|
||||
},
|
||||
"noticeVisibilityMode0": {
|
||||
"message": "Thông báo bỏ qua với kích thước đầy đủ"
|
||||
@@ -308,6 +305,25 @@
|
||||
"skip_category": {
|
||||
"message": "Bỏ qua {0}?"
|
||||
},
|
||||
"mute_category": {
|
||||
"message": "Ngắt tiếng {0} chứ?"
|
||||
},
|
||||
"skip_to_category": {
|
||||
"message": "Bỏ qua đến {0}?",
|
||||
"description": "Used for skipping to things (Skip to Highlight)"
|
||||
},
|
||||
"skipped": {
|
||||
"message": "{0} đã bỏ qua",
|
||||
"description": "Example: Sponsor Skipped"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} đã ngắt tiếng (Muted)",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"skipped_to_category": {
|
||||
"message": "Đã bỏ qua đến {0}",
|
||||
"description": "Used for skipping to things (Skipped to Highlight)"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "Tắt tự động bỏ qua"
|
||||
},
|
||||
@@ -315,7 +331,7 @@
|
||||
"message": "Bật tự động bỏ qua quảng cáo"
|
||||
},
|
||||
"audioNotification": {
|
||||
"message": "Thông báo bằng âm thanh khi bỏ qua quảng cáo"
|
||||
"message": "Thông báo bằng âm thanh khi bỏ qua"
|
||||
},
|
||||
"audioNotificationDescription": {
|
||||
"message": "Thông báo bằng âm thanh sẽ được bật khi bỏ qua quảng cáo. Nếu tắt tính năng này (hoặc tính năng tự động bỏ qua quảng cáo bị tắt), sẽ không có âm thanh kêu."
|
||||
@@ -357,7 +373,7 @@
|
||||
"message": "Nhập/Xuất mã người dùng của bạn"
|
||||
},
|
||||
"whatChangeUserID": {
|
||||
"message": "Đây là mã cần được giữ bí mật. Nó giống như mật khẩu và không nên được chia sẻ cho bất kì ai khác. Nếu có ai đó lấy được mã này, họ có thể mạo danh bạn. Còn nếu như bạn đang tìm khoá ID công khai, hãy nhấn vào nút \"Sao chép Public ID\" trong popup của SponsorBlock."
|
||||
"message": "Đây là mã cần được giữ bí mật. Nó giống như mật khẩu và không nên được chia sẻ cho bất kì ai khác. Nếu có ai đó lấy được mã này, họ có thể mạo danh bạn. Còn nếu như bạn đang tìm khoá ID công khai, hãy nhấn vào nút \"Sao chép Public UserID\" trong popup của SponsorBlock."
|
||||
},
|
||||
"setUserID": {
|
||||
"message": "Đặt mã người dùng"
|
||||
@@ -423,9 +439,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "Hiển thị nút tải lên"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "Nút này xuất hiện trên trình chạy video Youtube sau khi bạn chọn mốc thời gian và sẵn sàng đăng đoạn quảng cáo."
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "Địa chỉ máy chủ SponsorBlock"
|
||||
},
|
||||
@@ -463,10 +476,10 @@
|
||||
"message": "Tệp JSON này không được định dạng đúng cách. Tùy chọn của bạn chưa được thay đổi."
|
||||
},
|
||||
"confirmNoticeTitle": {
|
||||
"message": "Đăng đoạn quảng cáo"
|
||||
"message": "Gửi phân đoạn"
|
||||
},
|
||||
"submit": {
|
||||
"message": "Đăng"
|
||||
"message": "Gửi"
|
||||
},
|
||||
"cancel": {
|
||||
"message": "Huỷ"
|
||||
@@ -550,6 +563,15 @@
|
||||
"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."
|
||||
},
|
||||
"category_filler_short": {
|
||||
"message": "Cảnh phụ"
|
||||
},
|
||||
"category_music_offtopic": {
|
||||
"message": "Nhạc: Phần không nhạc"
|
||||
},
|
||||
@@ -647,7 +669,7 @@
|
||||
"message": "(Kết thúc)"
|
||||
},
|
||||
"hiddenDueToDownvote": {
|
||||
"message": "đã bị ẩn: Không tán thành"
|
||||
"message": "đã ẩn: hạ bình chọn"
|
||||
},
|
||||
"hiddenDueToDuration": {
|
||||
"message": "đã bị ẩn: quá ngắn"
|
||||
@@ -684,16 +706,16 @@
|
||||
"message": "Cân nhắc bật chế độ \"Bắt buộc kiểm tra kênh YouTube trước khi bỏ qua phân đoạn\""
|
||||
},
|
||||
"downvoteDescription": {
|
||||
"message": "Phân đoạn sai / không đúng"
|
||||
"message": "Chỉnh thời gian sai/không đúng"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "Sai thể loại"
|
||||
"message": "Đổi danh mục"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "Video này đã được phân loại là âm nhạc. Bạn có chắc đây là quảng cáo nhà tài trợ không? Nếu đây là phân đoạn \"Không phải nhạc\", hãy mở Cài đặt tiện ích và bật lựa chọn đó. Rồi bạn có thể đăng tải phân đoạn lên dưới danh mục \"Không phải nhạc\" thay vì \"Quảng cáo nhà tài trợ\". Hãy đọc Hướng dẫn nếu bạn vẫn còn vướng mắc"
|
||||
},
|
||||
"multipleSegments": {
|
||||
"message": "Nhiều đoạn"
|
||||
"message": "Nhiều phân đoạn"
|
||||
},
|
||||
"guidelines": {
|
||||
"message": "Hướng dẫn"
|
||||
@@ -722,12 +744,15 @@
|
||||
"hideForever": {
|
||||
"message": "Ẩn vĩnh viễn"
|
||||
},
|
||||
"warningChatInfo": {
|
||||
"message": "Bạn đã nhận được một cảnh báo và tạm thời không thể gửi các phân đoạn. Bạn đã mắc lỗi trong việc tạo phân đoạn quá nhiều lần (có thể là chọn sai kiểu phân đoạn hoặc sai thời gian phân đoạn). Chúng tôi muốn bạn nhận ra điều đó để giúp bạn không mắc lỗi trong tương lai. Bạn có thể gặp các Vip User tại đây: discord.gg/SponsorBlock hoặc matrix.to/#/#sponsor:ajay.app. Bọn họ sẽ giúp bạn gỡ cảnh báo sau khi bạn đã hiểu ra lỗi sai của bạn"
|
||||
},
|
||||
"voteRejectedWarning": {
|
||||
"message": "Bỏ phiếu bị từ chối do có cảnh báo. Nhấp để mở cuộc trò chuyện để giải quyết hoặc quay lại sau.",
|
||||
"description": "This is an integrated chat panel that will appearing allowing them to talk to the Discord/Matrix chat without leaving their browser."
|
||||
},
|
||||
"Donate": {
|
||||
"message": "Donate"
|
||||
"message": "Ủng hộ"
|
||||
},
|
||||
"hideDonationLink": {
|
||||
"message": "Ẩn link donate"
|
||||
@@ -750,7 +775,75 @@
|
||||
"helpPageHowSkippingWorks2": {
|
||||
"message": "Bất cứ khi nào bỏ qua một phân đoạn, bạn sẽ nhận được 1 cửa sổ thông báo bât. Nếu phân đoạn có vẻ sai, hãy bỏ phiếu bằng cách nhấp vào nút downvote! Bạn cũng có thể bỏ phiếu trong cửa sổ bật lên khi nhấn vào biểu tượng tiện ích mở rộng. Và bạn có thể tắt việc hiển thị bảng thông báo này trong phần cài đặt tiện ích."
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "Đang gửi lên"
|
||||
},
|
||||
"helpPageSubmitting1": {
|
||||
"message": "Việc gửi một phân đoạn mới có thể được thực hiện trong cửa sổ bật lên bằng cách nhấn vào nút \"Đoạn quảng cáo bắt đầu vào lúc này\" hoặc trong trình phát video bằng các nút trên thanh trình phát."
|
||||
},
|
||||
"helpPageSubmitting2": {
|
||||
"message": "Bạn nhấp 1 lần vào nút \"Đoạn quảng cáo bắt đầu vào lúc này\" để bắt đầu 1 phân đoạn, nhấn 2 lần để đánh dấu kết thúc phân đoạn đó. Bạn có thể chuẩn bị nhiều phân đoạn trước khi nhấn gửi. Nhấp vào nút \"Đăng đoạn quảng cáo\" sẽ gửi. Nhấp vào nút \"Xoá đoạn quảng cáo\" để xóa."
|
||||
},
|
||||
"Editing": {
|
||||
"message": "Chỉnh sửa"
|
||||
},
|
||||
"helpPageEditing1": {
|
||||
"message": "Nếu bạn muốn chỉnh sửa thời gian phân đoạn hoặc kiểu của phân đoạn, bạn có thể chỉnh sửa hoặc xóa các phân đoạn của mình sau khi nhấp vào nút \"Đăng đoạn quảng cáo\"."
|
||||
},
|
||||
"helpPageTooSlow": {
|
||||
"message": "Quá chậm"
|
||||
"message": "Nếu như bạn cảm thấy thao tác ở trên quá chậm..."
|
||||
},
|
||||
"helpPageTooSlow1": {
|
||||
"message": "Bạn có thể sử dụng các hotkeys - phím nóng. Nhấn phím dấu chấm phẩy (;) để chỉ ra điểm bắt đầu / kết thúc của phân đoạn nhà tài trợ và nhấp vào dấu nháy đơn (') để gửi. Nếu bạn không sử dụng QWERTY, có lẽ bạn nên thay đổi keybinding bằng cách vào phần cài đặt của tiện ích."
|
||||
},
|
||||
"helpPageCopyOfDatabase": {
|
||||
"message": "Tôi có thể lấy bản sao của database không? Điều gì xảy ra nếu có chuyện tệ (server chết, chủ nhân trang web mất, ...)?"
|
||||
},
|
||||
"helpPageCopyOfDatabase1": {
|
||||
"message": "Database được công khai và luôn có sẵn tại "
|
||||
},
|
||||
"helpPageCopyOfDatabase2": {
|
||||
"message": "Mã nguồn mở cũng luôn có sẵn. Vì vậy, ngay cả khi có điều gì đó tệ, các phân đoạn cũng sẽ không biến mất."
|
||||
},
|
||||
"helpPageNews": {
|
||||
"message": "Tôi có thể cập nhật tin tức ở đâu?"
|
||||
},
|
||||
"helpPageSourceCode": {
|
||||
"message": "Bạn có thể tìm thấy source code ở đâu?"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "Lời cảm ơn đến"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "Tìm hiểu thêm"
|
||||
},
|
||||
"CopyDownvoteButtonInfo": {
|
||||
"message": "Hạ bình chọn và tạo một bản sao cục bộ cho bạn gửi lại"
|
||||
},
|
||||
"OpenCategoryWikiPage": {
|
||||
"message": "Mở trang wiki của danh mục này để tìm hiểu thêm."
|
||||
},
|
||||
"CopyAndDownvote": {
|
||||
"message": "Sao chép và hạ bình chọn"
|
||||
},
|
||||
"ContinueVoting": {
|
||||
"message": "Tiếp tục bỏ phiếu"
|
||||
},
|
||||
"ChangeCategoryTooltip": {
|
||||
"message": "Điều này sẽ ngay lập tức áp dụng cho phân đoạn của bạn"
|
||||
},
|
||||
"SponsorTimeEditScrollNewFeature": {
|
||||
"message": "Sử dụng con lăn chuột của bạn khi di chuột qua hộp chỉnh sửa để nhanh chóng điều chỉnh thời gian. Kết hợp phím ctrl hoặc shift có thể được sử dụng để tinh chỉnh các thay đổi."
|
||||
},
|
||||
"fillerNewFeature": {
|
||||
"message": "Mới! Bỏ qua các phân đoạn phụ và joke với danh mục \"Cảnh phụ\". Bật trong tùy chọn"
|
||||
},
|
||||
"dayAbbreviation": {
|
||||
"message": "d",
|
||||
"description": "100d"
|
||||
},
|
||||
"hourAbbreviation": {
|
||||
"message": "h",
|
||||
"description": "100h"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,18 +179,12 @@
|
||||
"hideInfoButton": {
|
||||
"message": "在 Youtube 播放器上隐藏信息按钮"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "此按钮用于在 Youtube 页面中打开弹窗。"
|
||||
},
|
||||
"hideDeleteButton": {
|
||||
"message": "在 Youtube 播放器上隐藏删除按钮"
|
||||
},
|
||||
"showDeleteButton": {
|
||||
"message": "在 Youtube 播放器上显示删除按钮"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "此按钮用于在 Youtube 播放器中清除所有赞助商广告。"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "启用跳过次数统计跟踪"
|
||||
},
|
||||
@@ -365,9 +359,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "显示上传按钮"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "在您选择了时间并准备提交后,此按钮会出现在 Youtube 播放器中。"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock 服务器地址"
|
||||
},
|
||||
@@ -575,9 +566,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "不正确/错误的时间"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "错误的类别"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "此视频的分类为音乐。 您确定其中包含赞助商广告吗?如果这是“非音乐片段”,请打开扩展选项并启用此类别。 之后,您可以以“非音乐”而不是赞助商广告类别提交此片段。如果您不太明白,请阅读指南。"
|
||||
},
|
||||
|
||||
@@ -185,9 +185,6 @@
|
||||
"hideInfoButton": {
|
||||
"message": "在 YouTube 播放器上隱藏資訊按鈕"
|
||||
},
|
||||
"whatInfoButton": {
|
||||
"message": "這個按鈕可用來在 YouTube 頁面打開彈出視窗"
|
||||
},
|
||||
"autoHideInfoButton": {
|
||||
"message": "自動隱藏資訊按鈕"
|
||||
},
|
||||
@@ -197,9 +194,6 @@
|
||||
"showDeleteButton": {
|
||||
"message": "在 YouTube 播放器上顯示刪除按鈕"
|
||||
},
|
||||
"whatDeleteButton": {
|
||||
"message": "這個按鈕可用來在 YouTube 播放器清除所有未提交的片段"
|
||||
},
|
||||
"enableViewTracking": {
|
||||
"message": "啟用跳過次數追蹤"
|
||||
},
|
||||
@@ -287,6 +281,10 @@
|
||||
"skip_category": {
|
||||
"message": "跳過 {0}?"
|
||||
},
|
||||
"muted": {
|
||||
"message": "{0} 已靜音",
|
||||
"description": "Example: Sponsor Muted"
|
||||
},
|
||||
"disableAutoSkip": {
|
||||
"message": "停用自動跳過"
|
||||
},
|
||||
@@ -342,7 +340,7 @@
|
||||
"message": "警告:更改用戶 ID 是永久性的。您確定要這麼做嗎?請務必備份您的舊用戶 ID 來以防萬一。"
|
||||
},
|
||||
"createdBy": {
|
||||
"message": "創建者"
|
||||
"message": "作者"
|
||||
},
|
||||
"keybindCurrentlySet": {
|
||||
"message": "。它目前被設定為:"
|
||||
@@ -396,9 +394,6 @@
|
||||
"showUploadButton": {
|
||||
"message": "顯示上傳按鈕"
|
||||
},
|
||||
"whatUploadButton": {
|
||||
"message": "在您選擇了時間範圍並準備提交後,此按鈕會出現在 YouTube 播放器中。"
|
||||
},
|
||||
"customServerAddress": {
|
||||
"message": "SponsorBlock 伺服器地址"
|
||||
},
|
||||
@@ -641,9 +636,6 @@
|
||||
"downvoteDescription": {
|
||||
"message": "不正確/錯誤的時間"
|
||||
},
|
||||
"incorrectCategory": {
|
||||
"message": "錯誤的類別"
|
||||
},
|
||||
"nonMusicCategoryOnMusic": {
|
||||
"message": "這個影片被分類為音樂。您確定這有贊助內容嗎?如果這其實是\"非音樂片段\"的話,開啟擴充功能設定並啟用這個類別。接下來您即可提交這個片段為\"非音樂片段\"。如果您感到困惑,請閱讀方針"
|
||||
},
|
||||
@@ -677,7 +669,16 @@
|
||||
"hideForever": {
|
||||
"message": "永久隱藏"
|
||||
},
|
||||
"Submitting": {
|
||||
"message": "正在提交"
|
||||
},
|
||||
"Editing": {
|
||||
"message": "編輯中"
|
||||
},
|
||||
"Credits": {
|
||||
"message": "致謝"
|
||||
},
|
||||
"LearnMore": {
|
||||
"message": "了解更多"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#previewbar {
|
||||
overflow: visible;
|
||||
padding: 0;
|
||||
@@ -22,6 +26,11 @@
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* Make sure settings are upfront */
|
||||
.ytp-settings-menu {
|
||||
z-index: 6000 !important;
|
||||
}
|
||||
|
||||
/* Preview Bar page hacks */
|
||||
|
||||
.ytp-tooltip:not(.sponsorCategoryTooltipVisible) .sponsorCategoryTooltip {
|
||||
@@ -82,13 +91,13 @@
|
||||
.autoHiding:not(.hidden) {
|
||||
transform: translateX(0%) scale(1);
|
||||
/* opacity is from YouTube page */
|
||||
transition: transform 0.25s, width 0.25s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
|
||||
transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
|
||||
}
|
||||
|
||||
.autoHiding.hidden {
|
||||
transform: translateX(100%) scale(0);
|
||||
/* opacity is from YouTube page */
|
||||
transition: transform 0.25s, width 0.25s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
|
||||
transition: transform 0.2s, width 0.2s, opacity .1s cubic-bezier(0.4,0.0,1,1) !important;
|
||||
|
||||
width: 0px !important;
|
||||
}
|
||||
@@ -97,10 +106,6 @@
|
||||
transform: translateX(-100%) scale(0);
|
||||
}
|
||||
|
||||
.playerButton.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sponsorSkipObject {
|
||||
font-family: Roboto, Arial, Helvetica, sans-serif;
|
||||
|
||||
@@ -217,7 +222,7 @@
|
||||
|
||||
/* if two are very close to eachother */
|
||||
.secondSkipNotice {
|
||||
bottom: 250px;
|
||||
bottom: 290px;
|
||||
}
|
||||
|
||||
.noticeLeftIcon {
|
||||
@@ -254,12 +259,16 @@
|
||||
|
||||
.sponsorTimesVoteButtonsContainer {
|
||||
float: left;
|
||||
|
||||
vertical-align:middle;
|
||||
padding: 2px 5px;
|
||||
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.sponsorTimesVoteButtonsContainer div{
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeRightSection {
|
||||
right: 0;
|
||||
position: absolute;
|
||||
@@ -286,6 +295,10 @@
|
||||
float: right;
|
||||
}
|
||||
|
||||
.sponsorSkipNoticeCloseButton.biggerCloseButton {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.sponsorSkipMessage {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
@@ -294,6 +307,7 @@
|
||||
margin-top: auto;
|
||||
display: inline-block;
|
||||
margin-right: 10px;
|
||||
margin-bottom: auto;
|
||||
}
|
||||
|
||||
.sponsorSkipInfo {
|
||||
@@ -330,7 +344,8 @@
|
||||
}
|
||||
|
||||
.voteButton {
|
||||
height: 17px;
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.voteButton:hover {
|
||||
@@ -521,12 +536,35 @@ input::-webkit-inner-spin-button {
|
||||
.skipButtonControlBarContainer {
|
||||
cursor: pointer;
|
||||
display: flex;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.skipButtonControlBarContainer.hidden {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.skipButtonControlBarContainer.mobile {
|
||||
bottom: 30%;
|
||||
margin-left: 5px;
|
||||
position: absolute;
|
||||
height: 20px;
|
||||
|
||||
background-color: #00000030;
|
||||
opacity: 0.5;
|
||||
border-radius: 10px;
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
.skipButtonControlBarContainer.mobile.textDisabled {
|
||||
padding: 0;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.skipButtonControlBarContainer.mobile > div {
|
||||
margin: auto;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
#sbSkipIconControlBarImage {
|
||||
height: 60%;
|
||||
top: 0px;
|
||||
@@ -535,6 +573,11 @@ input::-webkit-inner-spin-button {
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.mobile #sbSkipIconControlBarImage {
|
||||
height: 100%;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.sponsorBlockTooltip {
|
||||
position: absolute;
|
||||
background-color: rgba(28, 28, 28, 0.7);
|
||||
@@ -554,4 +597,19 @@ input::-webkit-inner-spin-button {
|
||||
border-width: 15px;
|
||||
border-style: solid;
|
||||
border-color: rgba(28, 28, 28, 0.7) transparent transparent transparent;
|
||||
}
|
||||
}
|
||||
|
||||
.sponsorBlockLockedColor {
|
||||
color: #ffc83d;
|
||||
}
|
||||
|
||||
.sponsorBlockRectangleTooltip {
|
||||
position: absolute;
|
||||
border-radius: 5px;
|
||||
padding: 10px;
|
||||
min-width: 250px;
|
||||
min-height: 75px;
|
||||
white-space: normal;
|
||||
line-height: 1.5em;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<head>
|
||||
<title> SponsorBlock </title>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
|
||||
<link href="styles.css" rel="stylesheet"/>
|
||||
|
||||
@@ -39,7 +40,7 @@
|
||||
__MSG_helpPageFeatureDisclaimer__
|
||||
</p>
|
||||
|
||||
<iframe src="../options/options.html#embed" width="100%" height="500px" style="border: none"></iframe>
|
||||
<iframe class="optionsFrame" src="../options/options.html#embed" style="border: none"></iframe>
|
||||
|
||||
<h1>__MSG_helpPageHowSkippingWorks__</h1>
|
||||
|
||||
@@ -56,14 +57,12 @@
|
||||
__MSG_helpPageHowSkippingWorks2__
|
||||
</p>
|
||||
|
||||
<div class="center"><img height="120px" src="images/voting on notice.gif"></div>
|
||||
<div class="center"><img src="images/voting on notice.gif"></div>
|
||||
|
||||
<h1>__MSG_Submitting__</h1>
|
||||
|
||||
<p class="projectPreview">
|
||||
<span class="projectPreviewImageLargeRight">
|
||||
<img src="https://i.imgur.com/A1ilk6x.gif">
|
||||
</span>
|
||||
<img class="projectPreviewImageLarge" src="https://i.imgur.com/A1ilk6x.gif">
|
||||
|
||||
__MSG_helpPageSubmitting1__
|
||||
|
||||
|
||||
@@ -40,14 +40,6 @@ body {
|
||||
transform: translateY(-20%);
|
||||
}
|
||||
|
||||
.projectPreviewImageLargeRight {
|
||||
position: absolute;
|
||||
right: -210px;
|
||||
width: 200px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
.createdBy {
|
||||
font-size: 14px;
|
||||
text-align: center;
|
||||
@@ -142,18 +134,9 @@ p,li,code,a {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
@media screen and (orientation:portrait) {
|
||||
p,li,code,a {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.projectPreviewImage {
|
||||
position: unset;
|
||||
width: 130px;
|
||||
display: block;
|
||||
margin: auto;
|
||||
transform: none;
|
||||
}
|
||||
.optionsFrame {
|
||||
width: 100%;
|
||||
height: 500px;
|
||||
}
|
||||
|
||||
.previewImage {
|
||||
@@ -187,4 +170,33 @@ svg {
|
||||
|
||||
#sbDonate {
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
@media screen and (orientation:portrait) {
|
||||
.projectPreviewImage {
|
||||
position: unset;
|
||||
width: 50%;
|
||||
display: block;
|
||||
margin: auto;
|
||||
transform: none;
|
||||
}
|
||||
|
||||
.projectPreviewImageLarge {
|
||||
position: unset;
|
||||
left: 0;
|
||||
width: 50%;
|
||||
display: block;
|
||||
margin: auto;
|
||||
transform: unset;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 100%;
|
||||
margin: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
p,li,code,a {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
58
public/icons/thumbs_down_locked.svg
Normal file
58
public/icons/thumbs_down_locked.svg
Normal file
@@ -0,0 +1,58 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
width="24"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="thumbs_down.svg"
|
||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||
<metadata
|
||||
id="metadata12">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="730"
|
||||
inkscape:window-height="480"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="svg6" />
|
||||
<path
|
||||
d="M0 0h24v24H0z"
|
||||
fill="none"
|
||||
id="path2" />
|
||||
<path
|
||||
d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"
|
||||
id="path4"
|
||||
style="fill:#ffc83d" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -46,6 +46,7 @@
|
||||
width: 330px;
|
||||
padding: 22px;
|
||||
text-align: center;
|
||||
margin-bottom: var(--ytd-margin-6x);
|
||||
}
|
||||
|
||||
#issueReporterTimeButtons > .votingButtons > .segmentTimeButton {
|
||||
|
||||
@@ -80,8 +80,6 @@ chrome.runtime.onInstalled.addListener(function () {
|
||||
const newUserID = utils.generateUserID();
|
||||
//save this UUID
|
||||
Config.config.userID = newUserID;
|
||||
|
||||
Config.config.highlightCategoryUpdate = true;
|
||||
}
|
||||
}, 1500);
|
||||
});
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import * as React from "react";
|
||||
|
||||
import Config from "../config"
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import { Category, CategorySkipOption } from "../types";
|
||||
|
||||
import { getCategoryActionType } from "../utils/categoryUtils";
|
||||
@@ -93,6 +94,10 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
|
||||
<td
|
||||
colSpan={2}>
|
||||
{chrome.i18n.getMessage("category_" + this.props.category + "_description")}
|
||||
{' '}
|
||||
<a href={CompileConfig.wikiLinks[this.props.category]} target="_blank" rel="noreferrer">
|
||||
{`${chrome.i18n.getMessage("LearnMore")}`}
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
@@ -16,8 +16,6 @@ export interface NoticeProps {
|
||||
timed?: boolean,
|
||||
idSuffix?: string,
|
||||
|
||||
videoSpeed?: () => number,
|
||||
|
||||
fadeIn?: boolean,
|
||||
startFaded?: boolean,
|
||||
firstColumn?: React.ReactElement,
|
||||
@@ -33,6 +31,7 @@ export interface NoticeProps {
|
||||
|
||||
zIndex?: number,
|
||||
style?: React.CSSProperties
|
||||
biggerCloseButton?: boolean;
|
||||
}
|
||||
|
||||
export interface NoticeState {
|
||||
@@ -50,7 +49,6 @@ export interface NoticeState {
|
||||
|
||||
class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
countdownInterval: NodeJS.Timeout;
|
||||
intervalVideoSpeed: number;
|
||||
|
||||
idSuffix: string;
|
||||
|
||||
@@ -151,7 +149,8 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
{/* Close button */}
|
||||
<img src={chrome.extension.getURL("icons/close.png")}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"
|
||||
className={"sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"
|
||||
+ (this.props.biggerCloseButton ? " biggerCloseButton" : "")}
|
||||
onClick={() => this.close()}>
|
||||
</img>
|
||||
</td>
|
||||
@@ -257,10 +256,6 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
|
||||
const countdownTime = Math.min(this.state.countdownTime - 1, this.state.maxCountdownTime());
|
||||
|
||||
if (this.props.videoSpeed && this.intervalVideoSpeed != this.props.videoSpeed()) {
|
||||
this.setupInterval();
|
||||
}
|
||||
|
||||
if (countdownTime <= 0) {
|
||||
//remove this from setInterval
|
||||
clearInterval(this.countdownInterval);
|
||||
@@ -274,8 +269,8 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
if (countdownTime == 3) {
|
||||
//start fade out animation
|
||||
const notice = document.getElementById("sponsorSkipNotice" + this.idSuffix);
|
||||
notice.style.removeProperty("animation");
|
||||
notice.classList.add("sponsorSkipNoticeFadeOut");
|
||||
notice?.style.removeProperty("animation");
|
||||
notice?.classList.add("sponsorSkipNoticeFadeOut");
|
||||
}
|
||||
|
||||
this.setState({
|
||||
@@ -323,10 +318,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
|
||||
setupInterval(): void {
|
||||
if (this.countdownInterval) clearInterval(this.countdownInterval);
|
||||
|
||||
const intervalDuration = this.props.videoSpeed ? 1000 / this.props.videoSpeed() : 1000;
|
||||
this.countdownInterval = setInterval(this.countdown.bind(this), intervalDuration);
|
||||
|
||||
if (this.props.videoSpeed) this.intervalVideoSpeed = this.props.videoSpeed();
|
||||
this.countdownInterval = setInterval(this.countdown.bind(this), 1000);
|
||||
}
|
||||
|
||||
resetCountdown(): void {
|
||||
|
||||
@@ -1,17 +1,25 @@
|
||||
import * as React from "react";
|
||||
import * as CompileConfig from "../../config.json";
|
||||
import Config from "../config"
|
||||
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType } from "../types";
|
||||
import { Category, ContentContainer, CategoryActionType, SponsorHideType, SponsorTime, NoticeVisbilityMode, ActionType, SponsorSourceType, SegmentUUID } from "../types";
|
||||
import NoticeComponent from "./NoticeComponent";
|
||||
import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
|
||||
import SubmissionNotice from "../render/SubmissionNotice";
|
||||
import Utils from "../utils";
|
||||
const utils = new Utils();
|
||||
|
||||
import { getCategoryActionType, getSkippingText } from "../utils/categoryUtils";
|
||||
|
||||
import ThumbsUpSvg from "../svg-icons/thumbs_up_svg";
|
||||
import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
|
||||
import PencilSvg from "../svg-icons/pencil_svg";
|
||||
|
||||
export enum SkipNoticeAction {
|
||||
None,
|
||||
Upvote,
|
||||
Downvote,
|
||||
CategoryVote,
|
||||
CopyDownvote,
|
||||
Unskip
|
||||
}
|
||||
|
||||
@@ -43,7 +51,7 @@ export interface SkipNoticeState {
|
||||
skipButtonCallback?: (index: number) => void;
|
||||
showSkipButton?: boolean;
|
||||
|
||||
downvoting?: boolean;
|
||||
editing?: boolean;
|
||||
choosingCategory?: boolean;
|
||||
thanksForVotingText?: string; //null until the voting buttons should be hidden
|
||||
|
||||
@@ -52,6 +60,10 @@ export interface SkipNoticeState {
|
||||
showKeybindHint?: boolean;
|
||||
|
||||
smaller?: boolean;
|
||||
|
||||
voted?: SkipNoticeAction[];
|
||||
copied?: SkipNoticeAction[];
|
||||
|
||||
}
|
||||
|
||||
class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeState> {
|
||||
@@ -62,13 +74,16 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
amountOfPreviousNotices: number;
|
||||
showInSecondSlot: boolean;
|
||||
audio: HTMLAudioElement;
|
||||
|
||||
idSuffix: string;
|
||||
|
||||
noticeRef: React.MutableRefObject<NoticeComponent>;
|
||||
categoryOptionRef: React.RefObject<HTMLSelectElement>;
|
||||
|
||||
selectedColor: string;
|
||||
unselectedColor: string;
|
||||
lockedColor: string;
|
||||
|
||||
// Used to update on config change
|
||||
configListener: () => void;
|
||||
|
||||
@@ -80,7 +95,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.segments = props.segments;
|
||||
this.autoSkip = props.autoSkip;
|
||||
this.contentContainer = props.contentContainer;
|
||||
this.audio = null;
|
||||
|
||||
const noticeTitle = getSkippingText(this.segments, this.props.autoSkip);
|
||||
|
||||
@@ -94,12 +108,16 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.segments.sort((a, b) => a.segment[0] - b.segment[0]);
|
||||
}
|
||||
|
||||
//this is the suffix added at the end of every id
|
||||
// This is the suffix added at the end of every id
|
||||
for (const segment of this.segments) {
|
||||
this.idSuffix += segment.UUID;
|
||||
}
|
||||
this.idSuffix += this.amountOfPreviousNotices;
|
||||
|
||||
this.selectedColor = Config.config.colorPalette.red;
|
||||
this.unselectedColor = Config.config.colorPalette.white;
|
||||
this.lockedColor = Config.config.colorPalette.locked;
|
||||
|
||||
// Setup state
|
||||
this.state = {
|
||||
noticeTitle,
|
||||
@@ -115,7 +133,7 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
skipButtonCallback: (index) => this.unskip(index),
|
||||
showSkipButton: true,
|
||||
|
||||
downvoting: false,
|
||||
editing: false,
|
||||
choosingCategory: false,
|
||||
thanksForVotingText: null,
|
||||
|
||||
@@ -123,7 +141,11 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
showKeybindHint: this.props.showKeybindHint ?? true,
|
||||
|
||||
smaller: this.props.smaller ?? false
|
||||
smaller: this.props.smaller ?? false,
|
||||
|
||||
// Keep track of what segment the user interacted with.
|
||||
voted: new Array(this.props.segments.length).fill(SkipNoticeAction.None),
|
||||
copied: new Array(this.props.segments.length).fill(SkipNoticeAction.None),
|
||||
}
|
||||
|
||||
if (!this.autoSkip) {
|
||||
@@ -132,13 +154,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
componentDidMount(): void {
|
||||
if (Config.config.audioNotificationOnSkip && this.audio) {
|
||||
this.audio.volume = this.contentContainer().v.volume * 0.1;
|
||||
if (this.autoSkip) this.audio.play();
|
||||
}
|
||||
}
|
||||
|
||||
render(): React.ReactElement {
|
||||
const noticeStyle: React.CSSProperties = { }
|
||||
if (this.contentContainer().onMobileYouTube) {
|
||||
@@ -162,8 +177,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|| (Config.config.noticeVisibilityMode >= NoticeVisbilityMode.FadedForAutoSkip && this.autoSkip)}
|
||||
timed={true}
|
||||
maxCountdownTime={this.state.maxCountdownTime}
|
||||
videoSpeed={() => this.contentContainer().v?.playbackRate}
|
||||
style={noticeStyle}
|
||||
biggerCloseButton={this.contentContainer().onMobileYouTube}
|
||||
ref={this.noticeRef}
|
||||
closeListener={() => this.closeListener()}
|
||||
smaller={this.state.smaller}
|
||||
@@ -171,10 +186,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
firstColumn={firstColumn}
|
||||
bottomRow={[...this.getMessageBoxes(), ...this.getBottomRow() ]}
|
||||
onMouseEnter={() => this.onMouseEnter() } >
|
||||
|
||||
{(Config.config.audioNotificationOnSkip) && <audio ref={(source) => { this.audio = source; }}>
|
||||
<source src={chrome.extension.getURL("icons/beep.ogg")} type="audio/ogg"></source>
|
||||
</audio>}
|
||||
</NoticeComponent>
|
||||
);
|
||||
}
|
||||
@@ -186,29 +197,38 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
key={0}>
|
||||
|
||||
{/* Vote Button Container */}
|
||||
{!this.state.thanksForVotingText ?
|
||||
{!this.state.thanksForVotingText ?
|
||||
<td id={"sponsorTimesVoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorTimesVoteButtonsContainer">
|
||||
|
||||
{/* Upvote Button */}
|
||||
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorSkipObject voteButton"
|
||||
style={{marginRight: "10px"}}
|
||||
src={chrome.extension.getURL("icons/thumbs_up.svg")}
|
||||
title={chrome.i18n.getMessage("upvoteButtonInfo")}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
|
||||
|
||||
</img>
|
||||
<div id={"sponsorTimesDownvoteButtonsContainerUpvote" + this.idSuffix}
|
||||
className="voteButton"
|
||||
style={{marginRight: "5px"}}
|
||||
title={chrome.i18n.getMessage("upvoteButtonInfo")}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Upvote)}>
|
||||
<ThumbsUpSvg fill={(this.state.actionState === SkipNoticeAction.Upvote) ? this.selectedColor : this.unselectedColor} />
|
||||
</div>
|
||||
|
||||
{/* Report Button */}
|
||||
<img id={"sponsorTimesDownvoteButtonsContainer" + this.idSuffix}
|
||||
className="sponsorSkipObject voteButton"
|
||||
src={chrome.extension.getURL("icons/thumbs_down.svg")}
|
||||
title={chrome.i18n.getMessage("reportButtonInfo")}
|
||||
onClick={() => this.adjustDownvotingState(true)}>
|
||||
|
||||
</img>
|
||||
<div id={"sponsorTimesDownvoteButtonsContainerDownvote" + this.idSuffix}
|
||||
className="voteButton"
|
||||
style={{marginRight: "5px", marginLeft: "5px"}}
|
||||
title={chrome.i18n.getMessage("reportButtonInfo")}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
|
||||
<ThumbsDownSvg fill={this.downvoteButtonColor(SkipNoticeAction.Downvote)} />
|
||||
</div>
|
||||
|
||||
{/* Copy and Downvote Button */}
|
||||
<div id={"sponsorTimesDownvoteButtonsContainerCopyDownvote" + this.idSuffix}
|
||||
className="voteButton"
|
||||
style={{marginLeft: "5px"}}
|
||||
onClick={() => this.openEditingOptions()}>
|
||||
<PencilSvg fill={this.state.editing === true
|
||||
|| this.state.actionState === SkipNoticeAction.CopyDownvote
|
||||
|| this.state.choosingCategory === true
|
||||
? this.selectedColor : this.unselectedColor} />
|
||||
</div>
|
||||
</td>
|
||||
|
||||
:
|
||||
@@ -216,7 +236,22 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
<td id={"sponsorTimesVoteButtonInfoMessage" + this.idSuffix}
|
||||
className="sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"
|
||||
style={{marginRight: "10px"}}>
|
||||
{this.state.thanksForVotingText}
|
||||
|
||||
{/* Submitted string */}
|
||||
<span style={{marginRight: "10px"}}>
|
||||
{this.state.thanksForVotingText}
|
||||
</span>
|
||||
|
||||
{/* Continue Voting Button */}
|
||||
<button id={"sponsorTimesContinueVotingContainer" + this.idSuffix}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
title={"Continue Voting"}
|
||||
onClick={() => this.setState({
|
||||
thanksForVotingText: null,
|
||||
messages: []
|
||||
})}>
|
||||
{chrome.i18n.getMessage("ContinueVoting")}
|
||||
</button>
|
||||
</td>
|
||||
}
|
||||
|
||||
@@ -229,45 +264,46 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
key={1}>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"
|
||||
onClick={this.contentContainer().dontShowNoticeAgain}>
|
||||
|
||||
{chrome.i18n.getMessage("Hide")}
|
||||
</button>
|
||||
</td>
|
||||
}
|
||||
</tr>),
|
||||
|
||||
/* Downvote Options Row */
|
||||
(this.state.downvoting &&
|
||||
<tr id={"sponsorSkipNoticeDownvoteOptionsRow" + this.idSuffix}
|
||||
/* Edit Segments Row */
|
||||
(this.state.editing && !this.state.thanksForVotingText && !(this.state.choosingCategory || this.state.actionState === SkipNoticeAction.CopyDownvote) &&
|
||||
<tr id={"sponsorSkipNoticeEditSegmentsRow" + this.idSuffix}
|
||||
key={2}>
|
||||
<td id={"sponsorTimesDownvoteOptionsContainer" + this.idSuffix}>
|
||||
<td id={"sponsorTimesEditSegmentsContainer" + this.idSuffix}>
|
||||
|
||||
{/* Normal downvote */}
|
||||
{/* Copy Segment */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Downvote)}>
|
||||
{chrome.i18n.getMessage("downvoteDescription")}
|
||||
title={chrome.i18n.getMessage("CopyDownvoteButtonInfo")}
|
||||
style={{color: this.downvoteButtonColor(SkipNoticeAction.Downvote)}}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.CopyDownvote)}>
|
||||
{chrome.i18n.getMessage("CopyAndDownvote")}
|
||||
</button>
|
||||
|
||||
{/* Category vote */}
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
onClick={() => this.openCategoryChooser()}>
|
||||
|
||||
title={chrome.i18n.getMessage("ChangeCategoryTooltip")}
|
||||
style={{color: (this.state.actionState === SkipNoticeAction.CategoryVote && this.state.editing == true) ? this.selectedColor : this.unselectedColor}}
|
||||
onClick={() => this.resetStateToStart(SkipNoticeAction.CategoryVote, true, true)}>
|
||||
{chrome.i18n.getMessage("incorrectCategory")}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
),
|
||||
|
||||
/* Category Chooser Row */
|
||||
(this.state.choosingCategory &&
|
||||
(this.state.choosingCategory && !this.state.thanksForVotingText &&
|
||||
<tr id={"sponsorSkipNoticeCategoryChooserRow" + this.idSuffix}
|
||||
key={3}>
|
||||
<td>
|
||||
{/* Category Selector */}
|
||||
<select id={"sponsorTimeCategories" + this.idSuffix}
|
||||
className="sponsorTimeCategories"
|
||||
defaultValue={this.segments[0].category} //Just default to the first segment, as we don't know which they'll choose
|
||||
className="sponsorTimeCategories sponsorTimeEditSelector"
|
||||
defaultValue={this.segments[0].category}
|
||||
ref={this.categoryOptionRef}>
|
||||
|
||||
{this.getCategoryOptions()}
|
||||
@@ -281,13 +317,12 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
{chrome.i18n.getMessage("submit")}
|
||||
</button>
|
||||
}
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
),
|
||||
|
||||
/* Segment Chooser Row */
|
||||
(this.state.actionState !== SkipNoticeAction.None &&
|
||||
(this.state.actionState !== SkipNoticeAction.None && this.segments.length > 1 && !this.state.thanksForVotingText &&
|
||||
<tr id={"sponsorSkipNoticeSubmissionOptionsRow" + this.idSuffix}
|
||||
key={4}>
|
||||
<td id={"sponsorTimesSubmissionOptionsContainer" + this.idSuffix}>
|
||||
@@ -302,13 +337,22 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
if (this.state.showSkipButton && (this.segments.length > 1
|
||||
|| getCategoryActionType(this.segments[0].category) !== CategoryActionType.POI
|
||||
|| this.props.unskipTime)) {
|
||||
|
||||
const style: React.CSSProperties = {
|
||||
marginLeft: "4px",
|
||||
color: (this.state.actionState === SkipNoticeAction.Unskip) ? this.selectedColor : this.unselectedColor
|
||||
};
|
||||
if (this.contentContainer().onMobileYouTube) {
|
||||
style.padding = "20px";
|
||||
style.minWidth = "100px";
|
||||
}
|
||||
|
||||
return (
|
||||
<span className="sponsorSkipNoticeUnskipSection">
|
||||
<button id={"sponsorSkipUnskipButton" + this.idSuffix}
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={{marginLeft: "4px"}}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||
|
||||
className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={style}
|
||||
onClick={() => this.prepAction(SkipNoticeAction.Unskip)}>
|
||||
{this.state.skipButtonText + (this.state.showKeybindHint ? " (" + Config.config.skipKeybind + ")" : "")}
|
||||
</button>
|
||||
</span>
|
||||
@@ -318,20 +362,40 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
getSubmissionChooser(): JSX.Element[] {
|
||||
const elements: JSX.Element[] = [];
|
||||
|
||||
for (let i = 0; i < this.segments.length; i++) {
|
||||
elements.push(
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style={{opacity: this.getSubmissionChooserOpacity(i),
|
||||
color: this.getSubmissionChooserColor(i)}}
|
||||
onClick={() => this.performAction(i)}
|
||||
key={"submission" + i + this.segments[i].category + this.idSuffix}>
|
||||
{(i + 1) + ". " + chrome.i18n.getMessage("category_" + this.segments[i].category)}
|
||||
</button>
|
||||
);
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
getSubmissionChooserOpacity(index: number): number {
|
||||
const isUpvote = this.state.actionState === SkipNoticeAction.Upvote;
|
||||
const isDownvote = this.state.actionState == SkipNoticeAction.Downvote;
|
||||
const isCopyDownvote = this.state.actionState == SkipNoticeAction.CopyDownvote;
|
||||
const shouldBeGray: boolean = (isUpvote && this.state.voted[index] == SkipNoticeAction.Upvote) ||
|
||||
(isDownvote && this.state.voted[index] == SkipNoticeAction.Downvote) ||
|
||||
(isCopyDownvote && this.state.copied[index] == SkipNoticeAction.CopyDownvote);
|
||||
|
||||
return shouldBeGray ? 0.35 : 1;
|
||||
}
|
||||
|
||||
getSubmissionChooserColor(index: number): string {
|
||||
const isDownvote = this.state.actionState == SkipNoticeAction.Downvote;
|
||||
const isCopyDownvote = this.state.actionState == SkipNoticeAction.CopyDownvote;
|
||||
const shouldWarnUser = Config.config.isVip && (isDownvote || isCopyDownvote)
|
||||
&& this.segments[index].locked === 1;
|
||||
|
||||
return shouldWarnUser ? this.lockedColor : this.unselectedColor;
|
||||
}
|
||||
|
||||
onMouseEnter(): void {
|
||||
if (this.state.smaller) {
|
||||
this.setState({
|
||||
@@ -340,16 +404,6 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
prepAction(action: SkipNoticeAction): void {
|
||||
if (this.segments.length === 1) {
|
||||
this.performAction(0, action);
|
||||
} else {
|
||||
this.setState({
|
||||
actionState: action
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
getMessageBoxes(): JSX.Element[] {
|
||||
if (this.state.messages.length === 0) {
|
||||
// Add a spacer if there is no text
|
||||
@@ -365,8 +419,8 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
|
||||
for (let i = 0; i < this.state.messages.length; i++) {
|
||||
elements.push(
|
||||
<tr>
|
||||
<td>
|
||||
<tr key={i + "_messageBox"}>
|
||||
<td key={i + "_messageBox"}>
|
||||
<NoticeTextSelectionComponent idSuffix={this.idSuffix}
|
||||
text={this.state.messages[i]}
|
||||
onClick={this.state.messageOnClick}
|
||||
@@ -380,6 +434,33 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
return elements;
|
||||
}
|
||||
|
||||
prepAction(action: SkipNoticeAction): void {
|
||||
if (this.segments.length === 1) {
|
||||
this.performAction(0, action);
|
||||
} else {
|
||||
switch (action ?? this.state.actionState) {
|
||||
case SkipNoticeAction.None:
|
||||
this.resetStateToStart();
|
||||
break;
|
||||
case SkipNoticeAction.Upvote:
|
||||
this.resetStateToStart(SkipNoticeAction.Upvote);
|
||||
break;
|
||||
case SkipNoticeAction.Downvote:
|
||||
this.resetStateToStart(SkipNoticeAction.Downvote);
|
||||
break;
|
||||
case SkipNoticeAction.CategoryVote:
|
||||
this.resetStateToStart(SkipNoticeAction.CategoryVote, true, true);
|
||||
break;
|
||||
case SkipNoticeAction.CopyDownvote:
|
||||
this.resetStateToStart(SkipNoticeAction.CopyDownvote, true);
|
||||
break;
|
||||
case SkipNoticeAction.Unskip:
|
||||
this.resetStateToStart(SkipNoticeAction.Unskip);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs the action from the current state
|
||||
*
|
||||
@@ -388,74 +469,110 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
performAction(index: number, action?: SkipNoticeAction): void {
|
||||
switch (action ?? this.state.actionState) {
|
||||
case SkipNoticeAction.None:
|
||||
this.noAction(index);
|
||||
break;
|
||||
case SkipNoticeAction.Upvote:
|
||||
this.contentContainer().vote(1, this.segments[index].UUID, undefined, this);
|
||||
this.upvote(index);
|
||||
break;
|
||||
case SkipNoticeAction.Downvote:
|
||||
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
|
||||
this.downvote(index);
|
||||
break;
|
||||
case SkipNoticeAction.CategoryVote:
|
||||
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value as Category, this)
|
||||
this.categoryVote(index);
|
||||
break;
|
||||
case SkipNoticeAction.CopyDownvote:
|
||||
this.copyDownvote(index);
|
||||
break;
|
||||
case SkipNoticeAction.Unskip:
|
||||
this.state.skipButtonCallback(index);
|
||||
this.unskipAction(index);
|
||||
break;
|
||||
default:
|
||||
this.resetStateToStart();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
noAction(index: number): void {
|
||||
const voted = this.state.voted;
|
||||
voted[index] = SkipNoticeAction.None;
|
||||
|
||||
this.setState({
|
||||
actionState: SkipNoticeAction.None
|
||||
voted
|
||||
});
|
||||
}
|
||||
|
||||
adjustDownvotingState(value: boolean): void {
|
||||
if (!value) this.clearConfigListener();
|
||||
upvote(index: number): void {
|
||||
if (this.segments.length === 1) this.resetStateToStart();
|
||||
this.contentContainer().vote(1, this.segments[index].UUID, undefined, this);
|
||||
}
|
||||
|
||||
downvote(index: number): void {
|
||||
if (this.segments.length === 1) this.resetStateToStart();
|
||||
|
||||
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
|
||||
}
|
||||
|
||||
categoryVote(index: number): void {
|
||||
this.contentContainer().vote(undefined, this.segments[index].UUID, this.categoryOptionRef.current.value as Category, this)
|
||||
}
|
||||
|
||||
copyDownvote(index: number): void {
|
||||
const sponsorVideoID = this.props.contentContainer().sponsorVideoID;
|
||||
const sponsorTimesSubmitting : SponsorTime = {
|
||||
segment: this.segments[index].segment,
|
||||
UUID: utils.generateUserID() as SegmentUUID,
|
||||
category: this.segments[index].category,
|
||||
actionType: this.segments[index].actionType,
|
||||
source: SponsorSourceType.Local
|
||||
};
|
||||
|
||||
const segmentTimes = Config.config.segmentTimes.get(sponsorVideoID) || [];
|
||||
segmentTimes.push(sponsorTimesSubmitting);
|
||||
Config.config.segmentTimes.set(sponsorVideoID, segmentTimes);
|
||||
|
||||
this.props.contentContainer().sponsorTimesSubmitting.push(sponsorTimesSubmitting);
|
||||
this.props.contentContainer().updatePreviewBar();
|
||||
this.props.contentContainer().resetSponsorSubmissionNotice();
|
||||
this.props.contentContainer().updateEditButtonsOnPlayer();
|
||||
|
||||
this.contentContainer().vote(0, this.segments[index].UUID, undefined, this);
|
||||
|
||||
const copied = this.state.copied;
|
||||
copied[index] = SkipNoticeAction.CopyDownvote;
|
||||
|
||||
this.setState({
|
||||
downvoting: value,
|
||||
choosingCategory: false
|
||||
copied
|
||||
});
|
||||
}
|
||||
|
||||
clearConfigListener(): void {
|
||||
if (this.configListener) {
|
||||
Config.configListeners.splice(Config.configListeners.indexOf(this.configListener), 1);
|
||||
this.configListener = null;
|
||||
}
|
||||
unskipAction(index: number): void {
|
||||
this.state.skipButtonCallback(index);
|
||||
}
|
||||
|
||||
openCategoryChooser(): void {
|
||||
// Add as a config listener
|
||||
this.configListener = () => this.forceUpdate();
|
||||
Config.configListeners.push(this.configListener);
|
||||
|
||||
this.setState({
|
||||
choosingCategory: true,
|
||||
downvoting: false
|
||||
}, () => {
|
||||
if (this.segments.length > 1) {
|
||||
// Use the action selectors as a submit button
|
||||
this.prepAction(SkipNoticeAction.CategoryVote);
|
||||
}
|
||||
});
|
||||
openEditingOptions(): void {
|
||||
this.resetStateToStart(undefined, true);
|
||||
}
|
||||
|
||||
getCategoryOptions(): React.ReactElement[] {
|
||||
const elements = [];
|
||||
|
||||
const categories = CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable));
|
||||
const categories = (CompileConfig.categoryList.filter((cat => getCategoryActionType(cat as Category) === CategoryActionType.Skippable))) as Category[];
|
||||
for (const category of categories) {
|
||||
elements.push(
|
||||
<option value={category}
|
||||
key={category}>
|
||||
key={category}
|
||||
className={this.getCategoryNameClass(category)}>
|
||||
{chrome.i18n.getMessage("category_" + category)}
|
||||
</option>
|
||||
);
|
||||
}
|
||||
|
||||
return elements;
|
||||
}
|
||||
|
||||
getCategoryNameClass(category: string): string {
|
||||
return this.props.contentContainer().lockedCategories.includes(category) ? "sponsorBlockLockedColor" : ""
|
||||
}
|
||||
|
||||
unskip(index: number): void {
|
||||
this.contentContainer().unskipSponsorTime(this.segments[index], this.props.unskipTime);
|
||||
|
||||
@@ -512,21 +629,42 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
|
||||
afterVote(segment: SponsorTime, type: number, category: Category): void {
|
||||
const index = utils.getSponsorIndexFromUUID(this.segments, segment.UUID);
|
||||
const wikiLinkText = CompileConfig.wikiLinks[segment.category];
|
||||
|
||||
const voted = this.state.voted;
|
||||
switch (type) {
|
||||
case 0:
|
||||
this.clearConfigListener();
|
||||
this.setNoticeInfoMessageWithOnClick(() => window.open(wikiLinkText), chrome.i18n.getMessage("OpenCategoryWikiPage"));
|
||||
|
||||
voted[index] = SkipNoticeAction.Downvote;
|
||||
break;
|
||||
case 1:
|
||||
voted[index] = SkipNoticeAction.Upvote;
|
||||
break;
|
||||
case 20:
|
||||
voted[index] = SkipNoticeAction.None;
|
||||
break;
|
||||
}
|
||||
|
||||
this.setState({
|
||||
voted
|
||||
});
|
||||
|
||||
this.addVoteButtonInfo(chrome.i18n.getMessage("voted"));
|
||||
|
||||
if (type === 0) {
|
||||
this.setNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"));
|
||||
this.adjustDownvotingState(false);
|
||||
}
|
||||
|
||||
// Change the sponsor locally
|
||||
if (segment) {
|
||||
if (type === 0) {
|
||||
segment.hidden = SponsorHideType.Downvoted;
|
||||
} else if (category) {
|
||||
segment.category = category;
|
||||
segment.category = category; // This is the actual segment on the video page
|
||||
this.segments[index].category = category; //this is the segment inside the skip notice.
|
||||
} else if (type === 1) {
|
||||
segment.hidden = SponsorHideType.Visible;
|
||||
}
|
||||
|
||||
|
||||
this.contentContainer().updatePreviewBar();
|
||||
}
|
||||
}
|
||||
@@ -562,6 +700,13 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
this.props.closeListener();
|
||||
}
|
||||
|
||||
clearConfigListener(): void {
|
||||
if (this.configListener) {
|
||||
Config.configListeners.splice(Config.configListeners.indexOf(this.configListener), 1);
|
||||
this.configListener = null;
|
||||
}
|
||||
}
|
||||
|
||||
unmutedListener(): void {
|
||||
if (this.props.segments.length === 1
|
||||
&& this.props.segments[0].actionType === ActionType.Mute
|
||||
@@ -572,6 +717,26 @@ class SkipNoticeComponent extends React.Component<SkipNoticeProps, SkipNoticeSta
|
||||
}
|
||||
}
|
||||
|
||||
resetStateToStart(actionState: SkipNoticeAction = SkipNoticeAction.None, editing = false, choosingCategory = false): void {
|
||||
this.setState({
|
||||
actionState: actionState,
|
||||
editing: editing,
|
||||
choosingCategory: choosingCategory,
|
||||
thanksForVotingText: null,
|
||||
messages: []
|
||||
});
|
||||
}
|
||||
|
||||
downvoteButtonColor(downvoteType: SkipNoticeAction): string {
|
||||
// Also used for "Copy and Downvote"
|
||||
if (this.segments.length > 1) {
|
||||
return (this.state.actionState === downvoteType) ? this.selectedColor : this.unselectedColor;
|
||||
} else {
|
||||
// You dont have segment selectors so the lockbutton needs to be colored and cannot be selected.
|
||||
return Config.config.isVip && this.segments[0].locked === 1 ? this.lockedColor : this.unselectedColor;
|
||||
}
|
||||
}
|
||||
|
||||
private getUnskipText(): string {
|
||||
switch (this.props.segments[0].actionType) {
|
||||
case ActionType.Mute: {
|
||||
|
||||
@@ -5,6 +5,7 @@ import { ActionType, ActionTypes, Category, CategoryActionType, ContentContainer
|
||||
import Utils from "../utils";
|
||||
import { getCategoryActionType } from "../utils/categoryUtils";
|
||||
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
|
||||
import { RectangleTooltip } from "../render/RectangleTooltip";
|
||||
|
||||
|
||||
const utils = new Utils();
|
||||
@@ -23,6 +24,7 @@ export interface SponsorTimeEditProps {
|
||||
export interface SponsorTimeEditState {
|
||||
editing: boolean;
|
||||
sponsorTimeEdits: [string, string];
|
||||
selectedCategory: Category;
|
||||
}
|
||||
|
||||
const DEFAULT_CATEGORY = "chooseACategory";
|
||||
@@ -36,6 +38,9 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
configUpdateListener: () => void;
|
||||
|
||||
previousSkipType: CategoryActionType;
|
||||
timeBeforeChangingToPOI: number; // Initialized when first selecting POI
|
||||
|
||||
constructor(props: SponsorTimeEditProps) {
|
||||
super(props);
|
||||
|
||||
@@ -44,9 +49,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
|
||||
this.idSuffix = this.props.idSuffix;
|
||||
|
||||
this.previousSkipType = CategoryActionType.Skippable;
|
||||
this.state = {
|
||||
editing: false,
|
||||
sponsorTimeEdits: [null, null]
|
||||
sponsorTimeEdits: [null, null],
|
||||
selectedCategory: DEFAULT_CATEGORY as Category
|
||||
};
|
||||
}
|
||||
|
||||
@@ -56,6 +63,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
event.stopPropagation();
|
||||
});
|
||||
|
||||
// Prevent scrolling while changing times
|
||||
document.getElementById("sponsorTimesContainer" + this.idSuffix).addEventListener('wheel', function (event) {
|
||||
event.preventDefault();
|
||||
}, {passive: false});
|
||||
|
||||
// Add as a config listener
|
||||
if (!this.configUpdateListener) {
|
||||
this.configUpdateListener = () => this.configUpdate();
|
||||
@@ -86,7 +98,6 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
node.style.setProperty("text-shadow", "none", "important");
|
||||
}
|
||||
};
|
||||
|
||||
// Create time display
|
||||
let timeDisplay: JSX.Element;
|
||||
const sponsorTime = this.props.contentContainer().sponsorTimesSubmitting[this.props.index];
|
||||
@@ -101,20 +112,13 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
onClick={() => this.setTimeToNow(0)}>
|
||||
{chrome.i18n.getMessage("bracketNow")}
|
||||
</span>
|
||||
|
||||
<input id={"submittingTime0" + this.idSuffix}
|
||||
className="sponsorTimeEdit sponsorTimeEditInput"
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="text"
|
||||
value={this.state.sponsorTimeEdits[0]}
|
||||
onChange={(e) => {
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
sponsorTimeEdits[0] = e.target.value;
|
||||
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = e.target.value;
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
this.saveEditTimes();
|
||||
}}>
|
||||
onChange={(e) => {this.handleOnChange(0, e, sponsorTime, e.target.value)}}
|
||||
onWheel={(e) => {this.changeTimesWhenScrolling(0, e, sponsorTime)}}>
|
||||
</input>
|
||||
|
||||
{getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable ? (
|
||||
@@ -128,14 +132,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
ref={oldYouTubeDarkStyles}
|
||||
type="text"
|
||||
value={this.state.sponsorTimeEdits[1]}
|
||||
onChange={(e) => {
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
sponsorTimeEdits[1] = e.target.value;
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
|
||||
this.saveEditTimes();
|
||||
}}>
|
||||
onChange={(e) => {this.handleOnChange(1, e, sponsorTime, e.target.value)}}
|
||||
onWheel={(e) => {this.changeTimesWhenScrolling(1, e, sponsorTime)}}>
|
||||
</input>
|
||||
|
||||
<span id={"nowButton1" + this.idSuffix}
|
||||
@@ -155,12 +153,13 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
);
|
||||
} else {
|
||||
timeDisplay = (
|
||||
|
||||
<div id={"sponsorTimesContainer" + this.idSuffix}
|
||||
className="sponsorTimeDisplay"
|
||||
onClick={this.toggleEditTime.bind(this)}>
|
||||
{utils.getFormattedTime(segment[0], true) +
|
||||
((!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable)
|
||||
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
|
||||
? " " + chrome.i18n.getMessage("to") + " " + utils.getFormattedTime(segment[1], true) : "")}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@@ -216,7 +215,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
{(!isNaN(segment[1]) && getCategoryActionType(sponsorTime.category) === CategoryActionType.Skippable) ? (
|
||||
<span id={"sponsorTimePreviewButton" + this.idSuffix}
|
||||
className="sponsorTimeEditButton"
|
||||
onClick={this.previewTime.bind(this)}>
|
||||
onClick={(e) => this.previewTime(e.ctrlKey, e.shiftKey)}>
|
||||
{chrome.i18n.getMessage("preview")}
|
||||
</span>
|
||||
): ""}
|
||||
@@ -240,6 +239,70 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
);
|
||||
}
|
||||
|
||||
handleOnChange(index: number, e: React.ChangeEvent, sponsorTime: SponsorTime, targetValue: string): void {
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
|
||||
// check if change is small engough to show tooltip
|
||||
const before = utils.getFormattedTimeToSeconds(sponsorTimeEdits[index]);
|
||||
const after = utils.getFormattedTimeToSeconds(targetValue);
|
||||
const difference = Math.abs(before - after);
|
||||
if (0 < difference && difference< 0.5) this.showToolTip();
|
||||
|
||||
sponsorTimeEdits[index] = targetValue;
|
||||
if (index === 0 && getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = targetValue;
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
this.saveEditTimes();
|
||||
}
|
||||
changeTimesWhenScrolling(index: number, e: React.WheelEvent, sponsorTime: SponsorTime): void {
|
||||
let step = 0;
|
||||
// shift + ctrl = 1
|
||||
// ctrl = 0.1
|
||||
// default = 0.01
|
||||
// shift = 0.001
|
||||
if (e.shiftKey) {
|
||||
step = (e.ctrlKey) ? 1 : 0.001;
|
||||
} else {
|
||||
step = (e.ctrlKey) ? 0.1 : 0.01;
|
||||
}
|
||||
|
||||
const sponsorTimeEdits = this.state.sponsorTimeEdits;
|
||||
let timeAsNumber = utils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[index]);
|
||||
if (timeAsNumber !== null && e.deltaY != 0) {
|
||||
if (e.deltaY < 0) {
|
||||
timeAsNumber += step;
|
||||
} else if (timeAsNumber >= step) {
|
||||
timeAsNumber -= step;
|
||||
} else {
|
||||
timeAsNumber = 0;
|
||||
}
|
||||
sponsorTimeEdits[index] = utils.getFormattedTime(timeAsNumber, true);
|
||||
if (getCategoryActionType(sponsorTime.category) === CategoryActionType.POI) sponsorTimeEdits[1] = sponsorTimeEdits[0];
|
||||
|
||||
this.setState({sponsorTimeEdits});
|
||||
this.saveEditTimes();
|
||||
}
|
||||
}
|
||||
|
||||
showToolTip(): void {
|
||||
if (!Config.config.scrollToEditTimeUpdate && document.getElementById("sponsorRectangleTooltip" + "sponsorTimesContainer" + this.idSuffix) === null) {
|
||||
const element = document.getElementById("sponsorTimesContainer" + this.idSuffix);
|
||||
new RectangleTooltip({
|
||||
text: chrome.i18n.getMessage("SponsorTimeEditScrollNewFeature"),
|
||||
referenceNode: element.parentElement,
|
||||
prependElement: element,
|
||||
timeout: 15,
|
||||
bottomOffset: 0 + "px",
|
||||
leftOffset: -318 + "px",
|
||||
backgroundColor: "rgba(28, 28, 28, 1.0)",
|
||||
htmlId: "sponsorTimesContainer" + this.idSuffix,
|
||||
buttonFunction: () => { Config.config.scrollToEditTimeUpdate = true },
|
||||
fontSize: "14px",
|
||||
maxHeight: "200px"
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
getCategoryOptions(): React.ReactElement[] {
|
||||
const elements = [(
|
||||
<option value={DEFAULT_CATEGORY}
|
||||
@@ -251,7 +314,8 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
for (const category of (this.props.categoryList ?? CompileConfig.categoryList)) {
|
||||
elements.push(
|
||||
<option value={category}
|
||||
key={category}>
|
||||
key={category}
|
||||
className={this.getCategoryLockedClass(category)}>
|
||||
{chrome.i18n.getMessage("category_" + category)}
|
||||
</option>
|
||||
);
|
||||
@@ -260,6 +324,10 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
return elements;
|
||||
}
|
||||
|
||||
getCategoryLockedClass(category: string): string {
|
||||
return this.props.contentContainer().lockedCategories.includes(category) ? "sponsorBlockLockedColor" : "";
|
||||
}
|
||||
|
||||
categorySelectionChange(event: React.ChangeEvent<HTMLSelectElement>): void {
|
||||
// See if show more categories was pressed
|
||||
if (event.target.value !== DEFAULT_CATEGORY && !Config.config.categorySelections.some((category) => category.name === event.target.value)) {
|
||||
@@ -277,6 +345,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
}
|
||||
|
||||
if (getCategoryActionType(event.target.value as Category) === CategoryActionType.POI) {
|
||||
if (this.previousSkipType === CategoryActionType.Skippable) this.timeBeforeChangingToPOI = utils.getFormattedTimeToSeconds(this.state.sponsorTimeEdits[1]);
|
||||
this.setTimeTo(1, null);
|
||||
this.props.contentContainer().updateEditButtonsOnPlayer();
|
||||
|
||||
@@ -284,8 +353,11 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
.some((segment, i) => segment.category === event.target.value && 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();
|
||||
}
|
||||
|
||||
@@ -374,13 +446,17 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
|
||||
this.props.contentContainer().updatePreviewBar();
|
||||
}
|
||||
|
||||
previewTime(): void {
|
||||
previewTime(ctrlPressed = false, shiftPressed = false): void {
|
||||
const sponsorTimes = this.props.contentContainer().sponsorTimesSubmitting;
|
||||
const index = this.props.index;
|
||||
|
||||
const skipTime = sponsorTimes[index].segment[0];
|
||||
|
||||
this.props.contentContainer().previewTime(skipTime - (2 * this.props.contentContainer().v.playbackRate));
|
||||
let seekTime = 2;
|
||||
if (ctrlPressed) seekTime = 0.5;
|
||||
if (shiftPressed) seekTime = 0.25;
|
||||
|
||||
this.props.contentContainer().previewTime(skipTime - (seekTime * this.props.contentContainer().v.playbackRate));
|
||||
}
|
||||
|
||||
inspectTime(): void {
|
||||
|
||||
@@ -73,7 +73,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
idSuffix={this.state.idSuffix}
|
||||
ref={this.noticeRef}
|
||||
closeListener={this.cancel.bind(this)}
|
||||
zIndex={50000}>
|
||||
zIndex={5000}>
|
||||
|
||||
{/* Text Boxes */}
|
||||
{this.getMessageBoxes()}
|
||||
@@ -123,7 +123,7 @@ class SubmissionNoticeComponent extends React.Component<SubmissionNoticeProps, S
|
||||
const timeRef = React.createRef<SponsorTimeEditComponent>();
|
||||
|
||||
elements.push(
|
||||
<SponsorTimeEditComponent key={i}
|
||||
<SponsorTimeEditComponent key={sponsorTimes[i].UUID}
|
||||
idSuffix={this.state.idSuffix + i}
|
||||
index={i}
|
||||
contentContainer={this.props.contentContainer}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
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";
|
||||
|
||||
interface SBConfig {
|
||||
userID: string,
|
||||
/** Contains unsubmitted segments that the user has created. */
|
||||
isVip: boolean,
|
||||
lastIsVipUpdate: number,
|
||||
/* Contains unsubmitted segments that the user has created. */
|
||||
segmentTimes: SBMap<string, SponsorTime[]>,
|
||||
defaultCategory: Category,
|
||||
whitelistedChannels: string[],
|
||||
@@ -43,7 +46,12 @@ interface SBConfig {
|
||||
showDonationLink: boolean,
|
||||
autoHideInfoButton: boolean,
|
||||
autoSkipOnMusicVideos: boolean,
|
||||
highlightCategoryUpdate: boolean
|
||||
colorPalette: {
|
||||
red: string,
|
||||
white: string,
|
||||
locked: string
|
||||
},
|
||||
scrollToEditTimeUpdate: boolean,
|
||||
|
||||
// What categories should be skipped
|
||||
categorySelections: CategorySelection[],
|
||||
@@ -67,6 +75,8 @@ interface SBConfig {
|
||||
"preview-music_offtopic": PreviewBarOption,
|
||||
"poi_highlight": PreviewBarOption,
|
||||
"preview-poi_highlight": PreviewBarOption,
|
||||
"filler": PreviewBarOption,
|
||||
"preview-filler": PreviewBarOption,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,6 +161,8 @@ const Config: SBObject = {
|
||||
configListeners: [],
|
||||
defaults: {
|
||||
userID: null,
|
||||
isVip: false,
|
||||
lastIsVipUpdate: 0,
|
||||
segmentTimes: new SBMap("segmentTimes"),
|
||||
defaultCategory: "chooseACategory" as Category,
|
||||
whitelistedChannels: [],
|
||||
@@ -176,7 +188,7 @@ const Config: SBObject = {
|
||||
hideSkipButtonPlayerControls: false,
|
||||
hideDiscordLaunches: 0,
|
||||
hideDiscordLink: false,
|
||||
invidiousInstances: ["invidious.snopyta.org"],
|
||||
invidiousInstances: ["invidious.snopyta.org"], // leave as default
|
||||
supportInvidious: false,
|
||||
serverAddress: CompileConfig.serverAddress,
|
||||
minDuration: 0,
|
||||
@@ -190,13 +202,22 @@ const Config: SBObject = {
|
||||
showDonationLink: true,
|
||||
autoHideInfoButton: true,
|
||||
autoSkipOnMusicVideos: false,
|
||||
highlightCategoryUpdate: false, // TODO: Remove this once update is done
|
||||
scrollToEditTimeUpdate: false, // false means the tooltip will be shown
|
||||
|
||||
categorySelections: [{
|
||||
name: "sponsor" as Category,
|
||||
option: CategorySkipOption.AutoSkip
|
||||
}, {
|
||||
name: "poi_highlight" as Category,
|
||||
option: CategorySkipOption.ManualSkip
|
||||
}],
|
||||
|
||||
colorPalette: {
|
||||
red: "#780303",
|
||||
white: "#ffffff",
|
||||
locked: "#ffc83d"
|
||||
},
|
||||
|
||||
// Preview bar
|
||||
barTypes: {
|
||||
"preview-chooseACategory": {
|
||||
@@ -266,6 +287,14 @@ const Config: SBObject = {
|
||||
"preview-poi_highlight": {
|
||||
color: "#9b044c",
|
||||
opacity: "0.7"
|
||||
},
|
||||
"filler": {
|
||||
color: "#7300FF",
|
||||
opacity: "0.9"
|
||||
},
|
||||
"preview-filler": {
|
||||
color: "#2E0066",
|
||||
opacity: "0.7"
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -362,16 +391,14 @@ function fetchConfig(): Promise<void> {
|
||||
}
|
||||
|
||||
function migrateOldFormats(config: SBConfig) {
|
||||
// Should eventually move into defaults
|
||||
if (!config["highlightCategoryAdded"] && !config.categorySelections.some((s) => s.name === "poi_highlight")) {
|
||||
config["highlightCategoryAdded"] = true;
|
||||
|
||||
config.categorySelections.push({
|
||||
name: "poi_highlight" as Category,
|
||||
option: CategorySkipOption.ManualSkip
|
||||
});
|
||||
|
||||
config.categorySelections = config.categorySelections;
|
||||
if (config["fillerUpdate"] !== undefined) {
|
||||
chrome.storage.sync.remove("fillerUpdate");
|
||||
}
|
||||
if (config["highlightCategoryAdded"] !== undefined) {
|
||||
chrome.storage.sync.remove("highlightCategoryAdded");
|
||||
}
|
||||
if (config["highlightCategoryUpdate"] !== undefined) {
|
||||
chrome.storage.sync.remove("highlightCategoryUpdate");
|
||||
}
|
||||
|
||||
if (config["askAboutUnlistedVideos"]) {
|
||||
@@ -407,6 +434,11 @@ function migrateOldFormats(config: SBConfig) {
|
||||
if (config["previousVideoID"] !== undefined) {
|
||||
chrome.storage.sync.remove("previousVideoID");
|
||||
}
|
||||
|
||||
// populate invidiousInstances with new instances if 3p support is **DISABLED**
|
||||
if (!config["supportInvidious"] && config["invidiousInstances"].length !== invidiousList.length) {
|
||||
config["invidiousInstances"] = invidiousList;
|
||||
}
|
||||
}
|
||||
|
||||
async function setupConfig() {
|
||||
|
||||
201
src/content.ts
201
src/content.ts
@@ -16,6 +16,8 @@ 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 { getControls } from "./utils/pageUtils";
|
||||
|
||||
// Hack to get the CSS loaded on permission-based sites (Invidious)
|
||||
utils.wait(() => Config.config !== null, 5000, 10).then(addCSS);
|
||||
@@ -32,8 +34,10 @@ let activeSkipKeybindElement: ToggleSkippable = null;
|
||||
|
||||
// JSON video info
|
||||
let videoInfo: VideoInfo = null;
|
||||
//the channel this video is about
|
||||
// The channel this video is about
|
||||
let channelIDInfo: ChannelIDInfo;
|
||||
// Locked Categories in this tab, like: ["sponsor","intro","outro"]
|
||||
let lockedCategories: Category[] = [];
|
||||
|
||||
// Skips are scheduled to ensure precision.
|
||||
// Skips are rescheduled every seeking event.
|
||||
@@ -119,7 +123,8 @@ const skipNoticeContentContainer: ContentContainer = () => ({
|
||||
updateEditButtonsOnPlayer,
|
||||
previewTime,
|
||||
videoInfo,
|
||||
getRealCurrentTime: getRealCurrentTime
|
||||
getRealCurrentTime: getRealCurrentTime,
|
||||
lockedCategories
|
||||
});
|
||||
|
||||
// value determining when to count segment as skipped and send telemetry to server (percent based)
|
||||
@@ -146,7 +151,8 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
//send the sponsor times along with if it's found
|
||||
sendResponse({
|
||||
found: sponsorDataFound,
|
||||
sponsorTimes: sponsorTimes
|
||||
sponsorTimes: sponsorTimes,
|
||||
onMobileYouTube
|
||||
});
|
||||
|
||||
if (!request.updating && popupInitialised && document.getElementById("sponsorBlockPopupContainer") != null) {
|
||||
@@ -186,7 +192,8 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
|
||||
case "refreshSegments":
|
||||
sponsorsLookup(sponsorVideoID, false).then(() => sendResponse({
|
||||
found: sponsorDataFound,
|
||||
sponsorTimes: sponsorTimes
|
||||
sponsorTimes: sponsorTimes,
|
||||
onMobileYouTube
|
||||
}));
|
||||
|
||||
return true;
|
||||
@@ -229,6 +236,7 @@ function resetValues() {
|
||||
status: ChannelIDStatus.Fetching,
|
||||
id: null
|
||||
};
|
||||
lockedCategories = [];
|
||||
|
||||
//empty the preview bar
|
||||
if (previewBar !== null) {
|
||||
@@ -330,6 +338,8 @@ async function videoIDChange(id) {
|
||||
function handleMobileControlsMutations(): void {
|
||||
updateVisibilityOfPlayerControlsButton();
|
||||
|
||||
skipButtonControlBar?.updateMobileControls();
|
||||
|
||||
if (previewBar !== null) {
|
||||
if (document.body.contains(previewBar.container)) {
|
||||
const progressBarBackground = document.querySelector<HTMLElement>(".progress-bar-background");
|
||||
@@ -453,7 +463,7 @@ function startSponsorSchedule(includeIntersectingSegments = false, currentTime?:
|
||||
}
|
||||
|
||||
// Don't skip if this category should not be skipped
|
||||
if (!shouldSkip(currentSkip) && skipInfo.array !== sponsorTimesSubmitting) return;
|
||||
if (!shouldSkip(currentSkip) && !sponsorTimesSubmitting?.some((segment) => segment.segment === currentSkip.segment)) return;
|
||||
|
||||
const skippingFunction = () => {
|
||||
let forcedSkipTime: number = null;
|
||||
@@ -551,13 +561,17 @@ function setupVideoListeners() {
|
||||
switchingVideos = false;
|
||||
|
||||
video.addEventListener('play', () => {
|
||||
switchingVideos = false;
|
||||
|
||||
// If it is not the first event, then the only way to get to 0 is if there is a seek event
|
||||
// This check makes sure that changing the video resolution doesn't cause the extension to think it
|
||||
// gone back to the begining
|
||||
if (!firstEvent && video.currentTime === 0) return;
|
||||
firstEvent = false;
|
||||
|
||||
if (switchingVideos) {
|
||||
switchingVideos = false;
|
||||
// If already segments loaded before video, retry to skip starting segments
|
||||
if (sponsorTimes) startSkipScheduleCheckingForStartSponsors();
|
||||
}
|
||||
|
||||
// Check if an ad is playing
|
||||
updateAdFlag();
|
||||
@@ -590,22 +604,6 @@ function setupVideoListeners() {
|
||||
|
||||
startSponsorSchedule();
|
||||
}
|
||||
|
||||
if (!Config.config.dontShowNotice) {
|
||||
const currentPoiSegment = sponsorTimes?.find((segment) =>
|
||||
getCategoryActionType(segment.category) === CategoryActionType.POI &&
|
||||
video.currentTime - segment.segment[0] > 0 &&
|
||||
video.currentTime - segment.segment[0] < previewBar.getMinimumSize(true));
|
||||
if (currentPoiSegment && !skipNotices.some((notice) => notice.segments.some((s) => s.UUID === currentPoiSegment.UUID))) {
|
||||
skipToTime({
|
||||
v: video,
|
||||
skipTime: currentPoiSegment.segment,
|
||||
skippingSegments: [currentPoiSegment],
|
||||
openNotice: true,
|
||||
forceAutoSkip: true
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
video.addEventListener('ratechange', () => startSponsorSchedule());
|
||||
// Used by videospeed extension (https://github.com/igrigorik/videospeed/pull/740)
|
||||
@@ -631,7 +629,8 @@ function setupSkipButtonControlBar() {
|
||||
skippingSegments: [segment],
|
||||
openNotice: true,
|
||||
forceAutoSkip: true
|
||||
})
|
||||
}),
|
||||
onMobileYouTube
|
||||
});
|
||||
}
|
||||
|
||||
@@ -657,19 +656,31 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
categories.push(categorySelection.name);
|
||||
}
|
||||
|
||||
const extraRequestData: Record<string, unknown> = {};
|
||||
const windowHash = window.location.hash.substr(1);
|
||||
if (windowHash) {
|
||||
const params: Record<string, unknown> = windowHash.split('&').reduce((acc, param) => {
|
||||
const [key, value] = param.split('=');
|
||||
acc[key] = value;
|
||||
return acc;
|
||||
}, {});
|
||||
|
||||
if (params.requiredSegment) extraRequestData.requiredSegment = params.requiredSegment;
|
||||
}
|
||||
|
||||
// Check for hashPrefix setting
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
|
||||
categories,
|
||||
actionTypes: Config.config.muteSegments ? [ActionType.Skip, ActionType.Mute] : [ActionType.Skip],
|
||||
userAgent: `${chrome.runtime.id}`
|
||||
userAgent: `${chrome.runtime.id}`,
|
||||
...extraRequestData
|
||||
});
|
||||
|
||||
if (response?.ok) {
|
||||
const recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
|
||||
?.filter((video) => video.videoID === id)
|
||||
?.map((video) => video.segments)[0]
|
||||
?.filter((segment) => segment.videoDuration === 0 || Math.abs(video.duration - segment.videoDuration) < 2);
|
||||
?.map((video) => video.segments)[0];
|
||||
if (!recievedSegments || !recievedSegments.length) {
|
||||
// return if no video found
|
||||
retryFetch();
|
||||
@@ -738,6 +749,55 @@ async function sponsorsLookup(id: string, keepOldSubmissions = true) {
|
||||
|
||||
sponsorLookupRetries++;
|
||||
}
|
||||
|
||||
lookupVipInformation(id);
|
||||
}
|
||||
|
||||
function lookupVipInformation(id: string): void {
|
||||
updateVipInfo().then((isVip) => {
|
||||
if (isVip) {
|
||||
lockedCategoriesLookup(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
async function updateVipInfo(): Promise<boolean> {
|
||||
const currentTime = Date.now();
|
||||
const lastUpdate = Config.config.lastIsVipUpdate;
|
||||
if (currentTime - lastUpdate > 1000 * 60 * 60 * 72) { // 72 hours
|
||||
Config.config.lastIsVipUpdate = currentTime;
|
||||
|
||||
const response = await utils.asyncRequestToServer("GET", "/api/isUserVIP", { userID: Config.config.userID});
|
||||
|
||||
if (response.ok) {
|
||||
let isVip = false;
|
||||
try {
|
||||
const vipResponse = JSON.parse(response.responseText)?.vip;
|
||||
if (typeof(vipResponse) === "boolean") {
|
||||
isVip = vipResponse;
|
||||
}
|
||||
} catch (e) { } //eslint-disable-line no-empty
|
||||
|
||||
Config.config.isVip = isVip;
|
||||
return isVip;
|
||||
}
|
||||
}
|
||||
|
||||
return Config.config.isVip;
|
||||
}
|
||||
|
||||
async function lockedCategoriesLookup(id: string): Promise<void> {
|
||||
const hashPrefix = (await utils.getHash(id, 1)).substr(0, 4);
|
||||
const response = await utils.asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
|
||||
|
||||
if (response.ok) {
|
||||
try {
|
||||
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === id)[0]?.categories;
|
||||
if (Array.isArray(categoriesResponse)) {
|
||||
lockedCategories = categoriesResponse;
|
||||
}
|
||||
} catch (e) { } //eslint-disable-line no-empty
|
||||
}
|
||||
}
|
||||
|
||||
function retryFetch(): void {
|
||||
@@ -760,24 +820,27 @@ function retryFetch(): void {
|
||||
* Ex. When segments are first loaded
|
||||
*/
|
||||
function startSkipScheduleCheckingForStartSponsors() {
|
||||
if (!switchingVideos) {
|
||||
if (!switchingVideos && sponsorTimes) {
|
||||
// See if there are any starting sponsors
|
||||
let startingSegmentTime = -1;
|
||||
let startingSegmentTime = getStartTimeFromUrl(document.URL) || -1;
|
||||
let found = false;
|
||||
let startingSegment: SponsorTime = null;
|
||||
for (const time of sponsorTimes) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (startingSegmentTime === -1) {
|
||||
if (!found) {
|
||||
for (const time of sponsorTimesSubmitting) {
|
||||
if (time.segment[0] <= video.currentTime && time.segment[0] > startingSegmentTime && time.segment[1] > video.currentTime
|
||||
&& getCategoryActionType(time.category) === CategoryActionType.Skippable) {
|
||||
startingSegmentTime = time.segment[0];
|
||||
startingSegment = time;
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -834,7 +897,7 @@ function getYouTubeVideoID(url: string): string | boolean {
|
||||
if(url.startsWith("https://www.youtube.com/tv#/")) url = url.replace("#", "");
|
||||
|
||||
//Attempt to parse url
|
||||
let urlObject = null;
|
||||
let urlObject: URL = null;
|
||||
try {
|
||||
urlObject = new URL(url);
|
||||
} catch (e) {
|
||||
@@ -860,9 +923,10 @@ function getYouTubeVideoID(url: string): string | boolean {
|
||||
if (urlObject.searchParams.has("v") && ["/watch", "/watch/"].includes(urlObject.pathname) || urlObject.pathname.startsWith("/tv/watch")) {
|
||||
const id = urlObject.searchParams.get("v");
|
||||
return id.length == 11 ? id : false;
|
||||
} else if (urlObject.pathname.startsWith("/embed/")) {
|
||||
} else if (urlObject.pathname.startsWith("/embed/") || urlObject.pathname.startsWith("/shorts/")) {
|
||||
try {
|
||||
return urlObject.pathname.substr(7, 11);
|
||||
const id = urlObject.pathname.split("/")[2];
|
||||
if (id && id.length >= 11) return id.substr(0, 11);
|
||||
} catch (e) {
|
||||
console.error("[SB] Video ID not valid for " + url);
|
||||
return false;
|
||||
@@ -913,7 +977,7 @@ function updatePreviewBar(): void {
|
||||
});
|
||||
});
|
||||
|
||||
previewBar.set(previewBarSegments, video.duration)
|
||||
previewBar.set(previewBarSegments, video?.duration)
|
||||
|
||||
if (Config.config.showTimeWithSkips) {
|
||||
const skippedDuration = utils.getTimestampsDuration(previewBarSegments.map(({segment}) => segment));
|
||||
@@ -1141,6 +1205,9 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
// for some reason you also can't skip to 1 second before the end
|
||||
if (v.loop && v.duration > 1 && skipTime[1] >= v.duration - 1) {
|
||||
v.currentTime = 0;
|
||||
} else if (navigator.vendor === "Apple Computer, Inc." && v.duration > 1 && skipTime[1] >= v.duration) {
|
||||
// MacOS will loop otherwise #1027
|
||||
v.currentTime = v.duration - 0.001;
|
||||
} else {
|
||||
v.currentTime = skipTime[1];
|
||||
}
|
||||
@@ -1155,25 +1222,19 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (autoSkip && Config.config.audioNotificationOnSkip) {
|
||||
const beep = new Audio(chrome.runtime.getURL("icons/beep.ogg"));
|
||||
beep.volume = video.volume * 0.1;
|
||||
beep.play();
|
||||
}
|
||||
|
||||
if (!autoSkip
|
||||
&& skippingSegments.length === 1
|
||||
&& getCategoryActionType(skippingSegments[0].category) === CategoryActionType.POI) {
|
||||
skipButtonControlBar.enable(skippingSegments[0], !Config.config.highlightCategoryUpdate ? 15 : 0);
|
||||
|
||||
if (!Config.config.highlightCategoryUpdate) {
|
||||
new Tooltip({
|
||||
text: chrome.i18n.getMessage("highlightNewFeature"),
|
||||
link: "https://blog.ajay.app/highlight-sponsorblock",
|
||||
referenceNode: skipButtonControlBar.getElement().parentElement,
|
||||
prependElement: skipButtonControlBar.getElement(),
|
||||
timeout: 15
|
||||
});
|
||||
|
||||
Config.config.highlightCategoryUpdate = true;
|
||||
}
|
||||
skipButtonControlBar.enable(skippingSegments[0]);
|
||||
if (onMobileYouTube) skipButtonControlBar.setShowKeybindHint(false);
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
activeSkipKeybindElement = skipButtonControlBar;
|
||||
@@ -1182,6 +1243,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);
|
||||
skipNotices.push(newSkipNotice);
|
||||
|
||||
activeSkipKeybindElement?.setShowKeybindHint(false);
|
||||
@@ -1269,27 +1331,6 @@ function shouldSkip(segment: SponsorTime): boolean {
|
||||
(Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic"));
|
||||
}
|
||||
|
||||
function getControls(): HTMLElement | false {
|
||||
const controlsSelectors = [
|
||||
// YouTube
|
||||
".ytp-right-controls",
|
||||
// Mobile YouTube
|
||||
".player-controls-top",
|
||||
// Invidious/videojs video element's controls element
|
||||
".vjs-control-bar",
|
||||
];
|
||||
|
||||
for (const controlsSelector of controlsSelectors) {
|
||||
const controls = document.querySelectorAll(controlsSelector);
|
||||
|
||||
if (controls && controls.length > 0) {
|
||||
return <HTMLElement> controls[controls.length - 1];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/** Creates any missing buttons on the YouTube player if possible. */
|
||||
async function createButtons(): Promise<void> {
|
||||
if (onMobileYouTube) return;
|
||||
@@ -1381,17 +1422,18 @@ function getRealCurrentTime(): number {
|
||||
|
||||
if (playButtonSVGData === replaceSVGData) {
|
||||
// At the end of the video
|
||||
return video.duration;
|
||||
return video?.duration;
|
||||
} else {
|
||||
return video.currentTime;
|
||||
}
|
||||
}
|
||||
|
||||
function startOrEndTimingNewSegment() {
|
||||
const roundedTime = Math.round((getRealCurrentTime() + Number.EPSILON) * 1000) / 1000;
|
||||
if (!isSegmentCreationInProgress()) {
|
||||
sponsorTimesSubmitting.push({
|
||||
segment: [getRealCurrentTime()],
|
||||
UUID: null,
|
||||
segment: [roundedTime],
|
||||
UUID: utils.generateUserID() as SegmentUUID,
|
||||
category: Config.config.defaultCategory,
|
||||
actionType: ActionType.Skip,
|
||||
source: SponsorSourceType.Local
|
||||
@@ -1400,7 +1442,7 @@ function startOrEndTimingNewSegment() {
|
||||
// Finish creating the new segment
|
||||
const existingSegment = getIncompleteSegment();
|
||||
const existingTime = existingSegment.segment[0];
|
||||
const currentTime = getRealCurrentTime();
|
||||
const currentTime = roundedTime;
|
||||
|
||||
// Swap timestamps if the user put the segment end before the start
|
||||
existingSegment.segment = [Math.min(existingTime, currentTime), Math.max(existingTime, currentTime)];
|
||||
@@ -1597,7 +1639,7 @@ function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?:
|
||||
const sponsorIndex = utils.getSponsorIndexFromUUID(sponsorTimes, UUID);
|
||||
|
||||
// Don't vote for preview sponsors
|
||||
if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].UUID === null) return;
|
||||
if (sponsorIndex == -1 || sponsorTimes[sponsorIndex].source === SponsorSourceType.Local) return;
|
||||
|
||||
// See if the local time saved count and skip count should be saved
|
||||
if (type === 0 && sponsorSkipped[sponsorIndex] || type === 1 && !sponsorSkipped[sponsorIndex]) {
|
||||
@@ -1665,8 +1707,12 @@ function resetSponsorSubmissionNotice() {
|
||||
}
|
||||
|
||||
function submitSponsorTimes() {
|
||||
if (submissionNotice !== null) return;
|
||||
|
||||
if (submissionNotice !== null){
|
||||
submissionNotice.close();
|
||||
submissionNotice = null;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sponsorTimesSubmitting !== undefined && sponsorTimesSubmitting.length > 0) {
|
||||
submissionNotice = new SubmissionNotice(skipNoticeContentContainer, sendSubmitMessage);
|
||||
}
|
||||
@@ -1723,6 +1769,7 @@ async function sendSubmitMessage() {
|
||||
if (recievedNewSegments?.length === newSegments.length) {
|
||||
for (let i = 0; i < recievedNewSegments.length; i++) {
|
||||
newSegments[i].UUID = recievedNewSegments[i].UUID;
|
||||
newSegments[i].source = SponsorSourceType.Server;
|
||||
}
|
||||
}
|
||||
} catch(e) {} // eslint-disable-line no-empty
|
||||
@@ -1881,7 +1928,7 @@ function showTimeWithoutSkips(skippedDuration: number): void {
|
||||
display.appendChild(duration);
|
||||
}
|
||||
|
||||
const durationAfterSkips = utils.getFormattedTime(video.duration - skippedDuration)
|
||||
const durationAfterSkips = utils.getFormattedTime(video?.duration - skippedDuration)
|
||||
|
||||
duration.innerText = (durationAfterSkips == null || skippedDuration <= 0) ? "" : " (" + durationAfterSkips + ")";
|
||||
}
|
||||
|
||||
@@ -197,8 +197,11 @@ class PreviewBar {
|
||||
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[fullCategoryName]?.opacity;
|
||||
|
||||
bar.style.position = "absolute";
|
||||
if (segment[1] - segment[0] > 0) bar.style.width = this.timeToPercentage(segment[1] - segment[0]);
|
||||
bar.style.left = this.timeToPercentage(segment[0]);
|
||||
const duration = Math.min(segment[1], this.videoDuration) - segment[0];
|
||||
if (duration > 0) bar.style.width = this.timeToPercentage(duration);
|
||||
|
||||
const time = segment[1] ? Math.min(this.videoDuration, segment[0]) : segment[0];
|
||||
bar.style.left = this.timeToPercentage(time);
|
||||
|
||||
return bar;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ const utils = new Utils();
|
||||
|
||||
export interface SkipButtonControlBarProps {
|
||||
skip: (segment: SponsorTime) => void;
|
||||
onMobileYouTube: boolean;
|
||||
}
|
||||
|
||||
export class SkipButtonControlBar {
|
||||
@@ -18,18 +19,31 @@ export class SkipButtonControlBar {
|
||||
segment: SponsorTime;
|
||||
|
||||
showKeybindHint = true;
|
||||
onMobileYouTube: boolean;
|
||||
|
||||
enabled = false;
|
||||
|
||||
timeout: NodeJS.Timeout;
|
||||
duration = 0;
|
||||
|
||||
skip: (segment: SponsorTime) => void;
|
||||
|
||||
// Used if on mobile page
|
||||
hideButton: () => void;
|
||||
showButton: () => void;
|
||||
|
||||
// Used by mobile only for swiping away
|
||||
left = 0;
|
||||
swipeStart = 0;
|
||||
|
||||
constructor(props: SkipButtonControlBarProps) {
|
||||
this.skip = props.skip;
|
||||
this.onMobileYouTube = props.onMobileYouTube;
|
||||
|
||||
this.container = document.createElement("div");
|
||||
this.container.classList.add("skipButtonControlBarContainer");
|
||||
this.container.classList.add("hidden");
|
||||
if (this.onMobileYouTube) this.container.classList.add("mobile");
|
||||
|
||||
this.skipIcon = document.createElement("img");
|
||||
this.skipIcon.src = chrome.runtime.getURL("icons/skipIcon.svg");
|
||||
@@ -43,6 +57,11 @@ export class SkipButtonControlBar {
|
||||
this.container.addEventListener("click", () => this.toggleSkip());
|
||||
this.container.addEventListener("mouseenter", () => this.stopTimer());
|
||||
this.container.addEventListener("mouseleave", () => this.startTimer());
|
||||
if (this.onMobileYouTube) {
|
||||
this.container.addEventListener("touchstart", (e) => this.handleTouchStart(e));
|
||||
this.container.addEventListener("touchmove", (e) => this.handleTouchMove(e));
|
||||
this.container.addEventListener("touchend", () => this.handleTouchEnd());
|
||||
}
|
||||
}
|
||||
|
||||
getElement(): HTMLElement {
|
||||
@@ -50,21 +69,38 @@ export class SkipButtonControlBar {
|
||||
}
|
||||
|
||||
attachToPage(): void {
|
||||
const leftControlsContainer = document.querySelector(".ytp-left-controls");
|
||||
const mountingContainer = this.getMountingContainer();
|
||||
this.chapterText = document.querySelector(".ytp-chapter-container");
|
||||
|
||||
if (leftControlsContainer && !leftControlsContainer.contains(this.container)) {
|
||||
leftControlsContainer.insertBefore(this.container, this.chapterText);
|
||||
|
||||
if (Config.config.autoHideInfoButton) {
|
||||
utils.setupAutoHideAnimation(this.skipIcon, leftControlsContainer, false, false);
|
||||
if (mountingContainer && !mountingContainer.contains(this.container)) {
|
||||
if (this.onMobileYouTube) {
|
||||
mountingContainer.appendChild(this.container);
|
||||
} else {
|
||||
mountingContainer.insertBefore(this.container, this.chapterText);
|
||||
}
|
||||
|
||||
if (!this.onMobileYouTube) {
|
||||
utils.setupAutoHideAnimation(this.skipIcon, mountingContainer, false, false);
|
||||
} else {
|
||||
const { hide, show } = utils.setupCustomHideAnimation(this.skipIcon, mountingContainer, false, false);
|
||||
this.hideButton = hide;
|
||||
this.showButton = show;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private getMountingContainer(): HTMLElement {
|
||||
if (!this.onMobileYouTube) {
|
||||
return document.querySelector(".ytp-left-controls");
|
||||
} else {
|
||||
return document.getElementById("player-container-id");
|
||||
}
|
||||
}
|
||||
|
||||
enable(segment: SponsorTime, duration?: number): void {
|
||||
if (duration) this.duration = duration;
|
||||
this.segment = segment;
|
||||
this.enabled = true;
|
||||
|
||||
this.refreshText();
|
||||
this.textContainer?.classList?.remove("hidden");
|
||||
@@ -103,6 +139,8 @@ export class SkipButtonControlBar {
|
||||
|
||||
this.chapterText?.classList?.remove("hidden");
|
||||
this.getChapterPrefix()?.classList?.remove("hidden");
|
||||
|
||||
this.enabled = false;
|
||||
}
|
||||
|
||||
toggleSkip(): void {
|
||||
@@ -116,12 +154,28 @@ export class SkipButtonControlBar {
|
||||
return;
|
||||
}
|
||||
|
||||
this.container.classList.add("textDisabled");
|
||||
this.textContainer?.classList?.add("hidden");
|
||||
this.chapterText?.classList?.remove("hidden");
|
||||
|
||||
this.getChapterPrefix()?.classList?.add("hidden");
|
||||
|
||||
utils.enableAutoHideAnimation(this.skipIcon);
|
||||
if (this.onMobileYouTube) {
|
||||
this.hideButton();
|
||||
}
|
||||
}
|
||||
|
||||
updateMobileControls(): void {
|
||||
const overlay = document.getElementById("player-control-overlay");
|
||||
|
||||
if (overlay && this.enabled) {
|
||||
if (overlay?.classList?.contains("pointer-events-off")) {
|
||||
this.hideButton();
|
||||
} else {
|
||||
this.showButton();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private getTitle(): string {
|
||||
@@ -131,5 +185,37 @@ export class SkipButtonControlBar {
|
||||
private getChapterPrefix(): HTMLElement {
|
||||
return document.querySelector(".ytp-chapter-title-prefix");
|
||||
}
|
||||
|
||||
// Swiping away on mobile
|
||||
private handleTouchStart(event: TouchEvent): void {
|
||||
this.swipeStart = event.touches[0].clientX;
|
||||
}
|
||||
|
||||
// Swiping away on mobile
|
||||
private handleTouchMove(event: TouchEvent): void {
|
||||
const distanceMoved = this.swipeStart - event.touches[0].clientX;
|
||||
this.left = Math.min(-distanceMoved, 0);
|
||||
|
||||
this.updateLeftStyle();
|
||||
}
|
||||
|
||||
// Swiping away on mobile
|
||||
private handleTouchEnd(): void {
|
||||
if (this.left < -this.container.offsetWidth / 2) {
|
||||
this.disableText();
|
||||
|
||||
// Don't let animation play
|
||||
this.skipIcon.style.display = "none";
|
||||
setTimeout(() => this.skipIcon.style.removeProperty("display"), 200);
|
||||
}
|
||||
|
||||
this.left = 0;
|
||||
this.updateLeftStyle();
|
||||
}
|
||||
|
||||
// Swiping away on mobile
|
||||
private updateLeftStyle() {
|
||||
this.container.style.left = this.left + "px";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,9 +31,10 @@ interface IsInfoFoundMessage {
|
||||
|
||||
export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoFoundMessage);
|
||||
|
||||
interface IsInfoFoundMessageResponse {
|
||||
export interface IsInfoFoundMessageResponse {
|
||||
found: boolean;
|
||||
sponsorTimes: SponsorTime[];
|
||||
onMobileYouTube: boolean;
|
||||
}
|
||||
|
||||
interface GetVideoIdResponse {
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Config from "./config";
|
||||
import * as CompileConfig from "../config.json";
|
||||
import * as invidiousList from "../ci/invidiouslist.json";
|
||||
|
||||
// Make the config public for debugging purposes
|
||||
window.SB = Config;
|
||||
@@ -297,8 +298,8 @@ function invidiousInstanceAddInit(element: HTMLElement, option: string) {
|
||||
const resetButton = element.querySelector(".invidious-instance-reset");
|
||||
resetButton.addEventListener("click", function() {
|
||||
if (confirm(chrome.i18n.getMessage("resetInvidiousInstanceAlert"))) {
|
||||
// Set to a clone of the default
|
||||
Config.config[option] = Config.defaults[option].slice(0);
|
||||
// Set to CI populated list
|
||||
Config.config[option] = invidiousList;
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -512,15 +513,17 @@ function activatePrivateTextChange(element: HTMLElement) {
|
||||
// See if anything extra must be done
|
||||
switch (option) {
|
||||
case "userID":
|
||||
utils.asyncRequestToServer("GET", "/api/userInfo", {
|
||||
userID: Config.config[option],
|
||||
values: ["warnings", "banned"]
|
||||
}).then((result) => {
|
||||
const userInfo = JSON.parse(result.responseText);
|
||||
if (userInfo.warnings > 0 || userInfo.banned) {
|
||||
setButton.classList.add("hidden");
|
||||
}
|
||||
});
|
||||
if (Config.config[option]) {
|
||||
utils.asyncRequestToServer("GET", "/api/userInfo", {
|
||||
userID: Config.config[option],
|
||||
values: ["warnings", "banned"]
|
||||
}).then((result) => {
|
||||
const userInfo = JSON.parse(result.responseText);
|
||||
if (userInfo.warnings > 0 || userInfo.banned) {
|
||||
setButton.classList.add("hidden");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
20
src/popup.ts
20
src/popup.ts
@@ -2,7 +2,7 @@ import Config from "./config";
|
||||
|
||||
import Utils from "./utils";
|
||||
import { SponsorTime, SponsorHideType, CategoryActionType } from "./types";
|
||||
import { Message, MessageResponse } from "./messageTypes";
|
||||
import { Message, MessageResponse, IsInfoFoundMessageResponse } from "./messageTypes";
|
||||
import { showDonationLink } from "./utils/configUtils";
|
||||
import { getCategoryActionType } from "./utils/categoryUtils";
|
||||
const utils = new Utils();
|
||||
@@ -278,7 +278,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}, (tabs) => onTabs(tabs, updating));
|
||||
}
|
||||
|
||||
function infoFound(request: { found: boolean, sponsorTimes: SponsorTime[] }) {
|
||||
function infoFound(request: IsInfoFoundMessageResponse) {
|
||||
if (chrome.runtime.lastError) {
|
||||
//This page doesn't have the injected content script, or at least not yet
|
||||
displayNoVideo();
|
||||
@@ -289,6 +289,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
if (request != undefined) {
|
||||
//remove loading text
|
||||
PageElements.mainControls.style.display = "flex";
|
||||
if (request.onMobileYouTube) PageElements.mainControls.classList.add("hidden");
|
||||
PageElements.whitelistButton.classList.remove("hidden");
|
||||
PageElements.loadingIndicator.style.display = "none";
|
||||
|
||||
@@ -379,8 +380,10 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
container.removeChild(container.firstChild);
|
||||
}
|
||||
|
||||
const isVip = Config.config.isVip;
|
||||
for (let i = 0; i < segmentTimes.length; i++) {
|
||||
const UUID = segmentTimes[i].UUID;
|
||||
const locked = segmentTimes[i].locked;
|
||||
|
||||
const sponsorTimeButton = document.createElement("button");
|
||||
sponsorTimeButton.className = "segmentTimeButton popupElement";
|
||||
@@ -430,7 +433,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
const downvoteButton = document.createElement("img");
|
||||
downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID;
|
||||
downvoteButton.className = "voteButton";
|
||||
downvoteButton.src = chrome.runtime.getURL("icons/thumbs_down.svg");
|
||||
downvoteButton.src = locked && isVip ? chrome.runtime.getURL("icons/thumbs_down_locked.svg") : chrome.runtime.getURL("icons/thumbs_down.svg");
|
||||
downvoteButton.addEventListener("click", () => vote(0, UUID));
|
||||
|
||||
//uuid button
|
||||
@@ -728,16 +731,17 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts time in hours to 5h 25.1
|
||||
* Converts time in minutes to 2d 5h 25.1
|
||||
* If less than 1 hour, just returns minutes
|
||||
*
|
||||
* @param {float} seconds
|
||||
* @param {float} minutes
|
||||
* @returns {string}
|
||||
*/
|
||||
function getFormattedHours(minutes) {
|
||||
minutes = Math.round(minutes * 10) / 10
|
||||
const hours = Math.floor(minutes / 60);
|
||||
return (hours > 0 ? hours + "h " : "") + (minutes % 60).toFixed(1);
|
||||
minutes = Math.round(minutes * 10) / 10;
|
||||
const days = Math.floor(minutes / 3600);
|
||||
const hours = Math.floor(minutes / 60) % 24;
|
||||
return (days > 0 ? days + chrome.i18n.getMessage("dayAbbreviation") + " " : "") + (hours > 0 ? hours + chrome.i18n.getMessage("hourAbbreviation") + " " : "") + (minutes % 60).toFixed(1);
|
||||
}
|
||||
|
||||
//end of function
|
||||
|
||||
95
src/render/RectangleTooltip.tsx
Normal file
95
src/render/RectangleTooltip.tsx
Normal file
@@ -0,0 +1,95 @@
|
||||
import * as React from "react";
|
||||
import * as ReactDOM from "react-dom";
|
||||
|
||||
export interface RectangleTooltipProps {
|
||||
text: string,
|
||||
link?: string,
|
||||
referenceNode: HTMLElement,
|
||||
prependElement?: HTMLElement, // Element to append before
|
||||
bottomOffset?: string,
|
||||
leftOffset?: string,
|
||||
timeout?: number,
|
||||
htmlId?: string,
|
||||
maxHeight?: string,
|
||||
maxWidth?: string,
|
||||
backgroundColor?: string,
|
||||
fontSize?: string,
|
||||
buttonFunction?: () => void;
|
||||
}
|
||||
|
||||
export class RectangleTooltip {
|
||||
text: string;
|
||||
container: HTMLDivElement;
|
||||
|
||||
timer: NodeJS.Timeout;
|
||||
|
||||
constructor(props: RectangleTooltipProps) {
|
||||
props.bottomOffset ??= "0px";
|
||||
props.leftOffset ??= "0px";
|
||||
props.maxHeight ??= "100px";
|
||||
props.maxWidth ??= "300px";
|
||||
props.backgroundColor ??= "rgba(28, 28, 28, 0.7)";
|
||||
this.text = props.text;
|
||||
props.fontSize ??= "10px";
|
||||
|
||||
this.container = document.createElement('div');
|
||||
props.htmlId ??= props.text;
|
||||
this.container.id = "sponsorRectangleTooltip" + props.htmlId;
|
||||
this.container.style.display = "relative";
|
||||
|
||||
if (props.prependElement) {
|
||||
props.referenceNode.insertBefore(this.container, props.prependElement);
|
||||
} else {
|
||||
props.referenceNode.appendChild(this.container);
|
||||
}
|
||||
|
||||
if (props.timeout) {
|
||||
this.timer = setTimeout(() => this.close(), props.timeout * 1000);
|
||||
}
|
||||
|
||||
ReactDOM.render(
|
||||
<div style={{
|
||||
bottom: props.bottomOffset,
|
||||
left: props.leftOffset,
|
||||
maxHeight: props.maxHeight,
|
||||
maxWidth: props.maxWidth,
|
||||
backgroundColor: props.backgroundColor,
|
||||
fontSize: props.fontSize}}
|
||||
className="sponsorBlockRectangleTooltip" >
|
||||
<div>
|
||||
<img className="sponsorSkipLogo sponsorSkipObject"
|
||||
src={chrome.extension.getURL("icons/IconSponsorBlocker256px.png")}>
|
||||
</img>
|
||||
<span className="sponsorSkipObject">
|
||||
{this.text + (props.link ? ". " : "")}
|
||||
{props.link ?
|
||||
<a style={{textDecoration: "underline"}}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
href={props.link}>
|
||||
{chrome.i18n.getMessage("LearnMore")}
|
||||
</a>
|
||||
: null}
|
||||
</span>
|
||||
</div>
|
||||
<button className="sponsorSkipObject sponsorSkipNoticeButton"
|
||||
style ={{float: "right" }}
|
||||
onClick={() => {
|
||||
if (props.buttonFunction) props.buttonFunction();
|
||||
this.close();
|
||||
}}>
|
||||
|
||||
{chrome.i18n.getMessage("GotIt")}
|
||||
</button>
|
||||
</div>,
|
||||
this.container
|
||||
)
|
||||
}
|
||||
|
||||
close(): void {
|
||||
ReactDOM.unmountComponentAtNode(this.container);
|
||||
this.container.remove();
|
||||
|
||||
if (this.timer) clearTimeout(this.timer);
|
||||
}
|
||||
}
|
||||
18
src/svg-icons/pencil_svg.tsx
Normal file
18
src/svg-icons/pencil_svg.tsx
Normal file
@@ -0,0 +1,18 @@
|
||||
import * as React from "react";
|
||||
|
||||
const pencilSvg = ({
|
||||
fill = "#ffffff"
|
||||
}): JSX.Element => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="18"
|
||||
height="18"
|
||||
viewBox="0 0 24 24"
|
||||
fill={fill}
|
||||
>
|
||||
<path
|
||||
d="M14.1 7.1l2.9 2.9L6.1 20.7l-3.6.7.7-3.6L14.1 7.1zm0-2.8L1.4 16.9 0 24l7.1-1.4L19.8 9.9l-5.7-5.7zm7.1 4.3L24 5.7 18.3 0l-2.8 2.8 5.7 5.7z"></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
export default pencilSvg;
|
||||
23
src/svg-icons/thumbs_down_svg.tsx
Normal file
23
src/svg-icons/thumbs_down_svg.tsx
Normal file
@@ -0,0 +1,23 @@
|
||||
import * as React from "react";
|
||||
|
||||
const thumbsDownSvg = ({
|
||||
fill = "#ffffff"
|
||||
}): JSX.Element => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="18"
|
||||
height="18"
|
||||
fill={fill}
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill="none"
|
||||
d="M0 0h24v24H0z">
|
||||
</path>
|
||||
<path
|
||||
d="M15 3H6c-.83 0-1.54.5-1.84 1.22l-3.02 7.05c-.09.23-.14.47-.14.73v2c0 1.1.9 2 2 2h6.31l-.95 4.57-.03.32c0 .41.17.79.44 1.06L9.83 23l6.59-6.59c.36-.36.58-.86.58-1.41V5c0-1.1-.9-2-2-2zm4 0v12h4V3h-4z"
|
||||
></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
export default thumbsDownSvg;
|
||||
22
src/svg-icons/thumbs_up_svg.tsx
Normal file
22
src/svg-icons/thumbs_up_svg.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
import * as React from "react";
|
||||
|
||||
const thumbsUpSvg = ({
|
||||
fill = "#ffffff"
|
||||
}): JSX.Element => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="18"
|
||||
height="18"
|
||||
fill={fill}
|
||||
viewBox="0 0 24 24"
|
||||
>
|
||||
<path
|
||||
fill="none"
|
||||
d="M0 0h24v24H0V0z"></path>
|
||||
<path
|
||||
d="M1 21h4V9H1v12zm22-11c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.59 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2z"
|
||||
></path>
|
||||
</svg>
|
||||
);
|
||||
|
||||
export default thumbsUpSvg;
|
||||
@@ -20,7 +20,8 @@ export interface ContentContainer {
|
||||
updateEditButtonsOnPlayer: () => void,
|
||||
previewTime: (time: number, unpause?: boolean) => void,
|
||||
videoInfo: VideoInfo,
|
||||
getRealCurrentTime: () => number
|
||||
getRealCurrentTime: () => number,
|
||||
lockedCategories: string[]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,12 +75,14 @@ export enum SponsorSourceType {
|
||||
export interface SponsorTime {
|
||||
segment: [number] | [number, number];
|
||||
UUID: SegmentUUID;
|
||||
locked?: number;
|
||||
|
||||
category: Category;
|
||||
actionType: ActionType;
|
||||
|
||||
hidden?: SponsorHideType;
|
||||
source?: SponsorSourceType;
|
||||
videoDuration?: number;
|
||||
}
|
||||
|
||||
export interface ScheduledTime extends SponsorTime {
|
||||
|
||||
44
src/utils.ts
44
src/utils.ts
@@ -26,7 +26,10 @@ export default class Utils {
|
||||
/** Function that can be used to wait for a condition before returning. */
|
||||
async wait<T>(condition: () => T | false, timeout = 5000, check = 100): Promise<T> {
|
||||
return await new Promise((resolve, reject) => {
|
||||
setTimeout(() => reject("TIMEOUT"), timeout);
|
||||
setTimeout(() => {
|
||||
clearInterval(interval);
|
||||
reject("TIMEOUT");
|
||||
}, timeout);
|
||||
|
||||
const intervalCheck = () => {
|
||||
const result = condition();
|
||||
@@ -183,32 +186,48 @@ export default class Utils {
|
||||
}
|
||||
}
|
||||
|
||||
setupAutoHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): void {
|
||||
setupCustomHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): { hide: () => void, show: () => void } {
|
||||
if (enabled) element.classList.add("autoHiding");
|
||||
element.classList.add("hidden");
|
||||
element.classList.add("animationDone");
|
||||
if (!rightSlide) element.classList.add("autoHideLeft");
|
||||
|
||||
container.addEventListener("mouseenter", () => {
|
||||
element.classList.remove("animationDone");
|
||||
let mouseEntered = false;
|
||||
|
||||
// Wait for next event loop
|
||||
setTimeout(() => element.classList.remove("hidden"), 10);
|
||||
});
|
||||
|
||||
container.addEventListener("mouseleave", () => {
|
||||
if (element.classList.contains("autoHiding")) {
|
||||
element.classList.add("hidden");
|
||||
return {
|
||||
hide: () => {
|
||||
mouseEntered = false;
|
||||
if (element.classList.contains("autoHiding")) {
|
||||
element.classList.add("hidden");
|
||||
}
|
||||
},
|
||||
show: () => {
|
||||
mouseEntered = true;
|
||||
element.classList.remove("animationDone");
|
||||
|
||||
// Wait for next event loop
|
||||
setTimeout(() => {
|
||||
if (mouseEntered) element.classList.remove("hidden")
|
||||
}, 10);
|
||||
}
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
setupAutoHideAnimation(element: Element, container: Element, enabled = true, rightSlide = true): void {
|
||||
const { hide, show } = this.setupCustomHideAnimation(element, container, enabled, rightSlide);
|
||||
|
||||
container.addEventListener("mouseleave", () => hide());
|
||||
container.addEventListener("mouseenter", () => show());
|
||||
}
|
||||
|
||||
enableAutoHideAnimation(element: Element): void {
|
||||
element.classList.add("autoHiding");
|
||||
element.classList.add("hidden");
|
||||
}
|
||||
|
||||
disableAutoHideAnimation(element: Element): void {
|
||||
element.classList.remove("autoHiding");
|
||||
element.classList.remove("hidden");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -531,5 +550,4 @@ export default class Utils {
|
||||
|
||||
return hashHex;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
20
src/utils/pageUtils.ts
Normal file
20
src/utils/pageUtils.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
export function getControls(): HTMLElement | false {
|
||||
const controlsSelectors = [
|
||||
// YouTube
|
||||
".ytp-right-controls",
|
||||
// Mobile YouTube
|
||||
".player-controls-top",
|
||||
// Invidious/videojs video element's controls element
|
||||
".vjs-control-bar",
|
||||
];
|
||||
|
||||
for (const controlsSelector of controlsSelectors) {
|
||||
const controls = document.querySelectorAll(controlsSelector);
|
||||
|
||||
if (controls && controls.length > 0) {
|
||||
return <HTMLElement> controls[controls.length - 1];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
26
src/utils/urlParser.ts
Normal file
26
src/utils/urlParser.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
export function getStartTimeFromUrl(url: string): number {
|
||||
const urlParams = new URLSearchParams(url);
|
||||
const time = urlParams?.get('t') || urlParams?.get('time_continue');
|
||||
|
||||
return urlTimeToSeconds(time);
|
||||
}
|
||||
|
||||
export function urlTimeToSeconds(time: string): number {
|
||||
if (!time) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const re = /(?:(\d{1,3})h)?(?:(\d{1,2})m)?(\d+)s?/;
|
||||
const match = re.exec(time);
|
||||
|
||||
if (match) {
|
||||
const hours = parseInt(match[1] ?? '0', 10);
|
||||
const minutes = parseInt(match[2] ?? '0', 10);
|
||||
const seconds = parseInt(match[3] ?? '0', 10);
|
||||
|
||||
return hours * 3600 + minutes * 60 + seconds;
|
||||
} else if (/\d+/.test(time)) {
|
||||
return parseInt(time, 10);
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,15 @@ import * as Chrome from "selenium-webdriver/chrome";
|
||||
import * as Path from "path";
|
||||
|
||||
test("Selenium Chrome test", async () => {
|
||||
const driver = await setup();
|
||||
let driver;
|
||||
try {
|
||||
driver = await setup();
|
||||
} catch (e) {
|
||||
console.warn("A browser is probably not installed, skipping selenium tests");
|
||||
console.warn(e);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await waitForInstall(driver);
|
||||
|
||||
27
test/urlParser.test.ts
Normal file
27
test/urlParser.test.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { getStartTimeFromUrl } from '../src/utils/urlParser';
|
||||
|
||||
describe("getStartTimeFromUrl", () => {
|
||||
it("parses with a number", () => {
|
||||
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=123")).toBe(123);
|
||||
});
|
||||
|
||||
it("parses with seconds", () => {
|
||||
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=123s")).toBe(123);
|
||||
});
|
||||
|
||||
it("parses with minutes", () => {
|
||||
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=23m3s")).toBe(23 * 60 + 3);
|
||||
});
|
||||
|
||||
it("parses with hours", () => {
|
||||
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&t=1h2m3s")).toBe(1 * 60 * 60 + 2 * 60 + 3);
|
||||
});
|
||||
|
||||
it("works with time_continue", () => {
|
||||
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ&time_continue=123")).toBe(123);
|
||||
});
|
||||
|
||||
it("works with no time", () => {
|
||||
expect(getStartTimeFromUrl("https://www.youtube.com/watch?v=dQw4w9WgXcQ")).toBe(0);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user