Compare commits

...

99 Commits
5.3.1 ... 5.4.8

Author SHA1 Message Date
Ajay
198ae9c41f bump version 2023-05-28 16:12:29 -04:00
Ajay
1b2be35bd6 Check multiple times if preview bar failed to be added 2023-05-28 16:11:49 -04:00
Ajay
ff3d8ff2d6 Add waiting for when preview bar detects incorrect number of chapters 2023-05-28 15:51:44 -04:00
Ajay
932ed34947 remove duplicates from translations 2023-05-28 15:04:12 -04:00
Ajay
ed59101fc7 Upload to release incrementally 2023-05-28 14:55:47 -04:00
Ajay
a4e8cdd0f6 Fix release worflow 2023-05-28 14:48:43 -04:00
Ajay
40604d7604 bump version 2023-05-28 14:42:09 -04:00
Ajay
d5d766b429 Another video element change check when video id changes 2023-05-24 23:50:12 -04:00
Ajay
a83e83c1b1 Potential fix for preview bar disappearing sometimes 2023-05-24 23:43:41 -04:00
Ajay
6585a4e325 Fix large times when locale uses dots for chapter names
Fixes #1757
2023-05-24 19:06:38 -04:00
Ajay
20ab0768df Fix chapters not saving after clicking suggestion
They still submitted properly, it only mattered if you closed the submission box
2023-05-21 19:55:58 -04:00
Ajay
b07381e5d0 Remove extra log 2023-05-12 23:55:33 -04:00
Ajay
4a1829839f Slightly improve firefox skipping 2023-05-12 23:53:37 -04:00
Ajay
93d864e927 Don't use unmute skip trick on chromium if there are mutes happening 2023-05-11 20:20:05 -04:00
Ajay
232b1816fe Fix mute segment right after skip being delayed 2023-05-11 20:17:57 -04:00
Ajay
54437ed0fd Add warning if CPU Tamer extension is detected 2023-05-10 19:38:03 -04:00
Ajay
282a4670ce Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2023-05-10 15:52:05 -04:00
Ajay
5973b801b9 Fix popup buttons centering 2023-05-10 15:52:03 -04:00
Ajay Ramachandran
628595bf5a Merge pull request #1749 from mini-bomba/previewbar-minwidth
Set min width of previewbar segments to 1px
2023-05-10 15:13:03 -04:00
Ajay
86498eb399 Add submodule build instructions to readme 2023-05-10 15:09:27 -04:00
Ajay
92fabdf37a Move more funcs to shared lib 2023-05-09 22:12:15 -04:00
Ajay
33d098d78a Fix popup padding css 2023-05-09 20:47:09 -04:00
Ajay
e094f95602 Move some options page funcs to shared lib 2023-05-09 16:49:54 -04:00
Ajay
b35bcae213 Fix copying bad files when compiling 2023-05-09 16:06:56 -04:00
Ajay
46ae92c321 Upload source before doing npm ci 2023-05-09 13:32:47 -04:00
Ajay
cc45e764cf Upload source code with modules to github 2023-05-09 13:30:31 -04:00
Ajay
f1026d403f Make workflows recursively checkout submodules 2023-05-09 13:24:32 -04:00
Ajay
c60c534a9e Fix submodule defintion file missing 2023-05-09 13:21:40 -04:00
Ajay
0e0555c32c Delete original locale files from repo 2023-05-09 13:20:22 -04:00
Ajay
928f1ed0e8 Add translations as git submodule 2023-05-09 13:18:36 -04:00
Ajay
14da4b5fcc Merge branch 'master' of https://github.com/ajayyy/SponsorBlock 2023-05-08 20:16:50 -04:00
Ajay
9d6e23d171 Fix margin issue on category pill tooltip 2023-05-08 20:16:44 -04:00
Ajay Ramachandran
68a6286af6 Merge pull request #1715 from Blueberryy/master
Add notice time to translation file
2023-05-08 17:10:55 -04:00
Ajay Ramachandran
7960fde155 Add description to translation 2023-05-08 17:08:02 -04:00
Ajay Ramachandran
afe7271419 New Crowdin updates (#1733) 2023-05-08 17:06:22 -04:00
Ajay
c6c3bd3a3d bump version 2023-05-08 17:03:49 -04:00
Ajay
f2482ee973 Add auto-config import to clickbait extension, move more funcs to shared lib
Also fix a isSafari call
2023-05-08 17:02:49 -04:00
Ajay
71dd4a97bf Fix SponsorBlock on latest YouTube layout 2023-05-07 23:56:55 -04:00
mini-bomba
f771a5a7ec Set min width of previewbar segments to 1px
This fixes short segments on long videos not appearing at all in small embeds
2023-05-07 14:25:55 +02:00
Ajay Ramachandran
d8ca29a18b Update funding 2023-05-06 23:35:45 -04:00
Ajay
4d7018a017 Fix safari check not running function
Should make Firefox more precise
2023-05-06 20:05:43 -04:00
Ajay
ca24e82a6d Fix skip looping
Fixes #1747
2023-05-06 20:04:17 -04:00
Ajay Ramachandran
186fa7af61 Merge pull request #1739 from mini-bomba/invidious-duration-without-skips
Show time with skips removed on invidious
2023-05-03 11:52:37 -04:00
mini-bomba
75b406cb5b Show time with skips removed on invidious 2023-05-02 21:42:09 +02:00
Ajay
d20b46f3ef bump version 2023-04-30 20:32:59 -04:00
Ajay
b2f3605571 Fix submit button in fullscreen and theater mode 2023-04-30 18:13:38 -04:00
Ajay
da1be6c87b bump version 2023-04-30 16:49:45 -04:00
Ajay
62a60daac7 Fix preview bar not being created on video element change if not created previously 2023-04-30 14:54:50 -04:00
Ajay
45d45b0068 Fix preview bar not appearing on all videos 2023-04-30 14:35:37 -04:00
Blueberryy
4cae6e8f41 Real fix by mini-bomba
@mini-bomba

Co-Authored-By: mini-bomba <55105495+mini-bomba@users.noreply.github.com>
2023-04-29 15:52:24 +05:00
Ajay
d3fa735481 Don't show harmful vote option for non chapters 2023-04-27 22:29:08 -04:00
Ajay Ramachandran
052a805a98 Merge pull request #1729 from ajayyy/dependabot/npm_and_yarn/xml2js-and-web-ext-0.5.0
Bump xml2js and web-ext
2023-04-27 15:22:06 -04:00
Ajay Ramachandran
6e8c406da9 New Crowdin updates (#1722) 2023-04-27 15:20:11 -04:00
dependabot[bot]
6e6c3819e5 Bump xml2js and web-ext
Bumps [xml2js](https://github.com/Leonidas-from-XIV/node-xml2js) to 0.5.0 and updates ancestor dependency [web-ext](https://github.com/mozilla/web-ext). These dependencies need to be updated together.


Updates `xml2js` from 0.4.23 to 0.5.0
- [Release notes](https://github.com/Leonidas-from-XIV/node-xml2js/releases)
- [Commits](https://github.com/Leonidas-from-XIV/node-xml2js/commits/0.5.0)

Updates `web-ext` from 7.5.0 to 7.6.2
- [Release notes](https://github.com/mozilla/web-ext/releases)
- [Commits](https://github.com/mozilla/web-ext/compare/7.5.0...7.6.2)

---
updated-dependencies:
- dependency-name: xml2js
  dependency-type: indirect
- dependency-name: web-ext
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-27 19:18:54 +00:00
Ajay
2b739e33e6 bump version 2023-04-27 15:18:34 -04:00
Ajay
7768447ab0 Upgrade maze-utils, move video element refreshes to lib 2023-04-27 15:18:17 -04:00
Ajay
e31efbbf81 Fix looped videos sometimes not skipping start segment
Fixes  #1723
2023-04-21 22:16:13 -04:00
Blueberryy
dc0d7d7e45 Another fix NoticeComponent.tsx 2023-04-20 18:58:11 +05:00
Blueberryy
ade4214b25 fIX messages.json 2023-04-20 18:50:23 +05:00
Blueberryy
6bc4c686ec FIX NoticeComponent.tsx 2023-04-20 18:49:22 +05:00
Ajay Ramachandran
ab7dfe80f7 Merge pull request #1721 from biot/received
Spelling fix
2023-04-19 17:35:43 -04:00
Bert Vermeulen
c5f549f937 Spelling fix 2023-04-19 19:26:45 +02:00
Ajay
a7aa4042ff Fix video labels showing all categories regardless of settings 2023-04-17 20:29:52 -04:00
Ajay
8136a53981 Fix wrapping issue on safari 2023-04-17 20:02:11 -04:00
Ajay Ramachandran
624c61f383 bump version 2023-04-17 17:58:09 -04:00
Ajay Ramachandran
bf1be68d06 New Crowdin updates (#1695) 2023-04-17 17:57:54 -04:00
Blueberryy
1b714470de add translatable s in notice 2023-04-11 23:03:29 +05:00
Blueberryy
32fd64ee25 add translatable s in notice 2023-04-11 23:03:23 +05:00
Ajay Ramachandran
e1521e9837 Merge pull request #1710 from mini-bomba/controls-skip-inline-players
Don't attach controls to inline preview players
2023-03-31 13:07:12 -04:00
Ajay Ramachandran
7b5303b1d8 Merge pull request #1711 from mini-bomba/darkreader-proofing-the-fvlabels
Reset fvlabel color definitions when segment == null
2023-03-31 13:06:37 -04:00
mini-bomba
78f6c66547 Reset fvlabel color definitions when segment == null
Without this, we would try to use the color for an 'undefined' category on the first render pass of the element.
It was then immediately re-rendered with a segment set, but DR missed the update, which caused it to stick to that 'undefined' category and the label became transparent.
2023-03-25 13:19:47 +01:00
Ajay
c2252af575 Move more thumbnail logic to lib 2023-03-24 19:07:26 -04:00
mini-bomba
1ef6c1977f Don't attach controls to inline preview players
Co-authored-by: Ajay <dev@ajay.app>
2023-03-24 23:59:59 +01:00
Ajay Ramachandran
e1b30204ce Merge pull request #1709 from mini-bomba/previewbar-left-right
Define left + right on previewbar segments instead of left + width
2023-03-24 18:34:44 -04:00
mini-bomba
0001d28f14 Define left + right on previewbar segments instead of left + width 2023-03-24 23:21:42 +01:00
Ajay Ramachandran
3dcc4240dc Merge pull request #1708 from mchangrh/windows-webpack
fix paths for windows dev
2023-03-24 17:50:24 -04:00
Michael C
4db3343029 fix paths for windows dev 2023-03-24 17:40:29 -04:00
Ajay Ramachandran
5711e70dbb Merge pull request #1707 from mini-bomba/fix-videoid-mismatch-error
Fix the incorrectVideoCheck() error showing the same videoID as recorded & actual
2023-03-24 15:51:47 -04:00
Ajay
6d7953a1ca Fix potentially leaking set interval 2023-03-24 15:51:36 -04:00
mini-bomba
356ce5a6f3 Fix the incorrectVideoCheck() error showing the same videoID as recorded & actual 2023-03-24 19:18:00 +01:00
Ajay Ramachandran
c1a61b9795 Merge pull request #1704 from mini-bomba/darkreader-proofing-the-dynamic-css
Darkreader-proofing the dynamic CSS variables
2023-03-22 00:11:22 -04:00
mini-bomba
e159989f17 Generate darkreader variables with our category color variables
This ensures the timeline, fv labels and thumbnail labels don't go transparent if darkreader forgets to set it's variable overrides.
2023-03-21 20:38:20 +01:00
Ajay
f6a42a7908 Fix manual skips after autoskips when inside a chapter 2023-03-20 23:10:13 -04:00
Ajay
3ddfc2f0dd reformat webpack document script definition 2023-03-20 14:14:28 -04:00
Ajay
4cf827b48a Remove exclusive_accessCategoryAdded migration 2023-03-18 21:31:27 -04:00
Ajay
f00b3abbe4 Enable chapter by default 2023-03-18 21:30:33 -04:00
Ajay
2f68a66f13 Remove chapters payment checks 2023-03-18 21:27:26 -04:00
Ajay
9831c3393f Remove chapters update message 2023-03-18 21:12:56 -04:00
Ajay
09511e8b3d Remove vendor references 2023-03-18 14:37:14 -04:00
Ajay
0e89549f6a bump version 2023-03-18 04:49:36 -04:00
Ajay Ramachandran
ef00e07647 Merge pull request #1623 from mini-bomba/labels-on-thumbnails
Show Full-Video Labels on thumbnails
2023-03-18 04:40:26 -04:00
Ajay
3a1d631e01 Merge branch 'master' of https://github.com/ajayyy/SponsorBlock into labels-on-thumbnails-merged 2023-03-18 02:08:02 -04:00
Ajay
488f5efa2f Add option to disable thumbnail icons 2023-03-18 02:05:14 -04:00
Ajay
e15e33b048 Lock version number for maze utils 2023-03-18 02:04:45 -04:00
Ajay
2374f4d31b Fix invidious support for thumbnail labels 2023-03-17 23:41:59 -04:00
Ajay
52f58b8ea4 Don't trigger hover autoplay from hovering over thumbnail label 2023-03-17 22:57:44 -04:00
Ajay
18f860c6a2 Increase opacity on hover 2023-03-17 22:11:13 -04:00
Ajay
5d610a342f Inject document script using raw HTML to be fast enough to still be able to hijack listener when visiting YouTube channel page directly 2023-03-17 21:10:26 -04:00
Ajay
758f0b7526 Show Full-Video Labels on thumbnails
Co-authored-by: mini-bomba <mini-bomba@users.noreply.github.com>
2023-03-10 03:49:01 -05:00
102 changed files with 1165 additions and 44377 deletions

2
.github/FUNDING.yml vendored
View File

@@ -1,3 +1,3 @@
github: ajayyy-org
patreon: ajayyy
custom: [buy.ajay.app/l/sponsorblock, sponsor.ajay.app/donate]
custom: [sponsor.ajay.app/donate]

View File

@@ -11,6 +11,8 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-node@v3
with:
node-version: '18'

View File

@@ -13,67 +13,35 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- name: Copy configuration
run: cp config.json.example config.json
# Create source artifact with submodule
- name: Create directory
run: cd ..; mkdir ./builds
- name: Zip Source code
run: zip -r ../builds/SourceCodeUseThisOne.zip *
- name: Upload Source to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:
args: ../builds/SourceCodeUseThisOne.zip
name: SourceCodeUseThisOne.zip
path: ../builds/SourceCodeUseThisOne.zip
repo-token: ${{ secrets.GITHUB_TOKEN }}
- run: npm ci
# Create Chrome artifacts
- name: Create Chrome artifacts
run: npm run build:chrome
- uses: actions/upload-artifact@v3
with:
name: ChromeExtension
path: dist
- run: mkdir ./builds
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/ChromeExtension.zip *
# Create Firefox artifacts
- name: Create Firefox artifacts
run: npm run build:firefox
- uses: actions/upload-artifact@v3
with:
name: FirefoxExtension
path: dist
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip *
# Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env stream=beta
- uses: actions/upload-artifact@v3
with:
name: ChromeExtensionBeta
path: dist
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/ChromeExtensionBeta.zip *
# Create Safari artifacts
- name: Create Safari artifacts
run: npm run build:safari
- uses: actions/upload-artifact@v3
with:
name: SafariExtension
path: dist
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/SafariExtension.zip *
# Create Edge artifacts
- name: Clear dist for Edge
run: rm -rf ./dist
- name: Create Edge artifacts
run: npm run build:edge
- uses: actions/upload-artifact@v3
with:
name: EdgeExtension
path: dist
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/EdgeExtension.zip *
# Upload each release asset
- name: Upload ChromeExtension to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:
@@ -81,13 +49,12 @@ jobs:
name: ChromeExtension.zip
path: ./builds/ChromeExtension.zip
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Upload ChromeExtensionBeta to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:
args: builds/ChromeExtensionBeta.zip
name: ChromeExtensionBeta.zip
path: ./builds/ChromeExtensionBeta.zip
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Create Firefox artifacts
- name: Create Firefox artifacts
run: npm run build:firefox
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/FirefoxExtension.zip *
- name: Upload FirefoxExtension to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:
@@ -95,6 +62,26 @@ jobs:
name: FirefoxExtension.zip
path: ./builds/FirefoxExtension.zip
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Create Beta artifacts (Builds with the name changed to beta)
- name: Create Chrome Beta artifacts
run: npm run build:chrome -- --env stream=beta
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/ChromeExtensionBeta.zip *
- name: Upload ChromeExtensionBeta to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:
args: builds/ChromeExtensionBeta.zip
name: ChromeExtensionBeta.zip
path: ./builds/ChromeExtensionBeta.zip
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Create Safari artifacts
- name: Create Safari artifacts
run: npm run build:safari
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/SafariExtension.zip *
- name: Upload SafariExtension to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:
@@ -102,6 +89,14 @@ jobs:
name: SafariExtension.zip
path: ./builds/SafariExtension.zip
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Create Edge artifacts
- name: Clear dist for Edge
run: rm -rf ./dist
- name: Create Edge artifacts
run: npm run build:edge
- name: Zip Artifacts
run: cd ./dist ; zip -r ../builds/EdgeExtension.zip *
- name: Upload EdgeExtension to release
uses: Shopify/upload-to-release@07611424e04f1475ddf550e1c0dd650b867d5467
with:

View File

@@ -10,6 +10,8 @@ jobs:
steps:
# Initialization
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-node@v3
with:
node-version: '18'

View File

@@ -13,6 +13,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- uses: actions/setup-node@v3
with:
node-version: '18'

View File

@@ -9,6 +9,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
submodules: recursive
- name: Download instance list
run: |
wget https://api.invidious.io/instances.json -O ci/data.json

3
.gitmodules vendored Normal file
View File

@@ -0,0 +1,3 @@
[submodule "public/_locales"]
path = public/_locales
url = https://github.com/ajayyy/ExtensionTranslations

View File

@@ -62,17 +62,29 @@ You can read the API docs [here](https://wiki.sponsor.ajay.app/index.php/API_Doc
You must have [Node.js 16](https://nodejs.org/) and npm installed.
1. Copy the file `config.json.example` to `config.json` and adjust configuration as desired.
1. Clone with submodules
```bash
git clone https://github.com/ajayyy/SponsorBlock --recurse-submodules=yes
```
Or if you already cloned it, pull submodules with
```bash
git submodule update --init --recursive
```
2. Copy the file `config.json.example` to `config.json` and adjust configuration as desired.
- 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.
2. Run `npm install` in the repository to install dependencies.
3. Run `npm install` in the repository to install dependencies.
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.
4. 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.
- 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 this folder directly in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/#manifest), or convert it to a zip file to load it as a [temporary extension](https://developer.mozilla.org/en-US/docs/Tools/about:debugging#loading_a_temporary_extension) in Firefox.
5. The built extension is now in `dist/`. You can load this folder directly in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/#manifest), or convert it to a zip file to load it as a [temporary extension](https://developer.mozilla.org/en-US/docs/Tools/about:debugging#loading_a_temporary_extension) in Firefox.
### Developing with a clean profile and hot reloading

View File

@@ -30,5 +30,11 @@
"guidelines": "https://wiki.sponsor.ajay.app/w/Guidelines",
"mute": "https://wiki.sponsor.ajay.app/w/Mute_Segment",
"chapter": "https://wiki.sponsor.ajay.app/w/Chapter"
}
},
"extensionCommunicationAllowList": [
"enamippconapkdmgfgjchkhakpfinmaj",
"deArrow@ajay.app",
"deArrowBETA@ajay.app",
"app.ajay.dearrow.extension"
]
}

View File

@@ -1,7 +1,7 @@
{
"name": "__MSG_fullName__",
"short_name": "SponsorBlock",
"version": "5.3.1",
"version": "5.4.8",
"default_locale": "en",
"description": "__MSG_Description__",
"homepage_url": "https://sponsor.ajay.app",
@@ -13,7 +13,6 @@
],
"all_frames": true,
"js": [
"./js/vendor.js",
"./js/content.js"
],
"css": [
@@ -121,7 +120,6 @@
},
"background": {
"scripts":[
"./js/vendor.js",
"./js/background.js"
]
},

1213
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,7 @@
"description": "",
"main": "background.js",
"dependencies": {
"@ajayyy/maze-utils": "1.1.7",
"@ajayyy/maze-utils": "1.1.29",
"content-scripts-register-polyfill": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0"
@@ -34,7 +34,7 @@
"ts-loader": "^9.4.2",
"ts-node": "^10.9.1",
"typescript": "4.9",
"web-ext": "^7.5.0",
"web-ext": "^7.6.2",
"webpack": "^5.75.0",
"webpack-cli": "^4.10.0",
"webpack-merge": "^5.8.0"

1
public/_locales Submodule

Submodule public/_locales added at 306f1deff3

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,14 +0,0 @@
{
"Loading": {
"message": "በመጫን ላይ..."
},
"paused": {
"message": "ለአፍታ አቁም"
},
"success": {
"message": "ተሳክቷል!"
},
"Username": {
"message": "መለያ ስም"
}
}

View File

@@ -1,750 +0,0 @@
{
"fullName": {
"message": "سبونسر بلوك لليوتيوب - تخطي الرعاية الاعلانية",
"description": "Name of the extension."
},
"Description": {
"message": "تخطي الرعاية الاعلانية ، التسول في الاشتراك والمزيد على مقاطع الفيديو على اليوتيوب. التبليغ عن الرعايه الاعلانيه علي مقاطع الفيديو التي تشاهدها لتوفير وقتك و وقت الآخرين.",
"description": "Description of the extension."
},
"400": {
"message": "الخادم قال أن هذا الطلب خاطيء"
},
"429": {
"message": "لقد قدمت الكثير من اوقات الرعاية الاعلانية لهذا الفيديو الواحد، هل أنت متأكد من وجود هذا العدد؟"
},
"409": {
"message": "تم تقديم هذا بالفعل من قبل"
},
"channelWhitelisted": {
"message": "القناة في القائمة البيضاء!"
},
"Segment": {
"message": "جزء"
},
"Segments": {
"message": "أجزاء"
},
"SegmentsCap": {
"message": "أجزاء من المقطع"
},
"Chapters": {
"message": "الفصول"
},
"upvoteButtonInfo": {
"message": "التصويت على هذا الإرسال"
},
"reportButtonTitle": {
"message": "إبلاغ"
},
"reportButtonInfo": {
"message": "الإبلاغ عن هذا التقديم كغير صحيح."
},
"Dismiss": {
"message": "إلغاء"
},
"Loading": {
"message": "جاري التحميل..."
},
"Hide": {
"message": "لا تظهر أبداً"
},
"hitGoBack": {
"message": "قم الضغط علي تخطي للوصول إلى المكان الذي أتيت منه."
},
"unskip": {
"message": "الرجوع في التخطي"
},
"reskip": {
"message": "اعاده التخطي"
},
"unmute": {
"message": "إلغاء الكتم"
},
"paused": {
"message": "ايقاف مؤقت"
},
"manualPaused": {
"message": "تم إيقاف الموقت"
},
"confirmMSG": {
"message": "لتحرير أو حذف قيّم فردياً، انقر فوق زر المعلومات أو فتح الإضافة عن طريق النقر على أيقونة الإضافة في الزاوية اليمنى العليا."
},
"clearThis": {
"message": "هل أنت متأكد أنك تريد حذف هذا؟\n\n"
},
"Unknown": {
"message": "حدث خطأ في إرسال توقيت الرعاة الخاص بك، الرجاء المحاولة مرة أخرى لاحقاً."
},
"sponsorFound": {
"message": "يحتوي هذا الفيديو على أجزاء في قاعدة البيانات!"
},
"sponsor404": {
"message": "لم يتم العثور على أجزاء"
},
"sponsorStart": {
"message": "يبدأ الجزء الآن"
},
"sponsorEnd": {
"message": "ينتهي الجزء الآن"
},
"sponsorCancel": {
"message": "إلغاء إنشاء جزء"
},
"noVideoID": {
"message": "لم يتم العثور على فيديو يوتيوب.\nإذا كان هذا غير صحيح، قم بتحديث الصفحة."
},
"refreshSegments": {
"message": "تحديث الأجزاء"
},
"success": {
"message": "تم بنجاح!"
},
"voted": {
"message": "تم التصويت!"
},
"serverDown": {
"message": "يبدو أن الخادم غير متصل. تواصل مع المطوّر على الفور."
},
"connectionError": {
"message": "حدث خطأ في الاتصال. رمز الخطأ: "
},
"clearTimes": {
"message": "مسح الأجزاء"
},
"openPopup": {
"message": "فتح نافذة SponsorBlock المنبثقة"
},
"closePopup": {
"message": "إغلاق النافذة المنبثقة"
},
"closeIcon": {
"message": "أيقونة الإغلاق"
},
"sortSegments": {
"message": "ترتيب الأجزاء"
},
"submitCheck": {
"message": "هل أنت متأكد أنك تريد إرسال هذا؟"
},
"whitelistChannel": {
"message": "إضافة القناة إلى القائمة البيضاء"
},
"removeFromWhitelist": {
"message": "إزالة القناة من القائمة البيضاء"
},
"voteOnTime": {
"message": "صوّت لجزء"
},
"Submissions": {
"message": "المشاركات"
},
"savedPeopleFrom": {
"message": "لقد وفّرت على الناس "
},
"viewLeaderboard": {
"message": "المتصدرين"
},
"recordTimesDescription": {
"message": "إرسال"
},
"submissionEditHint": {
"message": "سيظهر تحرير الجزء بعد النقر على إرسال",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "تلميح: يمكنك إعداد اختصارات مفاتيح للتقديم في الخيارات"
},
"clearTimesButton": {
"message": "مسح الأوقات"
},
"publicStats": {
"message": "يستخدم هذا في صفحة الإحصائيات العامة لإظهار مقدار مساهمتك. قم برؤيتها"
},
"Username": {
"message": "اسم المستخدم"
},
"setUsername": {
"message": "تعيين اسم مستخدم"
},
"copyPublicID": {
"message": "نسخ رمز المستخدم"
},
"copySegmentID": {
"message": "نسخ معرف الجزء"
},
"discordAdvert": {
"message": "انضم إلى سيرفر \"ديسكورد\" الرسمي لتقديم اقتراحات وتعليقات!"
},
"hideThis": {
"message": "إخفاء هذا"
},
"Options": {
"message": "خيارات"
},
"showButtons": {
"message": "إظهار الأزرار على مشغل اليوتيوب"
},
"hideButtons": {
"message": "إخفاء الأزرار على مشغل اليوتيوب"
},
"hideButtonsDescription": {
"message": "هذا يخفي الأزرار التي تظهر على مشغل اليوتيوب لإرسال أجزاء للتخطي."
},
"showSkipButton": {
"message": "إبقاء زر \"تخطي للعنوان الرئيس\" على المشغّل"
},
"showInfoButton": {
"message": "إظهار زر \"معلومات\" على مشغّل اليوتيوب"
},
"hideInfoButton": {
"message": "إخفاء زر \"معلومات\" على مشغّل اليوتيوب"
},
"autoHideInfoButton": {
"message": "إخفاء تلقائي لزر \"معلومات\""
},
"hideDeleteButton": {
"message": "إخفاء زر \"حذف\" على مشغّل اليوتيوب"
},
"showDeleteButton": {
"message": "إظهار زر \"حذف\" على مشغّل اليوتيوب"
},
"enableViewTracking": {
"message": "تمكين تتبع مرات التخطي"
},
"enableTrackDownvotes": {
"message": "حفظ التصويت السلبي للمقاطع"
},
"whatTrackDownvotes": {
"message": "أي مقاطع قمت بالتصويت السلبي لها ستبقى مخفية حتى بعد التحديث"
},
"showNotice": {
"message": "إظهار الإشعار مرة أخرى"
},
"showCategoryGuidelines": {
"message": "إظهار مساعدة الفئة"
},
"website": {
"message": "موقع الويب",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "الشفرة المصدرية",
"description": "Used on Firefox Store Page"
},
"setSkipShortcut": {
"message": "تخطي الجزء",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "بدء/إيقاف الجزء",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "إرسال الأجزاء",
"description": "Keybind label"
},
"yourWork": {
"message": "عملك",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"errorCode": {
"message": "رمز الخطأ: "
},
"skip": {
"message": "تخطي"
},
"mute": {
"message": "كتم"
},
"full": {
"message": "فيديو كامل",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "تخطي {0}؟"
},
"mute_category": {
"message": "كتم {0}؟"
},
"skip_to_category": {
"message": "تخطي إلى {0}؟",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "تم تخطي {0}",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "تم كتم {0}",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "تم التخطي إلى {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "تعطيل التخطي التلقائي"
},
"enableAutoSkip": {
"message": "تفعيل التخطي التلقائي"
},
"youHaveSkipped": {
"message": "قمت بتخطي "
},
"minLower": {
"message": "دقيقة"
},
"minsLower": {
"message": "دقائق"
},
"hourLower": {
"message": "ساعة"
},
"hoursLower": {
"message": "ساعات"
},
"youHaveSavedTime": {
"message": "لقد وفّرت على الناس",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " من حياتهم",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"createdBy": {
"message": "أنشئت من قِبل"
},
"supportOtherSites": {
"message": "دعم مواقع يوتيوب الطرف الثالث"
},
"supportedSites": {
"message": "المواقع المدعومة: "
},
"add": {
"message": "أضِف"
},
"showUploadButton": {
"message": "إظهار زر الرفع"
},
"save": {
"message": "حفظ"
},
"reset": {
"message": "إعادة تعيين"
},
"areYouSureReset": {
"message": "هل أنت متيقِّن من رغبتك في إعادة تعيين هذا؟"
},
"mobileUpdateInfo": {
"message": "m.youtube.com مدعوم الآن"
},
"exportOptions": {
"message": "إستيراد/تصدير جميع الإعدادات"
},
"exportOptionsCopy": {
"message": "تعديل/نسخ"
},
"exportOptionsDownload": {
"message": "حفظ إلى ملف"
},
"exportOptionsUpload": {
"message": "تحميل من ملف"
},
"setOptions": {
"message": "تعيين الخيارات"
},
"confirmNoticeTitle": {
"message": "إرسال المقطع"
},
"submit": {
"message": "إرسال"
},
"cancel": {
"message": "إلغاء"
},
"delete": {
"message": "حذف"
},
"preview": {
"message": "معاينة"
},
"unsubmitted": {
"message": "غير مرسلة"
},
"inspect": {
"message": "فحص"
},
"edit": {
"message": "تعديل"
},
"copyDebugInformationFailed": {
"message": "فشل في الكتابة إلى الحافظة"
},
"to": {
"message": "إلى",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "الراعي"
},
"category_sponsor_guideline1": {
"message": "دعايات مدفوعة"
},
"category_selfpromo": {
"message": "دعاية غير مدفوعة/ذاتية"
},
"category_exclusive_access": {
"message": "وصول حصري"
},
"category_intro_short": {
"message": "استراحة"
},
"category_intro_guideline1": {
"message": "فاصل بدون محتوى فعلي"
},
"category_outro": {
"message": "الخاتمة/تترات النهاية"
},
"category_preview": {
"message": "معاينة/خلاصة"
},
"category_preview_guideline2": {
"message": "موجز الفيديو السابق"
},
"category_filler_short": {
"message": "حشو"
},
"category_music_offtopic": {
"message": "الموسيقى: مقطع غير موسيقي"
},
"category_music_offtopic_short": {
"message": "غير موسيقي"
},
"category_poi_highlight": {
"message": "ابراز"
},
"category_poi_highlight_guideline3": {
"message": "يمكن التخطي إلى عنوان المقطع أو الصورة المصغرة"
},
"category_chapter": {
"message": "فصل"
},
"category_chapter_guideline1": {
"message": "لا تذكر أسماء العلامة التجارية الراعية"
},
"category_livestream_messages_short": {
"message": "قراءة الرسالة"
},
"autoSkip": {
"message": "تخطي تلقائي"
},
"manualSkip": {
"message": "تخطي يدوي"
},
"showOverlay": {
"message": "إظهار في شريط البحث"
},
"disable": {
"message": "تعطيل"
},
"autoSkip_POI": {
"message": "تخطي تلقائي حتى البدء"
},
"manualSkip_POI": {
"message": "اسأل عند تحميل الفيديو"
},
"showOverlay_POI": {
"message": "إظهار في شريط البحث"
},
"showOverlay_full": {
"message": "إظهار التسمية"
},
"previewColor": {
"message": "لون غير المرسل",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "لون شريط البحث"
},
"category": {
"message": "الفئة"
},
"skipOption": {
"message": "خيار التخطي",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "تمكين الخادم التجريبي"
},
"bracketNow": {
"message": "(الآن)"
},
"moreCategories": {
"message": "المزيد من الفئات"
},
"chooseACategory": {
"message": "اختر فئة"
},
"bracketEnd": {
"message": "(النهاية)"
},
"End": {
"message": "النهاية",
"description": "Button that skips to the end of a segment"
},
"hiddenDueToDownvote": {
"message": "مخفي: تصويت سلبي"
},
"hiddenDueToDuration": {
"message": "مخفي: قصير جداً"
},
"manuallyHidden": {
"message": "مخفي يدوياً"
},
"acceptPermission": {
"message": "قَبُول الإذن"
},
"permissionRequestSuccess": {
"message": "نجح طلب الإذن!"
},
"permissionRequestFailed": {
"message": "فشل طلب الإذن ، هل نقرت على رفض؟"
},
"adblockerIssueWhitelist": {
"message": "إذا كنت غير قادر على حل هذا، عطل إعداد \"فرض قناة التحقق قبل التخطي\"، لأن SponsorBlock غير قادر على استرداد معلومات القناة لهذا المقطع"
},
"forceChannelCheck": {
"message": "إجبار القناة على التحقق قبل التخطي"
},
"downvoteDescription": {
"message": "خاطئ/التوقيت غير صحيح"
},
"incorrectVote": {
"message": "غير صحيح"
},
"harmfulVote": {
"message": "ضار",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
},
"incorrectCategory": {
"message": "تغيير الفئة"
},
"multipleSegments": {
"message": "أجزاء متعددة"
},
"guidelines": {
"message": "الإرشادات"
},
"readTheGuidelines": {
"message": "اقرأ الإرشادات!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "الفئات هنا!"
},
"help": {
"message": "المساعدة"
},
"GotIt": {
"message": "فهمت",
"description": "Used as the button to dismiss a tooltip"
},
"hideForever": {
"message": "إخفاء دائم"
},
"warningTitle": {
"message": "لقد حصلت على تحذير"
},
"questionButton": {
"message": "لدي سؤال"
},
"warningConfirmButton": {
"message": "أنا أفهم السبب"
},
"Donate": {
"message": "تبرع"
},
"considerDonating": {
"message": "ساعد في تمويل التطوير"
},
"hideDonationLink": {
"message": "إخفاء رابط التبرع"
},
"darkModeOptionsPage": {
"message": "الوضع الداكن في صفحة الخيارات"
},
"helpPageThanksForInstalling": {
"message": "شكرا على تثبيت SponsorBlock."
},
"helpPageReviewOptions": {
"message": "يرجى مراجعة الخيارات أدناه"
},
"helpPageFeatureDisclaimer": {
"message": "العديد من الميزات معطلة بشكل تلقائي. إذا كنت ترغب في تخطي المقدمة و الخاتمة و استخدام الدعوات و إلخ. يمكنك تمكين هذه الميزات بالأسفل. يمكنك أيضًا إخفاء و إظهار عناصر واجهة المستخدم."
},
"helpPageHowSkippingWorks": {
"message": "كيف يعمل التخطي"
},
"Submitting": {
"message": "إرسال"
},
"Editing": {
"message": "التعديل"
},
"helpPageTooSlow": {
"message": "هذا بطيء جداً"
},
"helpPageCopyOfDatabase": {
"message": "هل يمكنني الحصول على نسخة من قاعدة البيانات؟ ماذا يحدث إذا اختفيت؟"
},
"helpPageCopyOfDatabase1": {
"message": "قاعدة البيانات عامة ومتاحة على"
},
"helpPageNews": {
"message": "الأخبار وكيف تم صنعها"
},
"helpPageSourceCode": {
"message": "أين يمكنني الحصول على شفرة المصدر؟"
},
"Credits": {
"message": "المساهمون في العمل"
},
"LearnMore": {
"message": "معرفة المزيد"
},
"FullDetails": {
"message": "التفاصيل الكاملة"
},
"OpenCategoryWikiPage": {
"message": "افتح صفحة ويكي هذه الفئة."
},
"CopyAndDownvote": {
"message": "نسخ وتصويت معارض"
},
"ContinueVoting": {
"message": "متابعة التصويت"
},
"downvote": {
"message": "تصويت سلبي"
},
"upvote": {
"message": "تصويت إيجابي"
},
"hideSegment": {
"message": "إخفاء المقطع"
},
"playChapter": {
"message": "شغل الفصل"
},
"SponsorTimeEditScrollNewFeature": {
"message": "استخدم عجلة الماوس أثناء التمرير فوق مربع التعديل لضبط الوقت بسرعة. يمكن استخدام مجموعات مفتاح ctrl أو Shift لضبط التغييرات."
},
"dayAbbreviation": {
"message": "ي",
"description": "100d"
},
"hourAbbreviation": {
"message": "س",
"description": "100h"
},
"optionsTabBehavior": {
"message": "سلوك",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "واجهه المستخدم",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "اختصارات لوحة المفاتيح",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "النسخ الاحتياطي/الاستعادة",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "متنوع",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "تخطي ظهور الإشعار",
"description": "Option label"
},
"unbind": {
"message": "إلغاء ربط",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "لم يتم التعيين"
},
"change": {
"message": "تغيير"
},
"youtubeKeybindWarning": {
"message": "هذا اختصار يوتيوب مدمج. هل أنت متأكد أنك تريد استخدامه؟"
},
"betaServerWarning": {
"message": "الخادم التجريبي مفعّل!"
},
"openOptionsPage": {
"message": "فتح صفحة الخيارات"
},
"resetToDefault": {
"message": "إعادة تعيين الإعدادات الإفتراضية"
},
"confirmResetToDefault": {
"message": "هل أنت متأكد من أنك تريد إعادة تعيين كافة الإعدادات إلى حالتها الافتراضية؟ لا يمكنك التراجع عن ذلك."
},
"Import": {
"message": "استورد",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"chooseACountry": {
"message": "اختر البلد"
},
"noDiscount": {
"message": "أنت لست مؤهلاً للحصول على خصم"
},
"discountLink": {
"message": "رابط الخصم (انظر إلى السعر الوردي)"
},
"selectYourCountry": {
"message": "اختر بلدك"
},
"alreadyDonated": {
"message": "إذا تبرعت بأي مبلغ قبل الآن، يمكنك الحصول على إمكانية الوصول عبر التواصل مع البريد الإلكتروني:",
"description": "After the colon is an email address"
},
"patreonSignIn": {
"message": "سجل مع بيتريون (Patreon)"
},
"unsubmittedSegmentCounts": {
"message": "لديك حاليا {0} على {1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"videosSingular": {
"message": "مقطع",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "مقاطع",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"showUnsubmittedSegments": {
"message": "أظهر الأجزاء",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "معرف المقطع",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "قائمة الأوامر",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "شارك كرابط"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,220 +0,0 @@
{
"fullName": {
"message": "SponsorBlock per YouTube - Omet els Sponsorships",
"description": "Name of the extension."
},
"Description": {
"message": "Omet els sponsorships, pregant per una subscripció i mes en videos de YouTube. Informa dels patrocinadors a els vídeos que mires per estalviar temps als altres.",
"description": "Description of the extension."
},
"400": {
"message": "El server ha dit que aquesta sol·licitud es invalida"
},
"429": {
"message": "Heu enviat massa vegades patrocinadors per a aquest vídeo, esteu segur que n'hi ha tants?"
},
"409": {
"message": "Això ja s'ha enviat abans"
},
"channelWhitelisted": {
"message": "El canal és a la llista blanca!"
},
"Segment": {
"message": "segment"
},
"Segments": {
"message": "segments"
},
"upvoteButtonInfo": {
"message": "Voteu millor aquesta submissió"
},
"reportButtonTitle": {
"message": "Informa"
},
"reportButtonInfo": {
"message": "Notifiqueu que aquest enviament és incorrecte."
},
"Dismiss": {
"message": "Omet"
},
"Loading": {
"message": "Carregant..."
},
"Hide": {
"message": "No mostris mai"
},
"hitGoBack": {
"message": "Premeu \"no saltar\" per tornar on estàveu."
},
"unskip": {
"message": "No saltar"
},
"reskip": {
"message": "Saltar de nou"
},
"unmute": {
"message": "Deixa de silenciar"
},
"paused": {
"message": "En pausa"
},
"manualPaused": {
"message": "S'ha aturat el temporitzador"
},
"confirmMSG": {
"message": "Per editar o esborrar valors individuals, premeu el botó d'informació o cliqueu la pestanya de l'extensió al cantó superior dret."
},
"clearThis": {
"message": "Segur que voleu esborrar això?\n\n"
},
"Unknown": {
"message": "S'ha produït un error en enviar els temps d'anunciant, torneu-ho a provar més endavant."
},
"sponsorFound": {
"message": "Aquest vídeo té segments a la base de dades!"
},
"sponsor404": {
"message": "No s'han trobat segments"
},
"sponsorStart": {
"message": "El segment comença ara"
},
"sponsorEnd": {
"message": "El segment acaba ara"
},
"sponsorCancel": {
"message": "Cancel·la la creació del segment"
},
"noVideoID": {
"message": "No s'ha trobat cap vídeo de YouTube.\nSi penseu que és incorrecte, refresqueu la pestanya."
},
"refreshSegments": {
"message": "Refresca els segments"
},
"success": {
"message": "Èxit!"
},
"voted": {
"message": "Votat!"
},
"serverDown": {
"message": "Sembla que ha caigut el servidor. Contacteu el desenvolupador immediatament."
},
"connectionError": {
"message": "S'ha produït un error de connexió. Codi d'error: "
},
"clearTimes": {
"message": "Esborra els segments"
},
"openPopup": {
"message": "Obrir finestra de SponsorBlock"
},
"closePopup": {
"message": "Tanca la finestra"
},
"submitCheck": {
"message": "Segur que voleu enviar això?"
},
"whitelistChannel": {
"message": "Canal de llista blanca"
},
"removeFromWhitelist": {
"message": "Treure canal de la llista blanca"
},
"voteOnTime": {
"message": "Vota un segment"
},
"Submissions": {
"message": "Propostes"
},
"savedPeopleFrom": {
"message": "Heu estalviat la gent "
},
"viewLeaderboard": {
"message": "Classificació"
},
"recordTimesDescription": {
"message": "Envia"
},
"submissionEditHint": {
"message": "L'edició de seccions apareixerà després de prémer \"envia\"",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Consell: Podeu crear tecles de drecera per enviar en \"opcions\""
},
"clearTimesButton": {
"message": "Esborra temps"
},
"publicStats": {
"message": "Això s'utilitza a la pàgina d'estadístiques pública per fatxendejar de quant heu contribuït. Vegeu"
},
"Username": {
"message": "Nom d'usuari"
},
"setUsername": {
"message": "Definiu el nom d'usuari"
},
"copyPublicID": {
"message": "Copia l'identificador públic d'usuari"
},
"discordAdvert": {
"message": "Uniu-vos al servidor de Discord oficial per opinar i fer suggeriments!"
},
"hideThis": {
"message": "Amaga això"
},
"Options": {
"message": "Opcions"
},
"showButtons": {
"message": "Mostra els botons al reproductor de YouTube"
},
"hideButtons": {
"message": "Amaga els botons al reproductor de YouTube"
},
"hideButtonsDescription": {
"message": "Això amaga els botons que apareixen al reproductor de YouTube per enviar segments."
},
"showSkipButton": {
"message": "Mantenir \"Botar al destacat\" al reproductor"
},
"showInfoButton": {
"message": "Mostra el botó d'informació al reproductor de YouTube"
},
"hideInfoButton": {
"message": "Amaga el botó d'informació al reproductor de YouTube"
},
"autoHideInfoButton": {
"message": "Amaga automàticament el botó d'informació"
},
"minLower": {
"message": "minut"
},
"minsLower": {
"message": "minuts"
},
"hourLower": {
"message": "hora"
},
"hoursLower": {
"message": "hores"
},
"youHaveSavedTime": {
"message": "Heu estalviat la gent",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " de les seves vides",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "Visiteu status.sponsor.ajay.app per conèixer l'estat del servidor."
},
"whatChangeUserID": {
"message": "Això hauria de romandre privat: és semblant a una contrasenya i no s'hauria de compartir amb cap persona. Si algú hi té accés, poden suplantar-vos. Si esteu cercant el vostre identificador d'usuari públic, premeu la icona del portanotes a la finestra."
},
"help": {
"message": "Ajuda"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,388 +0,0 @@
{
"fullName": {
"message": "اسپانسربلاک برای یوتیوب - اسپانسر ها را رد کنید",
"description": "Name of the extension."
},
"Description": {
"message": "بخش های اسپانسر شده، درخواست ساب اسکرایب و خیلی چیز های دیگر در ویدیو های یوتیوب را رد کنید. قسمت های اسپانسری ویدیو هایی که میبینید را گزارش کنید تا در وقت دیگران صرفه جویی شود.",
"description": "Description of the extension."
},
"400": {
"message": "سرور گفت که این درخواست نامعتبر است"
},
"429": {
"message": "شما برای این ویدیو قسمت های اسپانسری خیلی زیادی ثبت کرده اید، آیا مطمئنید که به این تعداد وجوددارد؟"
},
"409": {
"message": "این قبلاً ثبت شده است"
},
"channelWhitelisted": {
"message": "کانال در لیست سفید قرار گرفت!"
},
"Segment": {
"message": "بخش"
},
"Segments": {
"message": "بخش"
},
"upvoteButtonInfo": {
"message": "امتیاز دادن به این گزارش ثبت‌شده"
},
"reportButtonTitle": {
"message": "گزارش"
},
"reportButtonInfo": {
"message": "گزارش این ارسال به‌عنوان غیر صحیح."
},
"Dismiss": {
"message": "رد کردن"
},
"Loading": {
"message": "درحال بارگذاری..."
},
"Hide": {
"message": "هرگز نمایش نده"
},
"hitGoBack": {
"message": "کلید عدم رد کردن را بزنید تا به جایی که بودید برگردید."
},
"unskip": {
"message": "عدم رد کردن"
},
"reskip": {
"message": "دوباره رد کردن"
},
"unmute": {
"message": "صدادار"
},
"paused": {
"message": "وقفه شده"
},
"manualPaused": {
"message": "شمارنده متوقف شد"
},
"clearThis": {
"message": "مطمئن هستید که میخواهید این را حذف کنید؟\n\n"
},
"Unknown": {
"message": "اشکالی در ثبت کردن زمان های ارسالی شما پیش آمد. لطفا بعداً دوباره تلاش کنید."
},
"sponsorFound": {
"message": "این ویدیو دارای بخش‌هایی در پایگاه‌داده است!"
},
"sponsor404": {
"message": "هیچ بخشی پیدا نشد"
},
"sponsorStart": {
"message": "بخش اینجا شروع می‌شود"
},
"sponsorEnd": {
"message": "بخش اینجا پایان می‌یابد"
},
"sponsorCancel": {
"message": "لغو ساختن بخش"
},
"noVideoID": {
"message": "هیچ ویدیوی یوتیوب‌ای یافت نشد.\nاگر این صحیح نیست، زبانه را تازه کنید."
},
"refreshSegments": {
"message": "تازه‌کردن بخش‌ها"
},
"success": {
"message": "موفقیت!"
},
"voted": {
"message": "گزارش داده شد!"
},
"serverDown": {
"message": "به‌نظر می‌رسد که ارتباط سرور قطع شده است. با توسعه‌دهنده سریعاً تماس بگیرید."
},
"connectionError": {
"message": "خطای شبکه رخ داده است. کد خطا: "
},
"clearTimes": {
"message": "پاک‌نمودن بخش‌ها"
},
"openPopup": {
"message": "نمایش پنجره اسپانسر بلاک"
},
"closePopup": {
"message": "بستن پنجره"
},
"submitCheck": {
"message": "مطمئن هستید که میخواهید این را ثبت کنید؟"
},
"whitelistChannel": {
"message": "قرار دادن کانال در لیست سفید"
},
"removeFromWhitelist": {
"message": "حذف کانال از لیست سفید"
},
"voteOnTime": {
"message": "رأی دهی به یک بخش"
},
"Submissions": {
"message": "ارسالی‌ها"
},
"savedPeopleFrom": {
"message": "شما دیگران را نجات دادید از "
},
"viewLeaderboard": {
"message": "نفرات برتر"
},
"recordTimesDescription": {
"message": "ثبت"
},
"clearTimesButton": {
"message": "حذف دفعات"
},
"Username": {
"message": "نام‌کاربری"
},
"setUsername": {
"message": "تنظیم نام کاربری"
},
"discordAdvert": {
"message": "به سرور رسمی دیسکورد بپیوندید تا پیشنهادات و بازخورد‌های خود را ارائه دهید!"
},
"hideThis": {
"message": "مخفی‌سازی"
},
"Options": {
"message": "گزینه‌ها"
},
"showButtons": {
"message": "نمایش کلید ها در پخش‌کننده یوتیوب"
},
"hideButtons": {
"message": "مخفی‌سازی کلید ها در پخش‌کننده یوتیوب"
},
"showNotice": {
"message": "نمایش مجدد اطلاعیه"
},
"longDescription": {
"message": "افزونه اسپانسر بلاک به شما امکان رد کردن بخش‌های تبلیغاتی (اسپانسر شده)، قسمت‌های شروع و پایان ویدیو، درخواست ساب‌اسکرایب و سایر قسمت‌های آزار دهنده یوتیوب را می‌دهد. اسپانسر بلاک یک افزونه مرورگر است که به هر کسی امکان ثبت زمان شروع و پایان بخش های اسپانسر شده و سایر بخش های ویدیو های یوتیوب را می‌دهد. پس از اینکه هر کاربر این اطلاعات را ثبت کرده و گزارش دهد، بقیه کاربرانی که از این افزونه استفاده می‌کنند مستقیماً بخش اسپانسر شده ویدیو را رد خواهند کرد. شما همچنین می‌توانید در ویدیو های نماهنگ (موزیک ویدیو)، قسمت‌های غیر موسیقی ویدیو را رد کنید.",
"description": "Full description of the extension on the store pages."
},
"website": {
"message": "وب‌سایت",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "سورس کد",
"description": "Used on Firefox Store Page"
},
"noticeUpdate2": {
"message": "اگر همچنان این را نمی‌پسندید، گزینه هرگز نمایش نده را انتخاب کنید.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"disableSkipping": {
"message": "ردکردن فعال است"
},
"enableSkipping": {
"message": "ردکردن غیرفعال است"
},
"yourWork": {
"message": "کار شما",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "به نظر می‌رسد سرور زیر فشار است. چند ثانیه‌ی دیگر دوباره امتحان کنید."
},
"errorCode": {
"message": "کد خطا: "
},
"skip": {
"message": "رد کردن"
},
"mute": {
"message": "بی‌صدا"
},
"skip_category": {
"message": "{0} رد شود؟"
},
"mute_category": {
"message": "{0} بی‌صدا شود؟"
},
"skipped": {
"message": "{0} رد شد",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} بی‌صدا شد",
"description": "Example: Sponsor Muted"
},
"minLower": {
"message": "دقیقه"
},
"hourLower": {
"message": "ساعت"
},
"createdBy": {
"message": "ایجاد شده توسط"
},
"supportedSites": {
"message": "وب‌سایت‌های پشتیبانی شده: "
},
"add": {
"message": "افزودن"
},
"save": {
"message": "ذخیره"
},
"reset": {
"message": "بازنشانی"
},
"areYouSureReset": {
"message": "آيا مطمئن هستيد که مي خواهيد این را بازنشانی کنید؟"
},
"mobileUpdateInfo": {
"message": "m.youtube.com اکنون پشتیبانی می‌شود"
},
"setOptions": {
"message": "تنظیم گزینه‌ها"
},
"confirmNoticeTitle": {
"message": "ثبت بخش"
},
"submit": {
"message": "ثبت"
},
"cancel": {
"message": "لغو"
},
"delete": {
"message": "حذف"
},
"preview": {
"message": "پیش‌نمایش"
},
"unsubmitted": {
"message": "ثبت‌نشده"
},
"inspect": {
"message": "مشاهده"
},
"edit": {
"message": "ویرایش"
},
"to": {
"message": "به",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "اسپانسر"
},
"category_exclusive_access": {
"message": "دسترسی اختصاصی"
},
"category_filler_short": {
"message": "پر کننده"
},
"category_music_offtopic_short": {
"message": "غیر موسیقی"
},
"category_poi_highlight": {
"message": "برجسته"
},
"autoSkip": {
"message": "ردکردن خودکار"
},
"manualSkip": {
"message": "ردکردن دستی"
},
"showOverlay": {
"message": "نمایش در نوار پیشرفت"
},
"disable": {
"message": "غیرفعال کردن"
},
"showOverlay_POI": {
"message": "نمایش در نوار پیشرفت"
},
"showOverlay_full": {
"message": "نمایش نام"
},
"category": {
"message": "دسته بندی"
},
"bracketNow": {
"message": "(اکنون)"
},
"moreCategories": {
"message": "نمایش دسته‌بندی‌ها"
},
"bracketEnd": {
"message": "(پایان)"
},
"acceptPermission": {
"message": "تأیید دسترسی"
},
"incorrectCategory": {
"message": "تغییر دسته بندی"
},
"guidelines": {
"message": "دستورالعمل‌ها"
},
"readTheGuidelines": {
"message": "دستورالعمل‌ها را بخوانید!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"help": {
"message": "راهنما"
},
"GotIt": {
"message": "فهمیدم",
"description": "Used as the button to dismiss a tooltip"
},
"hideForever": {
"message": "مخفی‌سازی برای همیشه"
},
"Donate": {
"message": "کمک مالی"
},
"hideDonationLink": {
"message": "پنهان کردن لینک کمک مالی"
},
"helpPageThanksForInstalling": {
"message": "ازینکه افزونه SponserBlock را نصب کردید سپاسگزاریم."
},
"helpPageReviewOptions": {
"message": "لطفاً تنظیمات زیر را بررسی کنید"
},
"helpPageHowSkippingWorks": {
"message": "چگونه ردکردن کار می‌کند"
},
"Submitting": {
"message": "ثبت نمودن"
},
"Editing": {
"message": "ویرایش"
},
"helpPageCopyOfDatabase": {
"message": "آیا می‌توان یک کپی از پایگاه داده را دریافت کرد؟ اگر شما یک روز ناپدید شدید چه می‌شود؟"
},
"helpPageCopyOfDatabase1": {
"message": "پایگاه داده به‌صورت عمومی در دسترس است در"
},
"helpPageCopyOfDatabase2": {
"message": "سورس کد به‌صورت رایگان ارائه شده است. بنابراین، اگر اتفاقی برای من بیفتد، ارسالات شما از بین نمی‌روند."
},
"helpPageSourceCode": {
"message": "از کجا سورس کد را بگیرم؟"
},
"Credits": {
"message": "سازندگان"
},
"LearnMore": {
"message": "بیشتر بدانید"
},
"dayAbbreviation": {
"message": "روز",
"description": "100d"
},
"hourAbbreviation": {
"message": "ساعت",
"description": "100h"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,115 +0,0 @@
{
"fullName": {
"message": "SponsorBlock para YouTube - I-skip ang mga Sponsorships",
"description": "Name of the extension."
},
"Description": {
"message": "I-skip ang mga sponsorships, subscription begging at marami pa sa mga YouTube videos. I-report ang mga sponsor sa videos na napapanood mo upang makatipid sa oras ng iba.",
"description": "Description of the extension."
},
"429": {
"message": "Masyadong kang maraming beses na nagsumite ng sponsor times para sa video na ito, sigurado ka na marami yan?"
},
"409": {
"message": "Naisumite na ito noon"
},
"channelWhitelisted": {
"message": "Whitelisted na ang channel na ito!"
},
"Segment": {
"message": "segment"
},
"Segments": {
"message": "segments"
},
"upvoteButtonInfo": {
"message": "I-upvote ang submission na ito"
},
"reportButtonTitle": {
"message": "I-report"
},
"reportButtonInfo": {
"message": "I-report ang submission na ito bilang mali."
},
"Dismiss": {
"message": "I-dismiss"
},
"Loading": {
"message": "Loading..."
},
"Hide": {
"message": "Hindi ipakita"
},
"hitGoBack": {
"message": "Pindutin ang \"unskip\" para bumalik ka sa iyong dating posisyon sa video."
},
"unskip": {
"message": "I-unskip"
},
"reskip": {
"message": "I-reskip"
},
"unmute": {
"message": "I-unmute"
},
"paused": {
"message": "Naka-pause na"
},
"manualPaused": {
"message": "Tigilan ang timer"
},
"confirmMSG": {
"message": "Para sa pag-edit o tanggalin ng mga individual values, pindutin ang info button o ang extension icon sa kanang sulok sa itaas."
},
"clearThis": {
"message": "Sigurado ka bang gusto mong tanggalin ito?"
},
"Unknown": {
"message": "May error na nagkaroon sa pagsusumite sa iyong sponsor times, subukang muli mamaya."
},
"sponsorFound": {
"message": "May mga segments sa database para sa video na ito!"
},
"sponsor404": {
"message": "Walang nakitang segment"
},
"sponsorStart": {
"message": "Simula ang Segment Ngayon"
},
"sponsorEnd": {
"message": "Nagtatapos ang Segment Ngayon"
},
"sponsorCancel": {
"message": "Kanselahin ang Paggawa ng Segment"
},
"noVideoID": {
"message": "Walang YouTube video na nakita.\nKung mali ito, i-refresh ang tab mo."
},
"refreshSegments": {
"message": "I-refresh ang mga segments"
},
"success": {
"message": "Tagumpay na!"
},
"voted": {
"message": "Bumoto na!"
},
"connectionError": {
"message": "Nagkaroon ng error sa koneksyon. Error code: "
},
"clearTimes": {
"message": "I-clear ang mga segments"
},
"openPopup": {
"message": "I-buksan ang SponsorBlock popup"
},
"closePopup": {
"message": "Isara ang Popup"
},
"submitCheck": {
"message": "Sigurado ka bang gusto mong isumite ito?"
},
"whitelistChannel": {
"message": "I-whitelist itong channel"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +0,0 @@
{
"fullName": {
"message": "યુટ્યુબ માટે સ્પોન્સરબ્લોક - સ્પોન્સરશિપ છોડી દો",
"description": "Name of the extension."
},
"400": {
"message": "સર્વરે કહ્યું કે આ વિનંતી અમાન્ય છે"
},
"429": {
"message": "તમે આ એક વિડિઓ માટે ઘણી પ્રાયોજક વખત સબમિટ કરી છે, શું તમને ખાતરી છે કે આ ઘણા છે?"
},
"409": {
"message": "આ અગાઉ રજુ કરવામાં આવી છે"
},
"channelWhitelisted": {
"message": "ચેનલ વ્હાઇટલિસ્ટેડ!"
}
}

View File

@@ -1,798 +0,0 @@
{
"fullName": {
"message": "חוסם פרסומות ליוטיוב - דלג על החסויות",
"description": "Name of the extension."
},
"Description": {
"message": "דלג על החסויות, ההתחננויות לעשות מנוי ועוד בסרטוני יוטיוב. דווח על ספונסרים בסרטונים שאתה צופה בהם כדי לחסוך לאחרים זמן.",
"description": "Description of the extension."
},
"400": {
"message": "השרת אמר שהבקשה הזו לא בתוקף"
},
"429": {
"message": "הגשת יותר מדי זמני חסויות עבור הסרטון היחיד הזה, אתה בטוח שיש כל כך הרבה?"
},
"409": {
"message": "זה כבר הוגש בעבר"
},
"channelWhitelisted": {
"message": "הערוץ הורשה!"
},
"Segment": {
"message": "מקטע"
},
"Segments": {
"message": "מקטעים"
},
"SegmentsCap": {
"message": "קטעים"
},
"Chapters": {
"message": "פרקים"
},
"renderAsChapters": {
"message": "עיבוד קטעים כפרקים",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "הצגת קטע נוכחי לצד זמן וידאו"
},
"upvoteButtonInfo": {
"message": "הצבע לדיווח הזה"
},
"reportButtonTitle": {
"message": "דווח"
},
"reportButtonInfo": {
"message": "דווח על הדיווח הזה כלא נכון."
},
"Dismiss": {
"message": "סגור"
},
"Loading": {
"message": "טוען..."
},
"Hide": {
"message": "אל תציג אף פעם"
},
"hitGoBack": {
"message": "לחץ על דלג אחורה כדי להגיע מאיפה שבאת."
},
"unskip": {
"message": "דלג אחורה"
},
"reskip": {
"message": "דלג קדימה"
},
"unmute": {
"message": "ביטול השתקה"
},
"paused": {
"message": "מושהה"
},
"manualPaused": {
"message": "טיימר נעצר"
},
"confirmMSG": {
"message": "כדי לערוך או למחוק קטעים יחידים, לחץ על כפתור המידע או פתח את החלונית של ההרחבה בדפדפן ע\"י לחיצה על הסמליל בצד ימין למעלה (יכול להיות ששמאל למעלה בדפדפנים בעברית)."
},
"clearThis": {
"message": "אתה בטוח שאתה רוצה לנקות את זה?\n\n"
},
"Unknown": {
"message": "אירעה שגיאה בדיווח הזמנים, נסה שוב מאוחר יותר."
},
"sponsorFound": {
"message": "לסרטון הזה יש קטעים במאגר הנתונים!"
},
"sponsor404": {
"message": "לא נמצאו מקטעים"
},
"sponsorStart": {
"message": "מקטע מתחיל עכשיו"
},
"sponsorEnd": {
"message": "מקטע נגמר עכשיו"
},
"sponsorCancel": {
"message": "ביטול יצירת קטע"
},
"noVideoID": {
"message": "לא נמצא סרטון יוטיוב.\nאם זה לא נכון, רענן את הכרטיסייה."
},
"refreshSegments": {
"message": "ריענון קטעים"
},
"success": {
"message": "הצלחה!"
},
"voted": {
"message": "הצבעת!"
},
"serverDown": {
"message": "נראה שהשרת נפל. צור קשר עם המפתח מיד."
},
"connectionError": {
"message": "התקבלה שגיאת חיבור. קוד השגיאה: "
},
"segmentsStillLoading": {
"message": "קטעים עדיין נטענים..."
},
"clearTimes": {
"message": "נקה מקטעים"
},
"openPopup": {
"message": "פתח חלונית SponsorBlock"
},
"closePopup": {
"message": "סגור חלון"
},
"closeIcon": {
"message": "סגירת סמליל"
},
"OpenSubmissionMenu": {
"message": "פתיחת תפריט הגשה"
},
"sortSegments": {
"message": "מיון מקטעים"
},
"submitCheck": {
"message": "אתה בטוח שאתה רוצה להזין את זה?"
},
"whitelistChannel": {
"message": "הרשה ערוץ"
},
"removeFromWhitelist": {
"message": "הסר ערוץ מרשימת ערוצים מורשים"
},
"voteOnTime": {
"message": "הצבע על מקטע"
},
"Submissions": {
"message": "הזנות"
},
"savedPeopleFrom": {
"message": "הצלת אנשים מ "
},
"viewLeaderboard": {
"message": "לוח מובילים"
},
"recordTimesDescription": {
"message": "הגש"
},
"submissionEditHint": {
"message": "עריכת מקטע תופיע אחרי שתלחץ הגש",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "רמז: אתה יכול להגדיר קיצורים מהמקלדת דרך תפריט אפשרויות כדי להזין זמנים"
},
"clearTimesButton": {
"message": "ניקוי זמנים"
},
"publicStats": {
"message": "זה משמש בדף הסטטיסטיקה הציבורי כדי להראות כמה תרמת. ניתן לצפות בזה"
},
"Username": {
"message": "שם משתמש"
},
"setUsername": {
"message": "הגדרת שם משתמש"
},
"copyPublicID": {
"message": "העתקת מזהה משתמש פומבי"
},
"copySegmentID": {
"message": "העתקת מזהה מקטע"
},
"discordAdvert": {
"message": "הצטרפות לשרת הדיסקורד הרשמי כדי לביא הצעות וחוות דעת!"
},
"hideThis": {
"message": "להסתיר את זה"
},
"Options": {
"message": "אפשרויות"
},
"showButtons": {
"message": "הצגת כפתורים על הנגן של יוטיוב"
},
"hideButtons": {
"message": "הסתרת כפתורים על הנגן של יוטיוב"
},
"hideButtonsDescription": {
"message": "זה מחביא את הכפתורים שמופיעים בנגן YouTube להגיש מקטעי דילוג."
},
"showSkipButton": {
"message": "השארת כפתור הדילוג להדגשה על הנגן"
},
"showInfoButton": {
"message": "הראה כפתור מידע בנגן YouTube"
},
"hideInfoButton": {
"message": "החבא כפתור מידע בנגן YouTube"
},
"autoHideInfoButton": {
"message": "הסתרה אוטומטית של כפתורי אינפורמציה"
},
"hideDeleteButton": {
"message": "הסתרת כפתור מחיקה על הנגן של יוטיוב"
},
"showDeleteButton": {
"message": "הצגת כפתור מחיקה על הנגן של יוטיוב"
},
"enableViewTracking": {
"message": "אפשר מעקב ספירת דילוגים"
},
"whatViewTracking": {
"message": "תכונה זו עוקבת אחר אילו מקטעים דילגת כדי לאפשר למשתמשים לדעת עד כמה ההגשה שלהם עזרה לאחרים והשתמשה כמדד יחד עם הצבעות בעד כדי להבטיח שספאם לא ייכנס למסד הנתונים. התוסף שולח הודעה לשרת בכל פעם שאתה מדלג על קטע. אני מקווה שרוב האנשים לא ישנו את ההגדרה הזו כדי שמספרי התצוגה יהיו מדויקים. :)"
},
"enableViewTrackingInPrivate": {
"message": "אפשר מעקב ספירת דילוגים בכרטיסיות גלישה פרטית/גלישה בסתר"
},
"enableTrackDownvotes": {
"message": "שמור דירוג קטעים"
},
"whatTrackDownvotes": {
"message": "כל קטע שידורג על ידך יישאר חבוי, גם לאחר רענון"
},
"trackDownvotesWarning": {
"message": "אזהרה: ביטול השמירה ימחק את הדירוגים שנשמרו"
},
"whatQueryByHashPrefix": {
"message": "במקום לבקש מקטעים מהשרת לפי מזהה סרטון, נשלחים ארבעת התווים הראשונים של ה-hash של מזהה הסרטון. שרת זה ישלח בחזרה נתונים לכל הסרטונים עם hash מתאים."
},
"enableRefetchWhenNotFound": {
"message": "השג מקטעים של סרטונים חדשים"
},
"whatRefetchWhenNotFound": {
"message": "אם הסרטון חדש, ואין בו אף מקטע, הוא יחפש מחדש מקטעים כל כמה דקות בהן תצפה/י בסרטון."
},
"enableShowCategoryWithoutPermission": {
"message": "הצג קטגוריה בתפריט ההגשה גם ללא הרשאת הגשה"
},
"whatShowCategoryWithoutPermission": {
"message": "ישנן קטגוריות שדורשות הרשאת הגשה בגלל דרישות מינימום נקודות רפוטציה"
},
"showNotice": {
"message": "הראה הודעה שוב"
},
"showSkipNotice": {
"message": "הצג הודעה לאחר דילוג על מקטע"
},
"showCategoryGuidelines": {
"message": "הצג עזרה לקטגוריה"
},
"website": {
"message": "אתר",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "קוד מקור",
"description": "Used on Firefox Store Page"
},
"nextChapterKeybind": {
"message": "הפרק הבא",
"description": "Keybind label"
},
"disableSkipping": {
"message": "דילוג מופעל"
},
"enableSkipping": {
"message": "דילוג מושבת"
},
"yourWork": {
"message": "העבודה שלך",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "נראה שהשרת עמוס יתר על המידה. יש לנסות שוב בעוד מספר שניות."
},
"errorCode": {
"message": "קוד שגיאה: "
},
"skip": {
"message": "דילוג"
},
"mute": {
"message": "השתקה"
},
"full": {
"message": "וידיאו מלא",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "דילוג {0}?"
},
"mute_category": {
"message": "השתק {0}?"
},
"skip_to_category": {
"message": "דילוג אל {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} דולג",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} מושתק",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "דילוג אל {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "השבתת דילוג אוטומטי"
},
"enableAutoSkip": {
"message": "הפעלת דילוג אוטומטי"
},
"audioNotification": {
"message": "הודעת שמע בעת דילוג"
},
"youHaveSkipped": {
"message": "דילגת "
},
"minLower": {
"message": "דקה"
},
"minsLower": {
"message": "דקות"
},
"hourLower": {
"message": "שעה"
},
"hoursLower": {
"message": "שעות"
},
"youHaveSavedTime": {
"message": "חסכת לאנשים",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " מחייהם",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"createdBy": {
"message": "נוצר על ידי"
},
"supportedSites": {
"message": "אתרים נתמכים: "
},
"add": {
"message": "הוסף"
},
"showUploadButton": {
"message": "הצגת כפתור העלאה"
},
"save": {
"message": "שמירה"
},
"reset": {
"message": "איתחול"
},
"exportOptionsCopy": {
"message": "עריכה/העתקה"
},
"exportOptionsDownload": {
"message": "שמירה לקובץ"
},
"exportOptionsUpload": {
"message": "טעינה מקובץ"
},
"setOptions": {
"message": "הגדרת אפשרויות"
},
"confirmNoticeTitle": {
"message": "הגשת מקטע"
},
"submit": {
"message": "הגשה"
},
"cancel": {
"message": "ביטול"
},
"delete": {
"message": "מחיקה"
},
"preview": {
"message": "תצוגה מקדימה"
},
"unsubmitted": {
"message": "לא מוגש"
},
"inspect": {
"message": "סקירה"
},
"edit": {
"message": "עריכה"
},
"to": {
"message": "עד ל",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"CopiedExclamation": {
"message": "הועתק!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"category_sponsor": {
"message": "נותן חסות"
},
"category_exclusive_access": {
"message": "גישה אקסקלוסיבית"
},
"category_filler_short": {
"message": "מסנן"
},
"category_music_offtopic": {
"message": "מוזיקה: קטעים ללא מוזיקה"
},
"category_music_offtopic_short": {
"message": "ללא מוזיקה"
},
"category_poi_highlight": {
"message": "קטע חשוב"
},
"category_chapter": {
"message": "פרק"
},
"autoSkip": {
"message": "דילוג אוטומטי"
},
"manualSkip": {
"message": "דילוג ידני"
},
"showOverlay": {
"message": "הראה בשורת חיפוש"
},
"disable": {
"message": "מושבת"
},
"showOverlay_POI": {
"message": "הראה בשורת חיפוש"
},
"showOverlay_full": {
"message": "הצגת תוית"
},
"showOverlay_chapter": {
"message": "הצגת פרקים"
},
"category": {
"message": "קטגוריה"
},
"skipOption": {
"message": "אפשרות דילוג",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"bracketNow": {
"message": "(עכשיו)"
},
"moreCategories": {
"message": "עוד קטגוריות"
},
"chooseACategory": {
"message": "בחירת קטגוריה"
},
"bracketEnd": {
"message": "(סוף)"
},
"End": {
"message": "סוף",
"description": "Button that skips to the end of a segment"
},
"downvoteDescription": {
"message": "זמן שגוי/לא נכון"
},
"incorrectVote": {
"message": "שגוי"
},
"incorrectCategory": {
"message": "שינוי קטגוריה"
},
"multipleSegments": {
"message": "מספר מקטעים"
},
"guidelines": {
"message": "הנחיות"
},
"readTheGuidelines": {
"message": "קראו את ההנחיות!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "קטגוריות נמצאות כאן!"
},
"help": {
"message": "עזרה"
},
"GotIt": {
"message": "הבנתי",
"description": "Used as the button to dismiss a tooltip"
},
"experiementOptOut": {
"message": "לא מעוניין להשתתף בניסויים עתידיים",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "הסתרה לעד"
},
"questionButton": {
"message": "יש לי שאלה נוספת"
},
"warningConfirmButton": {
"message": "הבנתי את הסיכונים"
},
"warningError": {
"message": "שגיאה בעת ניסיון לאשר אזהרה:"
},
"Donate": {
"message": "תרומה"
},
"considerDonating": {
"message": "עזרו לממן את הפיתוח"
},
"hideDonationLink": {
"message": "הסתרת כפתור תרומה"
},
"darkModeOptionsPage": {
"message": "מצב כהה בדף האפשרויות"
},
"helpPageThanksForInstalling": {
"message": "תודה שהתקנת את ספונסרבלוק."
},
"helpPageReviewOptions": {
"message": "נא לסקור את האפשרויות הבאות"
},
"helpPageHowSkippingWorks": {
"message": "כיצד דילוג עובד"
},
"Submitting": {
"message": "שולח"
},
"Editing": {
"message": "עריכה"
},
"helpPageTooSlow": {
"message": "הקצב איטי מדי"
},
"helpPageCopyOfDatabase2": {
"message": "קוד המקור זמין באופן חופשי ובחינם. אז, אפילו אם משהו יקרה לי, המקטעים שהגשתם לא יאבדו."
},
"helpPageNews": {
"message": "חדשות וכיצד זה נעשה"
},
"helpPageSourceCode": {
"message": "היכן אוכל להשיג את קוד המקור?"
},
"Credits": {
"message": "קרדיטים"
},
"LearnMore": {
"message": "למידע נוסף"
},
"FullDetails": {
"message": "פרטים מלאים"
},
"CopyDownvoteButtonInfo": {
"message": "הצבעה שלילית ויצירת עותק מקומי שניתן לשלוח מחדש"
},
"OpenCategoryWikiPage": {
"message": "פתיחת דף הוויקי של קטגוריה זו."
},
"CopyAndDownvote": {
"message": "העתקה ודירוג שלילי"
},
"ContinueVoting": {
"message": "המשך הצבעה"
},
"ChangeCategoryTooltip": {
"message": "זה מיידית ישפיע על כל המקטעים שלך"
},
"downvote": {
"message": "דירוג שלילי"
},
"upvote": {
"message": "דירוג חיובי"
},
"hideSegment": {
"message": "הסתרת מקטע"
},
"skipSegment": {
"message": "דילוכ מקטע"
},
"playChapter": {
"message": "הפעלת פרק"
},
"SponsorTimeEditScrollNewFeature": {
"message": "השתמש בגלגלת בזמן שהעכבר מעל הזמן בשלב העריכה על מנת לשנות את הזמן יותר מהר. שילוב של הלחצן Ctrl/Shift יכולים לשנות את מהירות השינוי."
},
"categoryPillNewFeature": {
"message": "חדש! ראה מתי וידאו בשלמותו הוא פרסומת או פרסום עצמי"
},
"dayAbbreviation": {
"message": "י",
"description": "100d"
},
"hourAbbreviation": {
"message": "ש'",
"description": "100h"
},
"optionsTabBehavior": {
"message": "התנהגות",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "ממשק",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "קיצורי מקלדת",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "גיבוי/שחזור",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "שונות",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "דילוג על הופעת הודעה",
"description": "Option label"
},
"unbind": {
"message": "ביטול איגוד",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "לא הוגדר"
},
"change": {
"message": "שנה"
},
"youtubeKeybindWarning": {
"message": "זה הוא קיצור דרך מובנה ביוטיוב. האם אתה בטוח שאתה רוצה להשתמש בו?"
},
"betaServerWarning": {
"message": "שרת ביטא מופעל!"
},
"openOptionsPage": {
"message": "פתיחת דף האפשרויות"
},
"resetToDefault": {
"message": "איפוס הגדרות לברירת המחדל"
},
"confirmResetToDefault": {
"message": "האם בוודאות ברצונך לאפס את כל ההגדרות לערכי ברירת המחדל שלהן? אי אפשר לבטל את זה."
},
"exportSegments": {
"message": "ייצוא מקטעים"
},
"importSegments": {
"message": "ייבוא מקטעים"
},
"Import": {
"message": "ייבוא",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"redeemSuccess": {
"message": "המימוש הצליח!"
},
"redeemFailed": {
"message": "רשיון מפתח שגוי"
},
"hideUpsells": {
"message": "הסתרת אפשרויות שאינן זמינות ללא תשלום נוסף"
},
"chooseACountry": {
"message": "בחירת מדינה"
},
"noDiscount": {
"message": "לא נמצאה זכאות להנחה"
},
"discountLink": {
"message": "קישור להנחה (ראה מחיר ורוד)"
},
"selectYourCountry": {
"message": "בחירת מדינתך"
},
"alreadyDonated": {
"message": "אם תרמת סכום כלשהו בעבר, ניתן לממש גישה בחינם באמצעות דואר אלקטרוני:",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "אם אינך יכול להרשות לעצמך לרכוש רישיון, יש ללחוץ {here} כדי לראות אם קיימת זכאות להנחה",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": {
"message": "כניסה באמצעות Patreon"
},
"redeem": {
"message": "מימוש"
},
"joinOnPatreon": {
"message": "מינוי באמצעות Patreon"
},
"oneTimePurchase": {
"message": "רכישה חד פעמית"
},
"enterLicenseKey": {
"message": "הזנת מפתח רישיון"
},
"chaptersPage1": {
"message": "התכונה חסימת פרקים במקור המונים זמינה רק לאנשים שרוכשים רישיון, או לאנשים שקיבלו גישה בחינם עקב תרומותיהם בעבר"
},
"chaptersPage2": {
"message": "הערה: ההרשאה להגשת פרקים עדיין מבוססת על מוניטין מחושב. רכישת רישיון מאפשרת לך לראות רק פרקים שהוגשו על ידי אחרים",
"description": "On the chapters page for getting access to the paid chapters feature"
},
"chapterNewFeature": {
"message": "תכונה חדשה: פרקים מותאמים אישית ממקור המונים. אלו הם מקטעים בעלי שמות מותאמים אישית בסרטונים שניתן לערום כדי לקבל יותר ויותר דיוק. רכישת רישיון לצפייה בפרקים שנשלחו בסרטון זה כגון: ",
"description": "After the comma, a list of chapters for this video will appear"
},
"chapterNewFeature2": {
"message": "תכונה חדשה: פרקים מותאמים אישית ממקור המונים. אלו הם קטעים בעלי שמות מותאמים אישית בסרטונים שניתן לערום כדי לקבל יותר ויותר דיוק. יש לך גישה בחינם, יש להפעיל באפשרויות."
},
"unsubmittedSegmentCounts": {
"message": "כרגע יש לך {0} ב-{1}",
"description": "Example: You currently have 12 unsubmitted segments on 5 videos"
},
"unsubmittedSegmentCountsZero": {
"message": "אין לך כרגע מקטעים שלא הוגשו",
"description": "Replaces 'unsubmittedSegmentCounts' string when there are no unsubmitted segments"
},
"unsubmittedSegmentsSingular": {
"message": "מקטע שלא הוגש",
"description": "Example: You currently have 1 *unsubmitted segment* on 1 video"
},
"unsubmittedSegmentsPlural": {
"message": "מקטעים שלא הוגשו",
"description": "Example: You currently have 12 *unsubmitted segments* on 5 videos"
},
"videosSingular": {
"message": "סרטון",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "סרטונים",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"clearUnsubmittedSegments": {
"message": "ניקוי כל המקטעים",
"description": "Label for a button in settings"
},
"clearUnsubmittedSegmentsConfirm": {
"message": "האם בוודאות ברצונך למחוק את כל המקטעים שלא הוגשוו?",
"description": "Confirmation message for the Clear unsubmitted segments button"
},
"showUnsubmittedSegments": {
"message": "הצגת מקטעים",
"description": "Show/hide button for the unsubmitted segments list"
},
"hideUnsubmittedSegments": {
"message": "הסתרת מקטעים",
"description": "Show/hide button for the unsubmitted segments list"
},
"videoID": {
"message": "מזהה סרטון",
"description": "Header of the unsubmitted segments list"
},
"segmentCount": {
"message": "ספירת מקטעים",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "פעולות",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "שיתוף כקישור"
},
"segmentFetchFailureWarning": {
"message": "אזהרה: השרת עדיין לא הגיב עם מקטעים. ייתכן שלמעשה יש מקטעים בסרטון הזה שכבר נשלחו אבל פשוט לא קיבלת אותם בגלל בעיות בשרת."
}
}

View File

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

View File

@@ -1,930 +0,0 @@
{
"fullName": {
"message": "SponsorBlock za YouTube - preskoči sponzore",
"description": "Name of the extension."
},
"Description": {
"message": "Preskoči sponzore, zamolbe za pretplatu i drugo na YouTube videima. Prijavi sponzore na videima koje gledaš kako bi uštedio drugima vrijeme.",
"description": "Description of the extension."
},
"400": {
"message": "Server je rekao da je zahtjev neispravan"
},
"429": {
"message": "Unio si previše vremena sponzora za ovaj video, jesi li siguran da ih ima toliko?"
},
"409": {
"message": "Ovo je već unešeno prije"
},
"channelWhitelisted": {
"message": "Kanal je dodan na popis dopuštenih!"
},
"Segment": {
"message": "odsječak"
},
"Segments": {
"message": "odsječci"
},
"SegmentsCap": {
"message": "Odsječci"
},
"Chapters": {
"message": "Poglavlja"
},
"renderAsChapters": {
"message": "Iscrtaj isječke kao poglavlja",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"upvoteButtonInfo": {
"message": "Glasaj za ovaj unos"
},
"reportButtonTitle": {
"message": "Prijavi"
},
"reportButtonInfo": {
"message": "Prijavi unos kao nesipravan."
},
"Dismiss": {
"message": "Odbaci"
},
"Loading": {
"message": "Učitavanje..."
},
"Hide": {
"message": "Nikad ne prikazuj"
},
"hitGoBack": {
"message": "Klikni unskip kako bi se vratio otkuda si došao."
},
"unskip": {
"message": "Ne preskači"
},
"reskip": {
"message": "Preskoči opet"
},
"unmute": {
"message": "Uključi zvuk"
},
"paused": {
"message": "Pauzirano"
},
"manualPaused": {
"message": "Timer zaustavljen"
},
"confirmMSG": {
"message": "Kako bi uredio ili obrisao pojedinačne vrijednosti, klikni na gumb info ili otvori okvir dodatka klikom na ikonu dodatka u gornjem desnom kutu."
},
"clearThis": {
"message": "Jesi li siguran da želiš očistiti ovo?\n\n"
},
"Unknown": {
"message": "Dogodila se pogreška pri unošenju tvojih vremena sponzora, molim te probaj ponovno kasnije."
},
"sponsorFound": {
"message": "Ovaj video ima isječke u bazi podataka!"
},
"sponsor404": {
"message": "Nije pronađen isječak"
},
"sponsorStart": {
"message": "Isječak započinje sada"
},
"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!"
},
"voted": {
"message": "Glas podnešen!"
},
"serverDown": {
"message": "Čini se da server ne radi. Kontaktiraj razvojne programere odmah."
},
"connectionError": {
"message": "Dogodija se greška u povezivanju. Kod pogreške: "
},
"segmentsStillLoading": {
"message": "Segmenti se učitavaju..."
},
"clearTimes": {
"message": "Očisti isječke"
},
"openPopup": {
"message": "Otvori okvir SponsorBlock"
},
"closePopup": {
"message": "Zatvori izbornik"
},
"closeIcon": {
"message": "Ikona za zatvaranje"
},
"sortSegments": {
"message": "Razvrstaj 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": "Spasili ste ljude od "
},
"viewLeaderboard": {
"message": "Ljestvica"
},
"recordTimesDescription": {
"message": "Pošalji"
},
"submissionEditHint": {
"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"
},
"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"
},
"copySegmentID": {
"message": "Kopiraj ID odsječka"
},
"discordAdvert": {
"message": "Pridružite nam se u službenoj Discord zajednici i pošaljite svoje prijedloge i povrate informacije!"
},
"hideThis": {
"message": "Sakrij 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"
},
"whatViewTracking": {
"message": "Ova značajka prati koje dijelove ste preskočili, kako bi korisnicima dali doznanja koliko je njihova prijava pomogla drugima, koristi se kao mjerni podatak zajedni s goreglasom, kako bi se osiguralo da spam ne ulazi u bazu podataka. Proširenje šalje poruku poslužitelju svaki put kada preskočite dio. Nadamo se da puno ljudi neće mijenjati ovu postavku, kako bi broj pregleda bio točan. :)"
},
"enableViewTrackingInPrivate": {
"message": "Omogući praćenje broja preskakanja u Privatnim/Incognito karticama"
},
"enableTrackDownvotes": {
"message": "Pohranjuj doljeglasove dijelova"
},
"whatTrackDownvotes": {
"message": "Svaki odjeljak koji doljeglasate ostati će skriven čak i nakon osvježavanja"
},
"trackDownvotesWarning": {
"message": "Upozorenje: Onemogućavanjem ovoga izbrisati će svi prijašnje spremljeni doljeglasovi"
},
"enableQueryByHashPrefix": {
"message": "Upit po prefiksu kontrolnog identifikacijskog broja"
},
"whatQueryByHashPrefix": {
"message": "Umjesto zahtijeva za odjeljke sa poslužitelja koristeći videoID, prva 4 znaka sigurnosnog kontrolnog broja videoID-a su poslani. Taj poslužitelj poslat će nazad podatke za sva videa sa sličnim sigurnosnim kontrolnim brojevima."
},
"enableRefetchWhenNotFound": {
"message": "Ponovno dohvati odjeljke za nova videa"
},
"whatRefetchWhenNotFound": {
"message": "Ukoliko je video nov, a nisu pronađeni novi odjeljci, nastavit će s dohvaćanjem svako par minuta dok gledate."
},
"showNotice": {
"message": "Prikaži napomenu opet"
},
"showSkipNotice": {
"message": "Pokaži obavijest nakon preskakanja isječka"
},
"showCategoryGuidelines": {
"message": "Prikaži pomoć za kategorije"
},
"website": {
"message": "Web-stranica",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "Izvorni kod",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "Napomena je nadograđena!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "Ako ti se i dalje ne sviđa, pritisni gumb „Nikad ne prikazuj”.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "Preskoči odsječak",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "Pokreni/prekini odsječak",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Pošalji odsječke",
"description": "Keybind label"
},
"nextChapterKeybind": {
"message": "Sljedeće poglavlje",
"description": "Keybind label"
},
"previousChapterKeybind": {
"message": "Prethodno poglavlje",
"description": "Keybind label"
},
"keybindDescription": {
"message": "Odaberi tipku upisom tipke i odaberi modifikatorske tipke koje želiš koristiti."
},
"0": {
"message": "Veza istekla. Provjerite svoju internetski vezu. Ako vaš internet radi, poslužitelj je vjerojatno preopterećen ili nedostupan."
},
"disableSkipping": {
"message": "Preskakanje je aktivirano"
},
"enableSkipping": {
"message": "Preskakanje je deaktivirano"
},
"yourWork": {
"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: "
},
"skip": {
"message": "Preskoči"
},
"mute": {
"message": "Isključi zvuk"
},
"full": {
"message": "Cijeli video",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "Preskočiti {0}?"
},
"mute_category": {
"message": "Utišati {0}?"
},
"skip_to_category": {
"message": "Preskočiti na {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "Preskočeno: {0}",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "Isključen zvuk: {0}",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Preskočeno na {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Deaktiviraj automatsko preskakanje"
},
"enableAutoSkip": {
"message": "Aktiviraj automatsko preskakanje"
},
"audioNotification": {
"message": "Zvučna obavijest pri preskakanju"
},
"audioNotificationDescription": {
"message": "Zvučna obavijest o preskakanju reproducirat će zvuk kad god se odsječak preskoči. Ako je deaktivirano (ili je automatsko preskakanje deaktivirano), zvuk se neće reproducirati."
},
"youHaveSkipped": {
"message": "Do sad ste preskočili "
},
"minLower": {
"message": "min"
},
"minsLower": {
"message": "min"
},
"hourLower": {
"message": "h"
},
"hoursLower": {
"message": "h"
},
"youHaveSavedTime": {
"message": "Spasili ste ljude od",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " njihova života",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "Provjerite status.sponsor.ajay.app za status poslužitelja."
},
"changeUserID": {
"message": "Uvezi/Izvezi svoj privatni UserID"
},
"setUserID": {
"message": "Postavi Privatni UserID"
},
"createdBy": {
"message": "Izradio"
},
"supportedSites": {
"message": "Podržane stranice: "
},
"optionsInfo": {
"message": "Omogući podržavanje Invidiousa, onemogući automatsko preskakanje, sakrij gumbe i drugo."
},
"add": {
"message": "Dodaj"
},
"addInvidiousInstanceError": {
"message": "Ova domena je neispravna. Trebaš unijeti SAMO domenu. Primjer: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Resetiraj popis instanci Invidiousa"
},
"resetInvidiousInstanceAlert": {
"message": "Upravo ćeš resetirati popis instanci Invidiousa"
},
"currentInstances": {
"message": "Trenutne instance:"
},
"minDuration": {
"message": "Minimalno trajanje (u sekundama):"
},
"minDurationDescription": {
"message": "Isječci kraći od postavljene vrijednosti neće biti preskočeni ili prikazani u playeru."
},
"enableManualSkipOnFullVideo": {
"message": "Koristi ručno preskakanje kad postoji etiketa za potuni video"
},
"whatManualSkipOnFullVideo": {
"message": "Za osobe koji žele gledati video bez prekida ako je u potpunosti sponzoriran ili samopromocija."
},
"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."
},
"showUploadButton": {
"message": "Prikaži gumb za prijenos"
},
"customServerAddress": {
"message": "Adresa SponsorBlock poslužitelja"
},
"save": {
"message": "Spremi"
},
"reset": {
"message": "Resetiraj"
},
"mobileUpdateInfo": {
"message": "Sada se podržava m.youtube.com"
},
"exportOptions": {
"message": "Uvezi/Izvezi sve postavke"
},
"exportOptionsCopy": {
"message": "Uredi/kopiraj"
},
"exportOptionsDownload": {
"message": "Spremi u datoteku"
},
"exportOptionsUpload": {
"message": "Učitaj iz datoteke"
},
"setOptions": {
"message": "Postavi opcije"
},
"incorrectlyFormattedOptions": {
"message": "Ovaj JSON nije ispravno formatiran. Tvoje opcije nisu promijenjene."
},
"confirmNoticeTitle": {
"message": "Pošalji segment"
},
"submit": {
"message": "Pošalji"
},
"cancel": {
"message": "Odustani"
},
"delete": {
"message": "Izbriši"
},
"preview": {
"message": "Pregledaj"
},
"unsubmitted": {
"message": "Neposlano"
},
"inspect": {
"message": "Provjeri"
},
"edit": {
"message": "Uredi"
},
"copyDebugInformation": {
"message": "Kopiraj Informaciju Za Otklanjanje Pogrešaka U Međuspremnik"
},
"copyDebugInformationFailed": {
"message": "Pisanje u međuspremnik nije uspjelo"
},
"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. "
},
"to": {
"message": "do",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"CopiedExclamation": {
"message": "Kopirano!",
"description": "Used after something has been copied to the clipboard. Example: 'Copied!'"
},
"generic_guideline1": {
"message": "Uključi glatke prijelaze"
},
"generic_guideline2": {
"message": "Reproducira kao da ništa nije preskočeno"
},
"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_sponsor_guideline1": {
"message": "Plaćeni oglasi"
},
"category_sponsor_guideline2": {
"message": "Ne za donacije ili proizvode"
},
"category_selfpromo": {
"message": "Neplaćena promocija ili samopromocija"
},
"category_selfpromo_description": {
"message": "Slično kao „sponzor”, osim za neplaćenu promociju i samopromociju. To uključuje odlomke marketinga, donacija ili informacija o tome, s kim su surađivali."
},
"category_selfpromo_guideline1": {
"message": "Donacije, članarine i roba"
},
"category_exclusive_access": {
"message": "Eksluzivni pristup"
},
"category_exclusive_access_description": {
"message": "Samo za označavanje cijelih videa. Koristi se kad video prikazuje proizvod, uslugu ili lokaciju za koje su dobili besplatan ili subvencionirani pristup."
},
"category_interaction": {
"message": "Podsjetnik interakcije (Pretplati se)"
},
"category_interaction_short": {
"message": "Podsjetnik interakcije"
},
"category_intro": {
"message": "Stanka/Uvodna animacija"
},
"category_intro_description": {
"message": "Interval bez stvarnog sadržaja. Može biti stanka, statični kadar, ponavljajuća animacija. Ovo se ne bi trebalo koristiti za prijelaze koji sadrže informacije."
},
"category_intro_short": {
"message": "Stanka"
},
"category_intro_guideline1": {
"message": "Interval bez stvarnog sadržaja"
},
"category_outro": {
"message": "Završni kadrovi/Zasluge"
},
"category_preview": {
"message": "Pregled/Sažetak"
},
"category_preview_description": {
"message": "Zbirka isječaka koji pokazuju što dolazi u ovom videu ili drugim videima u nizu gdje se sve informacije kasnije ponavljaju u videu."
},
"category_filler": {
"message": "Nepotrebna Popuna/Šale"
},
"category_filler_short": {
"message": "Popuna"
},
"category_music_offtopic": {
"message": "Glazba: Ne-glazbeni dio"
},
"category_music_offtopic_description": {
"message": "Samo za videospotove. Ovo bi se trebalo koristiti samo za dijelove videospotova koji još nisu obuhvaćeni drugom kategorijom."
},
"category_music_offtopic_short": {
"message": "Ne-glazbeni"
},
"category_poi_highlight": {
"message": "Istaknuto"
},
"category_chapter": {
"message": "Poglavlje"
},
"category_chapter_description": {
"message": "Prilagođeno imenovana poglavlja koja opisuju glavne dijelove videa."
},
"category_chapter_guideline1": {
"message": "Ne spominji imena brendova sponzora"
},
"category_chapter_guideline2": {
"message": "Koristi veća poglavlja za opće dijelove"
},
"category_chapter_guideline3": {
"message": "Manja poglavlja se mogu smjestiti unutar većih"
},
"category_livestream_messages": {
"message": "Livestream: čitanje donacija/poruka"
},
"category_livestream_messages_short": {
"message": "Čitanje poruka"
},
"autoSkip": {
"message": "Automatsko preskakanje"
},
"manualSkip": {
"message": "Ručno preskakanje"
},
"disable": {
"message": "Deaktiviraj"
},
"autoSkip_POI": {
"message": "Automatski skoči na početak"
},
"manualSkip_POI": {
"message": "Pitaj kad se učitava video"
},
"showOverlay_full": {
"message": "Prikaži oznaku"
},
"showOverlay_chapter": {
"message": "Prikaži poglavlja"
},
"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"
},
"skipOption": {
"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"
},
"testingServerWarning": {
"message": "Svi podnesci i glasovi NEĆE BROJATI u glavnom poslužitelju dok se povezuješ s testnim poslužiteljem. Obavezno deaktiviraj ovo kada želiš slati podneske."
},
"bracketNow": {
"message": "(sada)"
},
"moreCategories": {
"message": "Više kategorija"
},
"chooseACategory": {
"message": "Odaberi kategoriju"
},
"enableThisCategoryFirst": {
"message": "Za slanje odsječaka kategorije „{0}”, moraš je aktivirati u postavkama. Sada ćemo te preusmjeriti na postavke.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
"message": "Moraš odabrati kategoriju za sve segmente koje šalješ!"
},
"bracketEnd": {
"message": "(kraj)"
},
"End": {
"message": "Kraj",
"description": "Button that skips to the end of a segment"
},
"hiddenDueToDuration": {
"message": "sakriveno: redak je prekratak"
},
"manuallyHidden": {
"message": "ručno skriveno"
},
"invidiousPermissionRefresh": {
"message": "Preglednik je opozvao dopuštenje potrebno za funkcioniranje na Invidiousu i drugim stranicama trećih strana. Pritisni donji gumb za ponovno aktiviranje ove dozvole."
},
"downvoteDescription": {
"message": "Neispravno/krivo vrijeme"
},
"incorrectVote": {
"message": "Neispravno"
},
"harmfulVote": {
"message": "Štetno",
"description": "Used for chapter segments when the text is harmful/offensive to remove it faster"
},
"incorrectCategory": {
"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."
},
"multipleSegments": {
"message": "Više segmenata"
},
"guidelines": {
"message": "Smjernice"
},
"readTheGuidelines": {
"message": "Pročitaj Smjernice!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "Stigle su kategorije!"
},
"categoryUpdate2": {
"message": "Otvori opcije za preskakanje uvoda, kraja, proizvoda itd."
},
"help": {
"message": "Pomoć"
},
"GotIt": {
"message": "Razumijem",
"description": "Used as the button to dismiss a tooltip"
},
"categoryPillTitleText": {
"message": "Ovaj cijeli video označen je kao ova kategorija i previše je integriran da bi se mogao odvojiti"
},
"chapterNameTooltipWarning": {
"message": "Jedno od tvojih imena poglavlja je slično kategoriji. Kad god moguće koristi kategorije."
},
"hideForever": {
"message": "Sakrij zauvijek"
},
"warningChatInfo": {
"message": "Primjetili smo da ste radili neke uobičajene pogreške. Mi cijenimo vaš trud, ali ovdje težimo perfekciji, pa i jako male pogreške su važne :)"
},
"warningTitle": {
"message": "Dobili ste upozorenje"
},
"questionButton": {
"message": "Imam pitanje"
},
"warningConfirmButton": {
"message": "Razumijem razlog"
},
"Donate": {
"message": "Doniraj"
},
"darkModeOptionsPage": {
"message": "Tamni Način Na Stranici Opcija"
},
"helpPageThanksForInstalling": {
"message": "Hvala na instaliranju SponsorBlocka."
},
"helpPageFeatureDisclaimer": {
"message": "Mnoge funkcije su standardno deaktivirane. Ako želiš preskočiti uvode, završne dijelove, koristiti Invidious, itd., aktiviraj ih niže dolje. Također možeš sakriti/prikazati elemente korisničkog sučelja."
},
"helpPageHowSkippingWorks": {
"message": "Kako preskakanje radi"
},
"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"
},
"downvote": {
"message": "Glasaj protiv"
},
"upvote": {
"message": "Glasaj za"
},
"hideSegment": {
"message": "Sakri odsječak"
},
"skipSegment": {
"message": "Preskoči odsječak"
},
"dayAbbreviation": {
"message": "d",
"description": "100d"
},
"hourAbbreviation": {
"message": "h",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Ponašanje",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "Sučelje",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "Tipkovni prečaci",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "Sigurnosna kopija/Obnova",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Razno",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Izgled napomene preskakanja",
"description": "Option label"
},
"notSet": {
"message": "Nije postavljeno"
},
"change": {
"message": "Promijeni"
},
"youtubeKeybindWarning": {
"message": "Ovo je ugrađeni YouTube prečac. Stvarno ga želiš koristiti?"
},
"betaServerWarning": {
"message": "BETA poslužitelj je aktiviran!"
},
"openOptionsPage": {
"message": "Otvori stranicu opcija"
},
"resetToDefault": {
"message": "Vrati standardne postavke"
},
"confirmResetToDefault": {
"message": "Stvarno želiš vratiti sve postavke na standardne vrijednosti? To je nepovratna radnja."
},
"exportSegments": {
"message": "Izvezi odsječke"
},
"importSegments": {
"message": "Uvezi odsječke"
},
"Import": {
"message": "Uvezi",
"description": "Button to initiate importing segments. Appears under the textbox where they paste in the data"
},
"redeemSuccess": {
"message": "Uspješno korištenje kupona!"
},
"redeemFailed": {
"message": "Licencni ključ je neispravan"
},
"hideUpsells": {
"message": "Sakrij opcije koje nisu dostupne bez dodatnog plaćanja"
},
"chooseACountry": {
"message": "Odaberi zemlju"
},
"noDiscount": {
"message": "Ne ispunjavaš uvjete za popust"
},
"discountLink": {
"message": "Poveznica za popust (pogledaj ružičastu cijenu)"
},
"selectYourCountry": {
"message": "Odaberi svoju zemlju"
},
"alreadyDonated": {
"message": "Ako si već donirao/la, možeš iskoristiti kupon za besplatan pristup putem e-pošte:",
"description": "After the colon is an email address"
},
"cantAfford": {
"message": "Ako si ne možeš priuštiti kupnju licence, pritisni {here} da vidiš imaš li pravo na popust",
"description": "Keep the curly braces. The word 'here' should be translated as well."
},
"patreonSignIn": {
"message": "Prijavi se putem Patreona"
},
"redeem": {
"message": "Iskoristi kupon"
},
"joinOnPatreon": {
"message": "Pretplati se na Patreon"
},
"oneTimePurchase": {
"message": "Jednokratna kupnja"
},
"enterLicenseKey": {
"message": "Upiši licencni ključ"
},
"videosSingular": {
"message": "video",
"description": "Example: You currently have 3 unsubmitted segments on 1 *video*"
},
"videosPlural": {
"message": "videa",
"description": "Example: You currently have 12 unsubmitted segments on 5 *videos*"
},
"videoID": {
"message": "ID videa",
"description": "Header of the unsubmitted segments list"
},
"segmentCount": {
"message": "Broj segmenata",
"description": "Header of the unsubmitted segments list"
},
"actions": {
"message": "Radnje",
"description": "Header of the unsubmitted segments list"
},
"exportSegmentsAsURL": {
"message": "Dijeli kao URL"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{}

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,25 +0,0 @@
{
"fullName": {
"message": "SponsorBlock priekš YouTube - Izlaid sponsorus",
"description": "Name of the extension."
},
"Description": {
"message": "Izlaidiet sponsorus, abonēšanas lūgumus un vairāk, skatoties YouTube video. Ziņojiet par sponsoriem video, kurus jūs skatāties, lai ietaupītu citu laiku.",
"description": "Description of the extension."
},
"400": {
"message": "Serveris ziņo, ka šis pieprasījums ir nederīgs"
},
"429": {
"message": "Jūs esat aizsūtījis pārāk daudz sponsoru laika sprīžus šim video; vai esat pārliecināts, ka šeit ir tik daudz?"
},
"409": {
"message": "Šis jau ir ticis aizsūtīts iepriekš"
},
"channelWhitelisted": {
"message": "Kanāls iekļauts baltajā sarakstā!"
},
"Segment": {
"message": "segments"
}
}

View File

@@ -1,533 +0,0 @@
{
"fullName": {
"message": "YouTube- നായുള്ള സ്പോൺസർബ്ലോക്ക് - സ്പോൺസർഷിപ്പുകൾ ഒഴിവാക്കുക",
"description": "Name of the extension."
},
"Description": {
"message": "YouTube വീഡിയോകളിൽ സ്പോൺസർഷിപ്പുകൾ, സബ്സ്ക്രിപ്ഷൻ ഭിക്ഷാടനം എന്നിവയും അതിലേറെയും ഒഴിവാക്കുക. മറ്റുള്ളവരുടെ സമയം ലാഭിക്കാൻ നിങ്ങൾ കാണുന്ന വീഡിയോകളിൽ സ്പോൺസർമാരെ റിപ്പോർട്ടുചെയ്യുക.",
"description": "Description of the extension."
},
"400": {
"message": "ഈ അഭ്യർത്ഥന അസാധുവാണെന്ന് സെർവർ പറഞ്ഞു"
},
"429": {
"message": "ഈ ഒരു വീഡിയോയ്‌ക്കായി നിങ്ങൾ വളരെയധികം സ്‌പോൺസർ തവണ സമർപ്പിച്ചു, ഇതിൽ ധാരാളം ഉണ്ടെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?"
},
"409": {
"message": "ഇത് ഇതിനകം സമർപ്പിച്ചു"
},
"channelWhitelisted": {
"message": "ചാനൽ വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌തു!"
},
"Segment": {
"message": "സെഗ്മെന്റ്"
},
"Segments": {
"message": "സെഗ്‌മെന്റുകൾ"
},
"upvoteButtonInfo": {
"message": "ഈ സമർപ്പണം ഉയർത്തുക"
},
"reportButtonTitle": {
"message": "റിപ്പോർട്ട് ചെയ്യുക"
},
"reportButtonInfo": {
"message": "ഈ സമർപ്പിക്കൽ തെറ്റാണെന്ന് റിപ്പോർട്ടുചെയ്യുക."
},
"Dismiss": {
"message": "നിരസിക്കുക"
},
"Loading": {
"message": "ലോഡിംഗ്..."
},
"Hide": {
"message": "ഒരിക്കലും കാണിക്കരുത്"
},
"hitGoBack": {
"message": "നിങ്ങൾ എവിടെ നിന്നാണ് വന്നതെന്ന് അൺസ്‌കിപ്പ് അമർത്തുക."
},
"unskip": {
"message": "അൺ‌സ്കിപ്പ്"
},
"reskip": {
"message": "റെസ്കിപ്പ്"
},
"paused": {
"message": "താൽക്കാലികമായി നിർത്തി"
},
"manualPaused": {
"message": "ടൈമർ നിർത്തി"
},
"confirmMSG": {
"message": "വ്യക്തിഗത മൂല്യങ്ങൾ എഡിറ്റുചെയ്യാനോ ഇല്ലാതാക്കാനോ, മുകളിൽ വലത് കോണിലുള്ള വിപുലീകരണ ഐക്കണിൽ ക്ലിക്കുചെയ്‌ത് വിവര ബട്ടൺ ക്ലിക്കുചെയ്യുക അല്ലെങ്കിൽ വിപുലീകരണ പോപ്പ്അപ്പ് തുറക്കുക."
},
"clearThis": {
"message": "ഇത് മായ്‌ക്കണമെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ?\n\n"
},
"Unknown": {
"message": "നിങ്ങളുടെ സ്പോൺസർ സമയം സമർപ്പിക്കുന്നതിൽ ഒരു പിശക് ഉണ്ടായിരുന്നു, ദയവായി പിന്നീട് വീണ്ടും ശ്രമിക്കുക."
},
"sponsorFound": {
"message": "ഈ വീഡിയോയ്ക്ക് ഡാറ്റാബേസിൽ സെഗ്‌മെന്റുകളുണ്ട്!"
},
"sponsor404": {
"message": "സെഗ്‌മെന്റുകളൊന്നും കണ്ടെത്തിയില്ല"
},
"sponsorStart": {
"message": "സെഗ്മെന്റ് ഇപ്പോൾ ആരംഭിക്കുന്നു"
},
"sponsorEnd": {
"message": "സെഗ്മെന്റ് ഇപ്പോൾ അവസാനിക്കുന്നു"
},
"noVideoID": {
"message": "YouTube വീഡിയോകളൊന്നും കണ്ടെത്തിയില്ല.\nഇത് തെറ്റാണെങ്കിൽ, ടാബ് പുതുക്കുക."
},
"success": {
"message": "വിജയം!"
},
"voted": {
"message": "വോട്ട് ചെയ്തു!"
},
"serverDown": {
"message": "സെർവർ പ്രവർത്തനരഹിതമാണെന്ന് തോന്നുന്നു. ദേവിനെ ഉടൻ ബന്ധപ്പെടുക."
},
"connectionError": {
"message": "ഒരു കണക്ഷൻ പിശക് സംഭവിച്ചു. പിശക് കോഡ്: "
},
"clearTimes": {
"message": "സെഗ്‌മെന്റുകൾ മായ്‌ക്കുക"
},
"openPopup": {
"message": "സ്പോൺസർബ്ലോക്ക് പോപ്പ്അപ്പ് തുറക്കുക"
},
"closePopup": {
"message": "പോപ്പ്അപ്പ് അടയ്‌ക്കുക"
},
"submitCheck": {
"message": "ഇത് സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
},
"whitelistChannel": {
"message": "വൈറ്റ്‌ലിസ്റ്റ് ചാനൽ"
},
"removeFromWhitelist": {
"message": "വൈറ്റ്‌ലിസ്റ്റിൽ നിന്ന് ചാനൽ നീക്കംചെയ്യുക"
},
"voteOnTime": {
"message": "ഒരു സെഗ്‌മെന്റിൽ വോട്ടുചെയ്യുക"
},
"Submissions": {
"message": "സമർപ്പിക്കലുകൾ"
},
"savedPeopleFrom": {
"message": "നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു "
},
"viewLeaderboard": {
"message": "ലീഡർബോർഡ്"
},
"recordTimesDescription": {
"message": "സമർപ്പിക്കുക"
},
"submissionEditHint": {
"message": "സമർപ്പിക്കുക ക്ലിക്കുചെയ്‌തതിനുശേഷം വിഭാഗം എഡിറ്റിംഗ് ദൃശ്യമാകും",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "സൂചന: ഓപ്ഷനുകളിൽ സമർപ്പിക്കുന്നതിന് നിങ്ങൾക്ക് കീബൈൻഡുകൾ സജ്ജമാക്കാൻ കഴിയും"
},
"clearTimesButton": {
"message": "ടൈംസ് മായ്‌ക്കുക"
},
"publicStats": {
"message": "നിങ്ങൾ എത്രമാത്രം സംഭാവന നൽകി എന്ന് കാണിക്കുന്നതിന് ഇത് പൊതു സ്ഥിതിവിവരക്കണക്ക് പേജിൽ ഉപയോഗിക്കുന്നു. അത് കാണുക"
},
"Username": {
"message": "ഉപയോക്തൃനാമം"
},
"setUsername": {
"message": "ഉപയോക്തൃനാമം സജ്ജമാക്കുക"
},
"discordAdvert": {
"message": "നിർദ്ദേശങ്ങളും ഫീഡ്‌ബാക്കും നൽകാൻ disc ദ്യോഗിക ഡിസ്കോർഡ് സെർവറിൽ ചേരുക!"
},
"hideThis": {
"message": "ഇത് മറയ്ക്കുക"
},
"Options": {
"message": "ഓപ്ഷനുകൾ"
},
"showButtons": {
"message": "YouTube പ്ലെയറിൽ ബട്ടണുകൾ കാണിക്കുക"
},
"hideButtons": {
"message": "YouTube പ്ലെയറിൽ ബട്ടണുകൾ മറയ്‌ക്കുക"
},
"hideButtonsDescription": {
"message": "ഒഴിവാക്കൽ സെഗ്‌മെന്റുകൾ സമർപ്പിക്കുന്നതിന് ഇത് YouTube പ്ലെയറിൽ ദൃശ്യമാകുന്ന ബട്ടണുകൾ മറയ്ക്കുന്നു."
},
"showInfoButton": {
"message": "YouTube പ്ലെയറിൽ വിവര ബട്ടൺ കാണിക്കുക"
},
"hideInfoButton": {
"message": "YouTube പ്ലെയറിൽ വിവര ബട്ടൺ മറയ്‌ക്കുക"
},
"hideDeleteButton": {
"message": "YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ മറയ്‌ക്കുക"
},
"showDeleteButton": {
"message": "YouTube പ്ലെയറിൽ ഇല്ലാതാക്കുക ബട്ടൺ കാണിക്കുക"
},
"enableViewTracking": {
"message": "ക Count ണ്ട് ട്രാക്കിംഗ് ഒഴിവാക്കുക പ്രാപ്തമാക്കുക"
},
"whatViewTracking": {
"message": "ഡേറ്റാബേസിലേക്ക് സ്പാം വരില്ലെന്ന് ഉറപ്പുവരുത്തുന്നതിനായി ഉപയോക്താക്കളുടെ സമർപ്പിക്കൽ മറ്റുള്ളവരെ എത്രമാത്രം സഹായിച്ചിട്ടുണ്ടെന്നും അപ്‌വോട്ടുകൾക്കൊപ്പം ഒരു മെട്രിക്കായി ഉപയോഗിച്ചുവെന്നും ഉപയോക്താക്കളെ അറിയിക്കുന്നതിന് നിങ്ങൾ ഒഴിവാക്കിയ സെഗ്‌മെന്റുകൾ ഈ സവിശേഷത ട്രാക്കുചെയ്യുന്നു. നിങ്ങൾ ഒരു സെഗ്മെന്റ് ഒഴിവാക്കുമ്പോഴെല്ലാം വിപുലീകരണം സെർവറിലേക്ക് ഒരു സന്ദേശം അയയ്ക്കുന്നു. കാഴ്ച നമ്പറുകൾ കൃത്യമാകുന്നതിനായി മിക്ക ആളുകളും ഈ ക്രമീകരണം മാറ്റില്ലെന്ന് കരുതുന്നു. :)"
},
"enableQueryByHashPrefix": {
"message": "ഹാഷ് പ്രിഫിക്‌സ് പ്രകാരം അന്വേഷണം"
},
"whatQueryByHashPrefix": {
"message": "വീഡിയോ ഐഡി ഉപയോഗിച്ച് സെർവറിൽ നിന്ന് സെഗ്‌മെന്റുകൾ അഭ്യർത്ഥിക്കുന്നതിനുപകരം, വീഡിയോ ഐഡിയുടെ ഹാഷിന്റെ ആദ്യ 4 പ്രതീകങ്ങൾ അയയ്‌ക്കുന്നു. സമാന ഹാഷുകളുള്ള എല്ലാ വീഡിയോകൾക്കുമായുള്ള ഡാറ്റ ഈ സെർവർ തിരികെ അയയ്ക്കും."
},
"enableRefetchWhenNotFound": {
"message": "പുതിയ വീഡിയോകളിൽ സെഗ്‌മെന്റുകൾ വീണ്ടും കാണുക"
},
"whatRefetchWhenNotFound": {
"message": "വീഡിയോ പുതിയതാണെങ്കിൽ, സെഗ്‌മെന്റുകളൊന്നും കണ്ടെത്തിയില്ലെങ്കിൽ, നിങ്ങൾ കാണുമ്പോൾ ഓരോ മിനിറ്റിലും ഇത് വീണ്ടും പുതുക്കുന്നു."
},
"showNotice": {
"message": "അറിയിപ്പ് വീണ്ടും കാണിക്കുക"
},
"showSkipNotice": {
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കിയതിനുശേഷം അറിയിപ്പ് കാണിക്കുക"
},
"longDescription": {
"message": "സ്പോൺസർമാർ, ആമുഖങ്ങൾ, ros ട്ട്‌ട്രോകൾ, സബ്‌സ്‌ക്രിപ്‌ഷൻ ഓർമ്മപ്പെടുത്തലുകൾ, YouTube വീഡിയോകളുടെ മറ്റ് ശല്യപ്പെടുത്തുന്ന ഭാഗങ്ങൾ എന്നിവ ഒഴിവാക്കാൻ സ്‌പോൺസർബ്ലോക്ക് നിങ്ങളെ അനുവദിക്കുന്നു. സ്പോൺ‌സർ‌ബ്ലോക്ക് ഒരു ക്ര crow ഡ്സോഴ്സ്ഡ് ബ്ര browser സർ എക്സ്റ്റൻഷനാണ്, ഇത് സ്പോൺസർ ചെയ്ത സെഗ്‌മെന്റുകളുടെയും YouTube വീഡിയോകളുടെ മറ്റ് സെഗ്‌മെൻറുകളുടെയും ആരംഭ, അവസാന സമയങ്ങൾ സമർപ്പിക്കാൻ ആരെയും അനുവദിക്കുക. ഒരു വ്യക്തി ഈ വിവരങ്ങൾ‌ സമർപ്പിച്ചുകഴിഞ്ഞാൽ‌, ഈ വിപുലീകരണമുള്ള മറ്റെല്ലാവരും സ്പോൺ‌സർ‌ ചെയ്‌ത സെഗ്‌മെൻറിനെ മറികടക്കും. സംഗീത വീഡിയോകളുടെ സംഗീതേതര വിഭാഗങ്ങളും നിങ്ങൾക്ക് ഒഴിവാക്കാം.",
"description": "Full description of the extension on the store pages."
},
"website": {
"message": "വെബ്സൈറ്റ്",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "സോഴ്സ് കോഡ്",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "അറിയിപ്പ് അപ്‌ഗ്രേഡുചെയ്‌തു!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "നിങ്ങൾക്ക് ഇപ്പോഴും ഇഷ്‌ടമായില്ലെങ്കിൽ, ഒരിക്കലും കാണിക്കരുത് ബട്ടൺ അമർത്തുക.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"0": {
"message": "കണക്ഷൻ കാലഹരണപ്പെട്ടു. നിങ്ങളുടെ ഇന്റർനെറ്റ് കണക്ഷൻ പരിശോധിക്കുക. നിങ്ങളുടെ ഇൻറർനെറ്റ് പ്രവർത്തിക്കുന്നുണ്ടെങ്കിൽ, സെർവർ ഓവർലോഡ് അല്ലെങ്കിൽ ഡ. ൺ ആയിരിക്കാം."
},
"disableSkipping": {
"message": "ഒഴിവാക്കൽ പ്രാപ്തമാക്കി"
},
"enableSkipping": {
"message": "ഒഴിവാക്കുന്നത് പ്രവർത്തനരഹിതമാക്കി"
},
"yourWork": {
"message": "നിങ്ങളുടെ ജോലി",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "സെർവർ ഓവർലോഡ് ചെയ്തതായി തോന്നുന്നു. കുറച്ച് നിമിഷങ്ങൾക്കുള്ളിൽ വീണ്ടും ശ്രമിക്കുക."
},
"errorCode": {
"message": "പിശക് കോഡ്: "
},
"skip": {
"message": "ഒഴിവാക്കുക"
},
"skip_category": {
"message": "{0} ഒഴിവാക്കുക?"
},
"disableAutoSkip": {
"message": "യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനരഹിതമാക്കുക"
},
"enableAutoSkip": {
"message": "യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനക്ഷമമാക്കുക"
},
"audioNotification": {
"message": "ഒഴിവാക്കുന്ന ഓഡിയോ അറിയിപ്പ്"
},
"audioNotificationDescription": {
"message": "ഒരു സെഗ്മെന്റ് ഒഴിവാക്കുമ്പോഴെല്ലാം സ്കിപ്പിലെ ഓഡിയോ അറിയിപ്പ് ശബ്‌ദം പ്ലേ ചെയ്യും. അപ്രാപ്‌തമാക്കിയിട്ടുണ്ടെങ്കിൽ (അല്ലെങ്കിൽ യാന്ത്രിക ഒഴിവാക്കൽ പ്രവർത്തനരഹിതമാക്കി), ശബ്‌ദമൊന്നും പ്ലേ ചെയ്യില്ല."
},
"showTimeWithSkips": {
"message": "നീക്കംചെയ്‌ത സ്‌കിപ്പുകൾ ഉപയോഗിച്ച് സമയം കാണിക്കുക"
},
"showTimeWithSkipsDescription": {
"message": "സീക്ക്ബാറിന് താഴെയുള്ള നിലവിലെ സമയത്തിന് അടുത്തുള്ള ബ്രാക്കറ്റുകളിൽ ഈ സമയം ദൃശ്യമാകുന്നു. ഏത് സെഗ്‌മെന്റുകളുടെയും മൈനസ് മൊത്തം വീഡിയോ ദൈർഘ്യം ഇത് കാണിക്കുന്നു. \"സീക്ക്ബാറിൽ കാണിക്കുക\" എന്ന് മാത്രം അടയാളപ്പെടുത്തിയ സെഗ്‌മെന്റുകൾ ഇതിൽ ഉൾപ്പെടുന്നു."
},
"youHaveSkipped": {
"message": "നിങ്ങൾ ഒഴിവാക്കി "
},
"minLower": {
"message": "മിനിറ്റ്"
},
"minsLower": {
"message": "മിനിറ്റ്"
},
"hourLower": {
"message": "മണിക്കൂർ"
},
"hoursLower": {
"message": "മണിക്കൂറുകൾ"
},
"youHaveSavedTime": {
"message": "നിങ്ങൾ ആളുകളെ സംരക്ഷിച്ചു",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " അവരുടെ ജീവിതത്തിന്റെ",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "സെർവർ നിലയ്ക്കായി status.sponsor.ajay.app പരിശോധിക്കുക."
},
"createdBy": {
"message": "ഉണ്ടാക്കിയത്"
},
"optionsInfo": {
"message": "ആക്രമണാത്മക പിന്തുണ പ്രാപ്തമാക്കുക, ഓട്ടോസ്കിപ്പ് അപ്രാപ്തമാക്കുക, ബട്ടണുകൾ മറയ്ക്കുക എന്നിവയും അതിലേറെയും."
},
"add": {
"message": "ചേർക്കുക"
},
"addInvidiousInstanceError": {
"message": "ഇതൊരു അസാധുവായ ഡൊമെയ്‌നാണ്. ഇതിൽ ഡൊമെയ്ൻ ഭാഗം ഉൾപ്പെടുത്തണം. ഉദാഹരണം: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "ആക്രമണാത്മക ഉദാഹരണ പട്ടിക പുന reset സജ്ജമാക്കുക"
},
"resetInvidiousInstanceAlert": {
"message": "നിങ്ങൾ ഇൻ‌വിഡിയസ് ഇൻസ്റ്റൻസ് ലിസ്റ്റ് പുന reset സജ്ജമാക്കാൻ പോകുന്നു"
},
"currentInstances": {
"message": "നിലവിലെ സംഭവങ്ങൾ:"
},
"minDuration": {
"message": "കുറഞ്ഞ ദൈർഘ്യം (സെക്കൻഡ്):"
},
"minDurationDescription": {
"message": "സെറ്റ് മൂല്യത്തേക്കാൾ കുറവുള്ള സെഗ്‌മെന്റുകൾ ഒഴിവാക്കുകയോ പ്ലെയറിൽ കാണിക്കുകയോ ചെയ്യില്ല."
},
"shortCheck": {
"message": "ഇനിപ്പറയുന്ന സമർപ്പിക്കൽ നിങ്ങളുടെ മിനിമം ദൈർഘ്യ ഓപ്‌ഷനേക്കാൾ ചെറുതാണ്. ഇത് ഇതിനകം സമർപ്പിച്ചുവെന്നും ഈ ഓപ്ഷൻ കാരണം അവഗണിക്കപ്പെടുന്നുവെന്നും ഇതിനർത്ഥം. സമർപ്പിക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെന്ന് ഉറപ്പാണോ?"
},
"showUploadButton": {
"message": "അപ്‌ലോഡ് ബട്ടൺ കാണിക്കുക"
},
"customServerAddress": {
"message": "സ്പോൺസർബ്ലോക്ക് സെർവർ വിലാസം"
},
"customServerAddressDescription": {
"message": "സെർവറിലേക്ക് കോളുകൾ ചെയ്യാൻ സ്പോൺസർബ്ലോക്ക് ഉപയോഗിക്കുന്ന വിലാസം.\nനിങ്ങൾക്ക് സ്വന്തമായി സെർവർ ഇൻസ്റ്റൻസ് ഇല്ലെങ്കിൽ, ഇത് മാറ്റാൻ പാടില്ല."
},
"save": {
"message": "രക്ഷിക്കും"
},
"reset": {
"message": "പുന et സജ്ജമാക്കുക"
},
"customAddressError": {
"message": "ഈ വിലാസം ശരിയായ രൂപത്തിലല്ല. നിങ്ങൾക്ക് തുടക്കത്തിൽ http: // അല്ലെങ്കിൽ https: // ഉണ്ടെന്നും പിന്നിൽ സ്ലാഷുകളൊന്നുമില്ലെന്നും ഉറപ്പാക്കുക."
},
"areYouSureReset": {
"message": "ഇത് പുന reset സജ്ജമാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ?"
},
"mobileUpdateInfo": {
"message": "m.youtube.com ഇപ്പോൾ പിന്തുണയ്ക്കുന്നു"
},
"exportOptions": {
"message": "എല്ലാ ഓപ്ഷനുകളും ഇറക്കുമതി ചെയ്യുക / കയറ്റുമതി ചെയ്യുക"
},
"setOptions": {
"message": "ഓപ്ഷനുകൾ സജ്ജമാക്കുക"
},
"exportOptionsWarning": {
"message": "മുന്നറിയിപ്പ്: ഓപ്ഷനുകൾ മാറ്റുന്നത് ശാശ്വതമായതിനാൽ നിങ്ങളുടെ ഇൻസ്റ്റാൾ തകർക്കാൻ കഴിയും. ഇത് ചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുവെന്ന് ഉറപ്പാണോ? നിങ്ങളുടെ പഴയത് ബാക്കപ്പ് ചെയ്യുന്നത് ഉറപ്പാക്കുക."
},
"incorrectlyFormattedOptions": {
"message": "ഈ JSON ശരിയായി ഫോർമാറ്റ് ചെയ്തിട്ടില്ല. നിങ്ങളുടെ ഓപ്ഷനുകൾ മാറ്റിയിട്ടില്ല."
},
"confirmNoticeTitle": {
"message": "സെഗ്മെന്റ് സമർപ്പിക്കുക"
},
"submit": {
"message": "സമർപ്പിക്കുക"
},
"cancel": {
"message": "റദ്ദാക്കുക"
},
"delete": {
"message": "ഇല്ലാതാക്കുക"
},
"preview": {
"message": "പ്രിവ്യൂ"
},
"inspect": {
"message": "പരിശോധിക്കുക"
},
"edit": {
"message": "എഡിറ്റുചെയ്യുക"
},
"copyDebugInformation": {
"message": "ഡീബഗ് വിവരങ്ങൾ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുക"
},
"copyDebugInformationFailed": {
"message": "ക്ലിപ്പ്ബോർഡിലേക്ക് എഴുതുന്നതിൽ പരാജയപ്പെട്ടു"
},
"copyDebugInformationOptions": {
"message": "ഒരു ബഗ് ഉയർത്തുമ്പോൾ / ഒരു ഡവലപ്പർ ആവശ്യപ്പെടുമ്പോൾ ഒരു ഡവലപ്പർക്ക് നൽകേണ്ട വിവരങ്ങൾ ക്ലിപ്പ്ബോർഡിലേക്ക് പകർത്തുന്നു. നിങ്ങളുടെ ഉപയോക്തൃ ഐഡി, വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌ത ചാനലുകൾ, ഇഷ്‌ടാനുസൃത സെർവർ വിലാസം എന്നിവ പോലുള്ള സെൻസിറ്റീവ് വിവരങ്ങൾ നീക്കംചെയ്‌തു. എന്നിരുന്നാലും നിങ്ങളുടെ ഉപയോഗശൂന്യമായ, ബ്ര browser സർ, ഓപ്പറേറ്റിംഗ് സിസ്റ്റം, വിപുലീകരണ പതിപ്പ് നമ്പർ എന്നിവ പോലുള്ള വിവരങ്ങൾ ഇതിൽ അടങ്ങിയിരിക്കുന്നു. "
},
"copyDebugInformationComplete": {
"message": "ഡീബഗ് വിവരങ്ങൾ ക്ലിപ്പ് ബോർഡിലേക്ക് പകർത്തി. നിങ്ങൾ പങ്കിടാൻ ആഗ്രഹിക്കാത്ത ഏതെങ്കിലും വിവരങ്ങൾ നീക്കംചെയ്യാൻ മടിക്കേണ്ട. ഇത് ഒരു ടെക്സ്റ്റ് ഫയലിൽ സംരക്ഷിക്കുക അല്ലെങ്കിൽ ബഗ് റിപ്പോർട്ടിൽ ഒട്ടിക്കുക."
},
"to": {
"message": "ടു",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "സ്പോൺസർ"
},
"category_sponsor_description": {
"message": "പണമടച്ചുള്ള പ്രമോഷൻ, പണമടച്ചുള്ള റഫറലുകൾ, നേരിട്ടുള്ള പരസ്യങ്ങൾ. സ്വയം പ്രൊമോഷനോ അല്ലെങ്കിൽ കാരണങ്ങൾ / സ്രഷ്‌ടാക്കൾ / വെബ്‌സൈറ്റുകൾ / ഉൽപ്പന്നങ്ങൾ എന്നിവയ്‌ക്ക് സ shout ജന്യ ശബ്ദമുയർത്തുന്നതിനോ അല്ല."
},
"category_selfpromo": {
"message": "പണമടയ്ക്കാത്ത / സ്വയം പ്രമോഷൻ"
},
"category_selfpromo_description": {
"message": "പണമടയ്ക്കാത്ത അല്ലെങ്കിൽ സ്വയം പ്രമോഷൻ ഒഴികെ \"സ്പോൺസർ\" എന്നതിന് സമാനമാണ്. ചരക്കുകൾ, സംഭാവനകൾ, അല്ലെങ്കിൽ അവർ ആരുമായി സഹകരിച്ചു എന്നതിനെക്കുറിച്ചുള്ള വിവരങ്ങൾ എന്നിവ ഇതിൽ ഉൾപ്പെടുന്നു."
},
"category_interaction": {
"message": "ഇന്ററാക്ഷൻ ഓർമ്മപ്പെടുത്തൽ (സബ്‌സ്‌ക്രൈബുചെയ്യുക)"
},
"category_interaction_description": {
"message": "ഉള്ളടക്കത്തിന്റെ മധ്യത്തിൽ ഇഷ്‌ടപ്പെടാനോ സബ്‌സ്‌ക്രൈബുചെയ്യാനോ പിന്തുടരാനോ ഒരു ഹ്രസ്വ ഓർമ്മപ്പെടുത്തൽ ഉണ്ടാകുമ്പോൾ. ഇത് ദൈർഘ്യമേറിയതോ നിർദ്ദിഷ്ടമായതോ ആയ കാര്യങ്ങളാണെങ്കിൽ, അത് സ്വയം പ്രൊമോഷന് കീഴിലായിരിക്കണം."
},
"category_interaction_short": {
"message": "ഇടപെടൽ ഓർമ്മപ്പെടുത്തൽ"
},
"category_intro": {
"message": "ഇടവേള / ആമുഖ ആനിമേഷൻ"
},
"category_intro_description": {
"message": "യഥാർത്ഥ ഉള്ളടക്കമില്ലാത്ത ഇടവേള. ഒരു താൽക്കാലികമായി നിർത്താം, സ്റ്റാറ്റിക് ഫ്രെയിം, ആവർത്തിക്കുന്ന ആനിമേഷൻ. വിവരങ്ങൾ അടങ്ങിയ സംക്രമണങ്ങൾക്ക് ഇത് ഉപയോഗിക്കരുത്."
},
"category_intro_short": {
"message": "ഇടവേള"
},
"category_outro": {
"message": "എൻഡ്‌കാർഡുകൾ / ക്രെഡിറ്റുകൾ"
},
"category_outro_description": {
"message": "ക്രെഡിറ്റുകൾ അല്ലെങ്കിൽ YouTube എൻഡ്‌കാർഡുകൾ ദൃശ്യമാകുമ്പോൾ. വിവരങ്ങളുമായുള്ള നിഗമനങ്ങളിൽ അല്ല."
},
"category_music_offtopic": {
"message": "സംഗീതം: സംഗീതേതര വിഭാഗം"
},
"category_music_offtopic_description": {
"message": "സംഗീത വീഡിയോകളിൽ മാത്രം ഉപയോഗിക്കുന്നതിന് മാത്രം. ഇതിനകം മറ്റൊരു വിഭാഗത്തിൽ ഉൾപ്പെടാത്ത സംഗീത വീഡിയോകളുടെ വിഭാഗങ്ങൾക്കായി മാത്രമേ ഉപയോഗിക്കാവൂ."
},
"category_music_offtopic_short": {
"message": "നോൺ-മ്യൂസിക്"
},
"category_livestream_messages": {
"message": "ലൈവ്സ്ട്രീം: സംഭാവന / സന്ദേശ വായന"
},
"category_livestream_messages_short": {
"message": "സന്ദേശ വായന"
},
"autoSkip": {
"message": "യാന്ത്രിക ഒഴിവാക്കുക"
},
"manualSkip": {
"message": "സ്വമേധയാലുള്ള ഒഴിവാക്കൽ"
},
"showOverlay": {
"message": "സീക്ക് ബാറിൽ കാണിക്കുക"
},
"disable": {
"message": "പ്രവർത്തനരഹിതമാക്കുക"
},
"seekBarColor": {
"message": "ബാർ കളർ തേടുക"
},
"category": {
"message": "വിഭാഗം"
},
"skipOption": {
"message": "ഓപ്ഷൻ ഒഴിവാക്കുക",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "ബീറ്റ ടെസ്റ്റിംഗ് സെർവർ പ്രാപ്തമാക്കുക"
},
"whatEnableTestingServer": {
"message": "നിങ്ങളുടെ സമർപ്പിക്കലുകളും വോട്ടുകളും പ്രധാന സെർവറിലേക്ക് കണക്കാക്കില്ല. പരിശോധനയ്ക്കായി മാത്രം ഇത് ഉപയോഗിക്കുക."
},
"testingServerWarning": {
"message": "ടെസ്റ്റ് സെർവറിലേക്ക് കണക്റ്റുചെയ്യുമ്പോൾ എല്ലാ സമർപ്പിക്കലുകളും വോട്ടുകളും പ്രധാന സെർവറിലേക്ക് കണക്കാക്കില്ല. നിങ്ങൾക്ക് യഥാർത്ഥ സമർപ്പിക്കലുകൾ നടത്താൻ താൽപ്പര്യപ്പെടുമ്പോൾ ഇത് പ്രവർത്തനരഹിതമാക്കുന്നത് ഉറപ്പാക്കുക."
},
"bracketNow": {
"message": "(ഇപ്പോൾ)"
},
"moreCategories": {
"message": "കൂടുതൽ വിഭാഗങ്ങൾ"
},
"chooseACategory": {
"message": "ഒരു വിഭാഗം തിരഞ്ഞെടുക്കുക"
},
"enableThisCategoryFirst": {
"message": "\"{0}\" വിഭാഗത്തിൽ സെഗ്‌മെന്റുകൾ സമർപ്പിക്കുന്നതിന്, നിങ്ങൾ ഇത് ഓപ്ഷനുകളിൽ പ്രവർത്തനക്ഷമമാക്കണം. നിങ്ങളെ ഇപ്പോൾ ഓപ്ഷനുകളിലേക്ക് റീഡയറക്ട് ചെയ്യും.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
"message": "നിങ്ങൾ സമർപ്പിക്കുന്ന എല്ലാ സെഗ്‌മെന്റുകൾക്കും നിങ്ങൾ ഒരു വിഭാഗം തിരഞ്ഞെടുക്കണം!"
},
"bracketEnd": {
"message": "(അവസാനിക്കുന്നു)"
},
"hiddenDueToDownvote": {
"message": "മറഞ്ഞിരിക്കുന്നു: താഴേക്ക്"
},
"hiddenDueToDuration": {
"message": "മറഞ്ഞിരിക്കുന്നു: വളരെ ചെറുതാണ്"
},
"forceChannelCheck": {
"message": "ഒഴിവാക്കുന്നതിനുമുമ്പ് ചാനൽ പരിശോധന നിർബന്ധിക്കുക"
},
"whatForceChannelCheck": {
"message": "സ്ഥിരസ്ഥിതിയായി, ചാനൽ എന്താണെന്ന് അറിയുന്നതിന് മുമ്പായി അത് സെഗ്‌മെന്റുകൾ ഉടൻ തന്നെ ഒഴിവാക്കും. സ്ഥിരസ്ഥിതിയായി, വീഡിയോയുടെ തുടക്കത്തിലെ ചില സെഗ്‌മെന്റുകൾ വൈറ്റ്‌ലിസ്റ്റ് ചെയ്‌ത ചാനലുകളിൽ ഒഴിവാക്കാം. ഈ ഓപ്‌ഷൻ പ്രവർത്തനക്ഷമമാക്കുന്നത് ഇത് തടയും എന്നാൽ ചാനൽ ഐഡി ലഭിക്കാൻ കുറച്ച് സമയമെടുക്കുന്നതിനാൽ എല്ലാ ഒഴിവാക്കലിനും ചെറിയ കാലതാമസം നേരിടുന്നു. നിങ്ങൾക്ക് വേഗതയേറിയ ഇന്റർനെറ്റ് ഉണ്ടെങ്കിൽ ഈ കാലതാമസം ശ്രദ്ധിക്കപ്പെടില്ല."
},
"forceChannelCheckPopup": {
"message": "\"ഒഴിവാക്കുന്നതിനുമുമ്പ് ഫോഴ്‌സ് ചാനൽ പരിശോധന\" പ്രവർത്തനക്ഷമമാക്കുന്നത് പരിഗണിക്കുക"
},
"downvoteDescription": {
"message": "തെറ്റായ / തെറ്റായ സമയം"
},
"nonMusicCategoryOnMusic": {
"message": "ഈ വീഡിയോയെ സംഗീതമായി വർഗ്ഗീകരിച്ചിരിക്കുന്നു. ഇതിന് ഒരു സ്പോൺസർ ഉണ്ടെന്ന് നിങ്ങൾക്ക് ഉറപ്പാണോ? ഇത് യഥാർത്ഥത്തിൽ \"സംഗീതേതര വിഭാഗമാണ്\" എങ്കിൽ, വിപുലീകരണ ഓപ്ഷനുകൾ തുറന്ന് ഈ വിഭാഗം പ്രാപ്തമാക്കുക. തുടർന്ന്, സ്പോൺസറിന് പകരം \"നോൺ-മ്യൂസിക്\" എന്ന് നിങ്ങൾക്ക് ഈ സെഗ്മെന്റ് സമർപ്പിക്കാൻ കഴിയും. നിങ്ങൾ ആശയക്കുഴപ്പത്തിലാണെങ്കിൽ ദയവായി മാർഗ്ഗനിർദ്ദേശങ്ങൾ വായിക്കുക."
},
"multipleSegments": {
"message": "ഒന്നിലധികം സെഗ്‌മെന്റുകൾ"
},
"guidelines": {
"message": "മാർഗ്ഗനിർദ്ദേശങ്ങൾ"
},
"readTheGuidelines": {
"message": "മാർഗ്ഗനിർദ്ദേശങ്ങൾ വായിക്കുക!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "വിഭാഗങ്ങൾ ഇവിടെയുണ്ട്!"
},
"categoryUpdate2": {
"message": "ആമുഖങ്ങൾ, ഉൽ‌പ്പന്നങ്ങൾ‌, ചരക്കുകൾ‌ മുതലായവ ഒഴിവാക്കുന്നതിനുള്ള ഓപ്ഷനുകൾ‌ തുറക്കുക."
}
}

View File

@@ -1 +0,0 @@
{}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,892 +0,0 @@
{
"fullName": {
"message": "SponsorBlock for YouTube - Hopp over sponsinger",
"description": "Name of the extension."
},
"Description": {
"message": "Hopp over sponsinger, abonnementstigging og mer på YouTube-videoer. Rapporter inn sponsorer på videoer du ser på for å spare andre sin tid.",
"description": "Description of the extension."
},
"400": {
"message": "Tjeneren sa at denne forespørselen var ugyldig"
},
"429": {
"message": "Du har sendt inn for mange sponsortidspunkter på denne ene videoen, er du sikker på at det er såpass mange?"
},
"409": {
"message": "Dette har allerede blitt sendt inn tidligere"
},
"channelWhitelisted": {
"message": "Kanalen ble hvitelistet!"
},
"Segment": {
"message": "segment"
},
"Segments": {
"message": "segmenter"
},
"upvoteButtonInfo": {
"message": "Gi plusstemme til denne innsendingen"
},
"reportButtonTitle": {
"message": "Rapporter"
},
"reportButtonInfo": {
"message": "Rapporter inn denne innsendingen som en feil."
},
"Dismiss": {
"message": "Lukk"
},
"Loading": {
"message": "Laster..."
},
"Hide": {
"message": "Aldri vis"
},
"hitGoBack": {
"message": "Klikk \"Angre hopp\" for å gå til dit du hoppet fra."
},
"unskip": {
"message": "Angre hopp"
},
"reskip": {
"message": "Hopp igjen"
},
"unmute": {
"message": "Skru av demping"
},
"paused": {
"message": "På pause"
},
"manualPaused": {
"message": "Tidtaker stoppet"
},
"confirmMSG": {
"message": "For å redigere eller slette individuelle verdier, klikk på infoknappen eller åpne utvidelsens oppsprett ved å klikke på utvidelsesikonet i øvre høyre hjørne."
},
"clearThis": {
"message": "Er du sikker på at du vil tømme dette?\n\n"
},
"Unknown": {
"message": "Det oppstod en feil under innsending av sponsortidene dine, vennligst prøv igjen senere."
},
"sponsorFound": {
"message": "Denne videoen har segmenter i databasen!"
},
"sponsor404": {
"message": "Ingen segmenter ble funnet"
},
"sponsorStart": {
"message": "Segmentet starter nå"
},
"sponsorEnd": {
"message": "Segmentet slutter nå"
},
"sponsorCancel": {
"message": "Avbryt opprettelse av segment"
},
"noVideoID": {
"message": "Ingen YouTube-video ble funnet.\nHvis dette er feil, oppfrisk fanen."
},
"refreshSegments": {
"message": "Oppdater segmenter"
},
"success": {
"message": "Suksess!"
},
"voted": {
"message": "Du har stemt!"
},
"serverDown": {
"message": "Det ser ut til at tjeneren er nede. Kontakt utvikleren umiddelbart."
},
"connectionError": {
"message": "En tilkoblingsfeil har oppstått. Feilkode: "
},
"clearTimes": {
"message": "Tøm segmenter"
},
"openPopup": {
"message": "Åpne SponsorBlock-oppsprett"
},
"closePopup": {
"message": "Lukk oppsprett"
},
"submitCheck": {
"message": "Er du sikker på at du vil sende inn dette?"
},
"whitelistChannel": {
"message": "Hvitelist kanalen"
},
"removeFromWhitelist": {
"message": "Fjern kanalen fra hvitelisten"
},
"voteOnTime": {
"message": "Stem på et segment"
},
"Submissions": {
"message": "Innsendinger"
},
"savedPeopleFrom": {
"message": "Du har spart folk fra "
},
"viewLeaderboard": {
"message": "Toppliste"
},
"recordTimesDescription": {
"message": "Send"
},
"submissionEditHint": {
"message": "Seksjonsredigering vil dukke opp etter at du har klikket på «Send inn»",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Hint: Du kan sette opp hurtigtaster for innsending i innstillingene"
},
"clearTimesButton": {
"message": "Tøm tidspunkter"
},
"publicStats": {
"message": "Dette brukes på den offentlige statistikksiden for å vise hvor mye du har bidratt med. Se den"
},
"Username": {
"message": "Brukernavn"
},
"setUsername": {
"message": "Angi brukernavn"
},
"copyPublicID": {
"message": "Kopiér offentlig bruker-ID"
},
"discordAdvert": {
"message": "Bli med i den offisielle Discord-tjeneren for å gi forslag og tilbakemeldinger!"
},
"hideThis": {
"message": "Skjul dette"
},
"Options": {
"message": "Valg"
},
"showButtons": {
"message": "Vis knapper på YouTube-avspilleren"
},
"hideButtons": {
"message": "Skjul knapper på YouTube-avspilleren"
},
"hideButtonsDescription": {
"message": "Dette skjuler knappene som dukker opp på YouTube-avspilleren for å sende inn hoppesegmenter."
},
"showSkipButton": {
"message": "Behold Hopp til høydepunkt-knappen på avspilleren"
},
"showInfoButton": {
"message": "Vis infoknappen på YouTube-avspilleren"
},
"hideInfoButton": {
"message": "Skjul infoknappen på YouTube-avspilleren"
},
"autoHideInfoButton": {
"message": "Skjul infoknappen automatisk"
},
"hideDeleteButton": {
"message": "Skjul Slett-knappen på YouTube-avspilleren"
},
"showDeleteButton": {
"message": "Vis Slett-knappen på YouTube-avspilleren"
},
"enableViewTracking": {
"message": "Skru på telling av hopp"
},
"whatViewTracking": {
"message": "Denne funksjonen sporer hvilke segmenter du har hoppet over, sånn at brukere vet hvor mye bidragene deres har hjulpet andre, og brukes som et målesystem sammen med plusstemmer for å sikre at spam ikke kommer inn i databasen. Utvidelsen sender en melding til tjeneren hver gang du hopper over et segment. Forhåpentligvis endrer ikke de fleste folk på denne innstillingene, sånn at visningstallene er nøyaktige. :)"
},
"enableViewTrackingInPrivate": {
"message": "Aktiver telling av antall hopp i privat/inkognito-faner"
},
"enableQueryByHashPrefix": {
"message": "Forespør ut i fra saltings-prefiks"
},
"whatQueryByHashPrefix": {
"message": "I stedet for å forespørre segmenter fra tjeneren ut i fra video-ID-en, blir de første 4 tegnene i saltingskoden til video-ID-en sendt. Denne tjeneren vil svare tilbake med data for alle videoer med lignende saltingskoder."
},
"enableRefetchWhenNotFound": {
"message": "Innhent segmenter i nye videoer på nytt"
},
"whatRefetchWhenNotFound": {
"message": "Hvis videoen er ny, og ingen segmenter ble funnet, vil den forsøke å innhente på nytt med noen minutters mellomrom mens du ser på videoen."
},
"showNotice": {
"message": "Vis varselet igjen"
},
"showSkipNotice": {
"message": "Vis varsel etter at et segment har blitt hoppet over"
},
"noticeVisibilityMode0": {
"message": "Hopp over-varsel i full størrelse"
},
"noticeVisibilityMode1": {
"message": "Små hopp over-varsler for autohopp"
},
"noticeVisibilityMode2": {
"message": "Alle små hopp over-varsler"
},
"noticeVisibilityMode3": {
"message": "Tonet hopp over-varsel for autohopp"
},
"noticeVisibilityMode4": {
"message": "Alle tonede hopp over-varsler"
},
"longDescription": {
"message": "SponsorBlock lar deg hoppe over sponsorer, introer, outro-er, abonnementspåminnelser, og andre irriterende deler av YouTube-videoer. SponsorBlock er en fellesskapsdrevet nettleserutvidelser som lar alle sende inn start- og sluttidspunktene til sponsede segmenter og andre segmenter i YouTube-videoer. Når en person sender inn denne informasjonen, vil alle andre med denne utvidelsen hoppe rett over det sponsede segmentet. Du kan også hoppe over ikke-musikk-seksjoner i musikkvideoer.",
"description": "Full description of the extension on the store pages."
},
"website": {
"message": "Nettsted",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "Kildekode",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "Varselet har blitt oppgradert!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "Hvis du fortsatt ikke liker det, klikk på «Aldri vis»-knappen.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "Hopp over segment",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "Start/stopp segment",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Send inn segmenter",
"description": "Keybind label"
},
"keybindDescription": {
"message": "Velg en tast ved å trykke på den, velg deretter hvilke modifikasjonstaster du ønsker å bruke."
},
"0": {
"message": "Tidsavbrudd for tilkobling. Sjekk internettilkoblingen din. Hvis internettet ditt virker, er tjeneren sannsynligvis overbelastet eller nede."
},
"disableSkipping": {
"message": "Hopping er skrudd på"
},
"enableSkipping": {
"message": "Hopping er skrudd av"
},
"yourWork": {
"message": "Arbeidet ditt",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "Tjeneren ser ut til å være overbelastet. Prøv igjen om noen sekunder."
},
"errorCode": {
"message": "Feilkode: "
},
"skip": {
"message": "Hopp over"
},
"mute": {
"message": "Lydløs"
},
"full": {
"message": "Full video",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "Vil du hoppe over {0}?"
},
"mute_category": {
"message": "Gjør {0} lydløs?"
},
"skip_to_category": {
"message": "Hopp til {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} hoppet over",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} lydløs",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "Hoppet til {0}",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "Skru av autohopping"
},
"enableAutoSkip": {
"message": "Skru på autohopping"
},
"audioNotification": {
"message": "Lydvarsel ved hopp"
},
"audioNotificationDescription": {
"message": "Lydvarsling ved hopp vil spille av en lyd når enn et segment blir hoppet over. Hvis det er skrudd av (eller at autohopping er skrudd av), vil det ikke bli spilt av en slik lyd."
},
"showTimeWithSkips": {
"message": "Vis tiden der hoppene er trukket fra"
},
"showTimeWithSkipsDescription": {
"message": "Denne tiden vises i parentes ved siden av den nåværende tiden under tidsstripen. Dette viser den totale videolengden minus evt. segmenter. Dette inkluderer segmenter som kun er markert som «Vis i tidsstripen»."
},
"youHaveSkipped": {
"message": "Du har hoppet over "
},
"minLower": {
"message": "minutt"
},
"minsLower": {
"message": "minutter"
},
"hourLower": {
"message": "time"
},
"hoursLower": {
"message": "timer"
},
"youHaveSavedTime": {
"message": "Du har spart folk for",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": "av sine liv",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "Sjekk status.sponsor.ajay.app for tjenerstatus."
},
"whatChangeUserID": {
"message": "Dette bør holdes privat. Det er som et passord og bør ikke deles med noen. Hvis noen har dette kan de utgi seg som deg. Hvis du leter etter din offentlige bruker-ID, klikker du på utklippstavlen i oppsprettsvinduet."
},
"createdBy": {
"message": "Opprettet av"
},
"supportOtherSites": {
"message": "Støtt tredjeparts YouTube-nettsteder"
},
"supportedSites": {
"message": "Støttede nettsteder: "
},
"optionsInfo": {
"message": "Skru på Invidious-støtte, skru av autohopp, skjul knapper, og mer."
},
"addInvidiousInstance": {
"message": "Legg til tredjeparts klientinstans"
},
"addInvidiousInstanceDescription": {
"message": "Legg til en egendefinert instans. Den må formatteres med KUN domenet. Eksempel: invidious.ajay.app"
},
"add": {
"message": "Legg til"
},
"addInvidiousInstanceError": {
"message": "Dette er et ugyldig domene. Dette skal BARE inkludere domenedelen. Eksempel: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Tilbakestill Invidious-instansliste"
},
"resetInvidiousInstanceAlert": {
"message": "Du er i ferd med å tilbakestille Invidious-instanslisten"
},
"currentInstances": {
"message": "Gjeldende instanser:"
},
"minDuration": {
"message": "Minimumsvarighet (i sekunder):"
},
"minDurationDescription": {
"message": "Segmenter som er kortere enn den valgte verdien, vil ikke bli hoppet over eller vises i avspilleren."
},
"skipNoticeDuration": {
"message": "Varighet for hopp over-varsel (sekunder):"
},
"skipNoticeDurationDescription": {
"message": "Hopp over-varselet vil bli værende på skjermen i minst så mange sekunder. For manuell hopping kan det være synlig lenger."
},
"shortCheck": {
"message": "Den følgende innsendingen er kortere enn din valgte minimumsvarighetsinnstilling. Dette kan bety at den allerede er sendt inn, og at den simpelthen blir ignorert på grunn av denne innstillingen. Er du sikker på at du vil sende den inn?"
},
"liveOrPremiere": {
"message": "Innsendelse på en aktiv direktesending eller premiere er ikke tillatt. Vennligst vent til den er ferdig, last så siden på nytt og kontroller at segmentene fortsatt er gyldige."
},
"showUploadButton": {
"message": "Vis opplastingsknapp"
},
"customServerAddress": {
"message": "SponsorBlock-tjeneradresse"
},
"customServerAddressDescription": {
"message": "Adressen som SponsorBlock bruker til å kalle på tjeneren.\nMed mindre du har din egen tjenerinstans, burde du ikke endre på det."
},
"save": {
"message": "Lagre"
},
"reset": {
"message": "Nullstill"
},
"customAddressError": {
"message": "Adressen har ikke riktig format. Sørg for at du har https:// eller http:// i starten, og at det ikke slutter med en skråstrek."
},
"areYouSureReset": {
"message": "Er du sikker på at du vil tilbakestille dette?"
},
"mobileUpdateInfo": {
"message": "m.youtube.com er nå støttet"
},
"exportOptions": {
"message": "Importer/Eksporter alle innstillinger"
},
"exportOptionsCopy": {
"message": "Rediger/kopiér"
},
"exportOptionsDownload": {
"message": "Lagre til fil"
},
"exportOptionsUpload": {
"message": "Last fra fil"
},
"setOptions": {
"message": "Angi innstillinger"
},
"exportOptionsWarning": {
"message": "Advarsel: Å endre på innstillingene er permanent og kan knekke installasjonen din. Er du sikker på at du vil gjøre dette? Sørg for å ta sikkerhetskopi av de gamle for sikkerhets skyld."
},
"incorrectlyFormattedOptions": {
"message": "Denne JSON-koden er ikke formattert riktig. Dine innstillinger har ikke blitt endret på."
},
"confirmNoticeTitle": {
"message": "Send inn segment"
},
"submit": {
"message": "Send"
},
"cancel": {
"message": "Avbryt"
},
"delete": {
"message": "Slett"
},
"preview": {
"message": "Forhåndsvisning"
},
"unsubmitted": {
"message": "Ikke innsendt"
},
"inspect": {
"message": "Inspiser"
},
"edit": {
"message": "Rediger "
},
"copyDebugInformation": {
"message": "Kopier avlusingsinformasjon til utklippstavlen"
},
"copyDebugInformationFailed": {
"message": "Klarte ikke å skrive til utklippstavlen"
},
"copyDebugInformationOptions": {
"message": "Kopierer informasjon til utklippstavlen som skal gis til en utvikler i feilrapporter eller når en utvikler ber om det. Sensitiv informasjon som bruker-ID-en din, hvitelistede kanaler, og tilpassede tjeneradresser har blitt fjernet. Men det inneholder informasjon som brukeragenten din, nettleseren, operativsystemet, og utvidelsesversjonsnummeret. "
},
"copyDebugInformationComplete": {
"message": "Avlusingsinformasjonen har blitt kopiert til utklippstavlen. Du er velkommen til å fjerne det av informasjon som du helst ikke vil dele. Lagre dette i en tekstfil, eller lim det inn i feilrapporten."
},
"keyAlreadyUsed": {
"message": "Denne hurtigtasten er knyttet til en annen handling. Vennligst velg en annen kombinasjon."
},
"to": {
"message": "til",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "Sponsor"
},
"category_sponsor_description": {
"message": "Betalt promotering, betalte henvisninger, og reklamer direkte til seerne. Ikke for selvpromotering eller gratis hyllester av saker/skapere/nettsteder/produkter som de liker."
},
"category_selfpromo": {
"message": "Ubetalt/Selvpromotering"
},
"category_selfpromo_description": {
"message": "Minner om «Sponsor», men er ubetalt eller selvpromotering. Dette inkluderer segmenter om merchandise, donasjoner, eller info om hvem de samarbeidet med."
},
"category_exclusive_access": {
"message": "Ekslusiv tilgang"
},
"category_exclusive_access_description": {
"message": "Kun for merking av hele videoer. Brukes når en video demonstrerer et produkt, tjeneste eller sted de har fått gratis eller subsidiert tilgang til."
},
"category_exclusive_access_pill": {
"message": "Denne videoen demonstrerer et produkt, tjeneste eller sted som de har fått gratis eller subsidiert tilgang til",
"description": "Short description for this category"
},
"category_interaction": {
"message": "Samhandlingspåminnelse (Abonner)"
},
"category_interaction_description": {
"message": "Når det er en kort påminnelse om å like, abonnere på eller følge dem midt i innholdet. Hvis det er langt eller handler om noe spesifikt, burde det føres opp som selvpromotering i stedet."
},
"category_interaction_short": {
"message": "Samhandlingspåminnelse"
},
"category_intro": {
"message": "Midtpause-/Introanimasjon"
},
"category_intro_description": {
"message": "En intervall uten noe faktisk innhold. Kan være en pause, statisk bilde, eller repetitiv animasjon. Dette burde ikke brukes til overgangsanimasjoner som inneholder informasjon."
},
"category_intro_short": {
"message": "Midtpause"
},
"category_outro": {
"message": "Rulletekster"
},
"category_outro_description": {
"message": "Rulletekster eller når YouTube-sluttkortene dukker opp. Ikke for avslutninger med informasjon."
},
"category_preview": {
"message": "Forhåndsvisning/Oppsummering"
},
"category_filler_short": {
"message": "Fyllstoff"
},
"category_music_offtopic": {
"message": "Musikk: Seksjon uten musikk"
},
"category_music_offtopic_description": {
"message": "Kun for bruk i musikkvideoer. Dette burde kun brukes for seksjoner i musikkvideoer som ikke allerede dekkes av en annen kategori."
},
"category_music_offtopic_short": {
"message": "Ikke-musikk"
},
"category_poi_highlight": {
"message": "Høydepunkt"
},
"category_poi_highlight_description": {
"message": "Den del av videoen som de fleste er interessert i. Tilsvarende kommentarer som \"Videoen begynner på x\"."
},
"category_livestream_messages": {
"message": "Direktesending: Donasjons-/Meldingshøytlesninger"
},
"category_livestream_messages_short": {
"message": "Høytlesning av meldinger"
},
"autoSkip": {
"message": "Hopp over automatisk"
},
"manualSkip": {
"message": "Manuelt hopp"
},
"showOverlay": {
"message": "Vis i tidsstripen"
},
"disable": {
"message": "Deaktiver"
},
"autoSkip_POI": {
"message": "Autohopp til starten"
},
"manualSkip_POI": {
"message": "Spør når videoen laster"
},
"showOverlay_POI": {
"message": "Vis i tidsstripen"
},
"showOverlay_full": {
"message": "Vis merke"
},
"autoSkipOnMusicVideos": {
"message": "Autohopp over alle segmenter når det er et segment uten musikk"
},
"muteSegments": {
"message": "Tillat segmenter som slår av lyden i stedet for å hoppe over"
},
"fullVideoSegments": {
"message": "Vis et ikon når en video utelukkende er reklame",
"description": "Referring to the category pill that is now shown on videos that are entirely sponsor or entirely selfpromo"
},
"previewColor": {
"message": "Ikke innsendt-farge",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "Tidsstripefarge"
},
"category": {
"message": "Kategori"
},
"skipOption": {
"message": "Hoppinnstilling",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "Skru på betatestingstjeneren"
},
"whatEnableTestingServer": {
"message": "Dine innsendinger og stemmer BLIR IKKE REGNET MED med tanke på hovedtjeneren. Kun bruk dette til testing."
},
"testingServerWarning": {
"message": "Alle innsendinger og stemmer BLIR IKKE REGNET MED med tanke på hovedtjeneren når du kobler til testtjeneren. Sørg for å skru dette av når du vil sende inn ekte innsendinger."
},
"bracketNow": {
"message": "(Nå)"
},
"moreCategories": {
"message": "Flere kategorier"
},
"chooseACategory": {
"message": "Velg en kategori"
},
"enableThisCategoryFirst": {
"message": "For å sende inn segmenter i «{0}»-kategorien, må du skru det på i innstillingene. Du vil nå bli omdirigert til innstillingene.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"poiOnlyOneSegment": {
"message": "Advarsel: Denne type segment kan ha maksimalt én aktiv om gangen. Å legge inn flere vil forårsake en tilfeldig framvisning."
},
"youMustSelectACategory": {
"message": "Du må velge en kategori for alle segmentene du sender inn!"
},
"bracketEnd": {
"message": "(Slutt)"
},
"hiddenDueToDownvote": {
"message": "skjult: stemt ned"
},
"hiddenDueToDuration": {
"message": "skjult: for kort"
},
"channelDataNotFound": {
"description": "This error appears in an alert when they try to whitelist a channel and the extension is unable to determine what channel they are looking at.",
"message": "Kanal-ID er ikke lastet enda. Hvis du bruker en innebygd video, prøv å bruke YouTube-hjemmesiden i stedet. Dette kan også forårsakes av endringer i YouTube-oppsett, hvis du mistenker det, kommenter her:"
},
"acceptPermission": {
"message": "Godta tillatelse"
},
"permissionRequestSuccess": {
"message": "Tillatelsesforespørselen lyktes!"
},
"permissionRequestFailed": {
"message": "Tillatelsesforespørselen mislyktes, klikket du på Avvis?"
},
"adblockerIssueWhitelist": {
"message": "Om du ikke er i stand til å løse dette, forsøk å deaktiver innstillingen 'Fremtving kanalsjekk før hopp', siden SponsorBlock ikke kan hente kanalinformasjon for denne videoen"
},
"forceChannelCheck": {
"message": "Fremtving kanalsjekk før hopp"
},
"whatForceChannelCheck": {
"message": "Som standard, vil den hoppe over segmenter umiddelbart før den engang vet hvilken kanal det er. Som standard vil noen segmenter i begynnelsen av videoen bli hoppet over på hvitelistede kanaler. Å skru på denne innstillingen vil forhindre dette, men også føre til at all hopping har en liten forsinkelse siden innhentingen av kanal-ID-en kan ta litt tid. Denne forsinkelsen vil kanskje ikke bli lagt merke til hvis du har raskt internett."
},
"forceChannelCheckPopup": {
"message": "Vurder å skru på «Fremtving kanalsjekk før hopp»"
},
"downvoteDescription": {
"message": "Feil tidtaking"
},
"incorrectCategory": {
"message": "Endre kategori"
},
"nonMusicCategoryOnMusic": {
"message": "Denne videoen er kategorisert som musikk. Er du sikker på at dette har en sponsor? Hvis det egentlig er et \"Ikke-musikk-segment\", åpne opp innstillingene til utvidelsen og skru på denne kategorien. Deretter kan du sende dette segmentet som \"Ikke-musikk\" i stedet for som sponsing. Vennligst les retningslinjene hvis du er forvirret."
},
"multipleSegments": {
"message": "Flere segmenter"
},
"guidelines": {
"message": "Retningslinjer"
},
"readTheGuidelines": {
"message": "Les retningslinjene!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "Kategorier er her!"
},
"categoryUpdate2": {
"message": "Åpne innstillingene for å hoppe over introer, outro-er, merchandise, osv."
},
"help": {
"message": "Hjelp"
},
"GotIt": {
"message": "Jeg forstår",
"description": "Used as the button to dismiss a tooltip"
},
"fullVideoTooltipWarning": {
"message": "Dette segmentet er stort. Dersom hele videoen er omtrent ett emne, så endre fra \"Hopp Over\" til \"Full Video\". Se retningslinjene for mer informasjon."
},
"categoryPillTitleText": {
"message": "Hele denne videoen er merket som denne kategorien og er for tett knyttet til å kunne separeres"
},
"experiementOptOut": {
"message": "Reservér deg mot alle fremtidige eksperimenter",
"description": "This is used in a popup about a new experiment to get a list of unlisted videos to back up since all unlisted videos uploaded before 2017 will be set to private."
},
"hideForever": {
"message": "Skjul for alltid"
},
"questionButton": {
"message": "SpørsmålsKnapp"
},
"Donate": {
"message": "Donér"
},
"hideDonationLink": {
"message": "Skjul donasjonslenke"
},
"darkModeOptionsPage": {
"message": "Mørk modus på instillingssiden"
},
"helpPageThanksForInstalling": {
"message": "Takk for at du installerte SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Vennligst se gjennom innstillingene nedenfor"
},
"helpPageFeatureDisclaimer": {
"message": "Mange funksjoner er deaktivert som standard. Om du vil hoppe over introer, outro-er, benytte Invidious osv., aktiver dem nedenfor. Du kan også vise eller skjule UI-elementer."
},
"helpPageHowSkippingWorks": {
"message": "Hvordan hopping fungerer"
},
"helpPageHowSkippingWorks1": {
"message": "Videosegmenter vil automatisk bli hoppet over hvis de finnes i databasen. Du kan åpne oppsprettsvinduet ved å klikke på utvidelsesikonet for å få en forhåndsvisning av hva de er."
},
"helpPageHowSkippingWorks2": {
"message": "Hver gang du hopper over et segment vil du få et varsel. Hvis tidtakingen ser feil ut stem ned ved å klikke på nedstemme! Du kan også stemme i oppsprettsvinduet."
},
"Submitting": {
"message": "Innsending"
},
"helpPageSubmitting1": {
"message": "Innsending kan enten gjøres i oppsprettsvinduet ved å klikke på \"Segmentet starter nå\"-knappen eller i videoavspilleren ved å klikke på knappene på avspilleren."
},
"helpPageSubmitting2": {
"message": "Klikk på avspillingsknappen angir starten av et segment og klikk på stopp-ikonet angir slutten. Du kan gjøre klar flere sponsorer før du sender inn. Klikk på opplastningsknappen for å sende inn. Klikk på papirkurven for å slette."
},
"Editing": {
"message": "Redigering"
},
"helpPageEditing1": {
"message": "Hvis du rotet det til kan du redigere eller slette segmentene dine etter at du har klikket på pil opp-knappen."
},
"helpPageTooSlow": {
"message": "Dette er for tidkrevende"
},
"helpPageTooSlow1": {
"message": "Om du vil kan du bruke hurtigtaster. Trykk på semikolon-tasten for å angi start/stopp av et sponsorsegment og klikk på apostrof for å sende inn. Disse kan endres i innstillinger. Om du ikke bruker QWERTY bør du sannsynligvis endre hurtigtastene."
},
"helpPageCopyOfDatabase": {
"message": "Kan jeg få en kopi av databasen? Hva hender hvis du forsvinner?"
},
"helpPageCopyOfDatabase1": {
"message": "Databasen er offentlig og tilgjengelig på"
},
"helpPageCopyOfDatabase2": {
"message": "Kildekoden er fritt tilgjengelig. Så selv om noe skulle skje med meg vil ikke dine bidrag gå tapt."
},
"helpPageNews": {
"message": "Nyheter og hvordan det er laget"
},
"helpPageSourceCode": {
"message": "Hvor kan jeg finne kildekoden?"
},
"Credits": {
"message": "Anerkjennelser"
},
"LearnMore": {
"message": "Les mer"
},
"CopyDownvoteButtonInfo": {
"message": "Stemmer ned og oppretter en lokal kopi som du kan sende inn på nytt"
},
"OpenCategoryWikiPage": {
"message": "Åpne denne kategoriens wiki-side."
},
"CopyAndDownvote": {
"message": "Kopiér og stem ned"
},
"ContinueVoting": {
"message": "Fortsett å stemme"
},
"ChangeCategoryTooltip": {
"message": "Dette vil umiddelbart gjelde for dine segmenter"
},
"hideSegment": {
"message": "Skjul segment"
},
"SponsorTimeEditScrollNewFeature": {
"message": "Bruk musehjulet mens du peker over redigeringsboksen for å raskt justere tiden. Kombinasjoner av ctrl- eller shift-tasten kan brukes til å finjustere endringene."
},
"categoryPillNewFeature": {
"message": "Nyhet! Se om en video er fullstendig sponset eller selvpromotert"
},
"dayAbbreviation": {
"message": "d",
"description": "100d"
},
"hourAbbreviation": {
"message": "t",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Oppførsel",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "Grensesnitt",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "Hurtigtaster",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "Sikkerhetskopiér/gjenskap",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Diverse",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"noticeVisibilityLabel": {
"message": "Hopp over-varselutseende",
"description": "Option label"
},
"unbind": {
"message": "Fjern",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Ikke angitt"
},
"change": {
"message": "Endre"
},
"youtubeKeybindWarning": {
"message": "Dette er en innebygget YouTube-hurtigtast. Er du sikker på at du vil bruke den?"
},
"betaServerWarning": {
"message": "BETA Server er aktivert!"
},
"openOptionsPage": {
"message": "Åpne innstillingsside"
},
"resetToDefault": {
"message": "Tilbakestill innstillinger til standard"
},
"confirmResetToDefault": {
"message": "Er du sikker på at du vil tilbakestille alle innstillingene til standardverdiene? Dette kan ikke angres."
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,557 +0,0 @@
{
"fullName": {
"message": "SponsorBlock para o YouTube - Salte patrocínios",
"description": "Name of the extension."
},
"Description": {
"message": "Salte patrocinios, pedidos de subscrição e mais em videos do YouTube. Submeta anúncios nos videos que visualiza para poupar tempo a outros.",
"description": "Description of the extension."
},
"400": {
"message": "O servidor disse que este pedido foi inválido"
},
"429": {
"message": "Enviou muitos segmentos para este vídeo, tem certeza que tem assim tantos?"
},
"409": {
"message": "Isso já foi enviado antes"
},
"channelWhitelisted": {
"message": "Canal adicionado à lista de autorizados!"
},
"Segment": {
"message": "segmento"
},
"Segments": {
"message": "segmentos"
},
"SegmentsCap": {
"message": "Segmentos"
},
"Chapters": {
"message": "Capítulos"
},
"renderAsChapters": {
"message": "Renderizar segmentos como capítulos",
"description": "Refers to drawing segments on the YouTube seek bar as split up chapters, similar to the existing chapter system"
},
"showSegmentNameInChapterBar": {
"message": "Mostrar segmento atual ao lado do tempo do vídeo"
},
"upvoteButtonInfo": {
"message": "Votar positivamente esta submissão"
},
"reportButtonTitle": {
"message": "Reportar"
},
"reportButtonInfo": {
"message": "Reportar esta submissão como incorrecta."
},
"Dismiss": {
"message": "Ignorar"
},
"Loading": {
"message": "A carregar..."
},
"Hide": {
"message": "Nunca mostrar"
},
"hitGoBack": {
"message": "Carregue em reverter salto para voltar a onde estava"
},
"unskip": {
"message": "Reverter salto"
},
"reskip": {
"message": "Saltar novamente"
},
"unmute": {
"message": "Ativar som"
},
"paused": {
"message": "Pausado"
},
"manualPaused": {
"message": "Temporizador parado"
},
"confirmMSG": {
"message": "\n\nPara editar ou remover linhas individuais, carregue com o botão direito ou abra o popup da extensão pelo icone no canto superior direito."
},
"clearThis": {
"message": "Tem certeza que deseja limpar isto?\n\n"
},
"Unknown": {
"message": "Erro ao enviar os seus segmentos, tente novamente mais tarde."
},
"sponsorFound": {
"message": "Este vídeo tem segmentos na base de dados!"
},
"sponsor404": {
"message": "Nenhum segmento encontrado"
},
"sponsorStart": {
"message": "O Segmento Começa Agora"
},
"sponsorEnd": {
"message": "O Segmento Acaba Agora"
},
"sponsorCancel": {
"message": "Cancelar Criação de Segmento"
},
"noVideoID": {
"message": "Nenhum vídeo do YouTube encontrado.\nSe isto não estiver correto, atualize o separador."
},
"refreshSegments": {
"message": "Atualizar segmentos"
},
"success": {
"message": "Sucesso!"
},
"voted": {
"message": "Votado!"
},
"serverDown": {
"message": "Parece que o servidor está em baixo. Contacte o desenvolvedor imediatamente."
},
"connectionError": {
"message": "Deu-se um erro de conecção: Código: "
},
"segmentsStillLoading": {
"message": "Segmentos ainda a carregar..."
},
"clearTimes": {
"message": "Limpar Segmentos"
},
"openPopup": {
"message": "Abrir o Popup SponsorBlock"
},
"closePopup": {
"message": "Fechar Popup"
},
"sortSegments": {
"message": "Ordenar Segmentos"
},
"submitCheck": {
"message": "Tem a certeza que pretende submeter?"
},
"whitelistChannel": {
"message": "Meter canal na Lista Branca"
},
"removeFromWhitelist": {
"message": "Remover canal da Lista Branca"
},
"voteOnTime": {
"message": "Votar em um segmento"
},
"Submissions": {
"message": "Submissões"
},
"savedPeopleFrom": {
"message": "Salvaste pessoas de "
},
"viewLeaderboard": {
"message": "Tabela de Classificação"
},
"recordTimesDescription": {
"message": "Enviar"
},
"submissionEditHint": {
"message": "A edição da seção aparecerá depois que você clicar em enviar",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "Dica: Você pode configurar atalhos de teclado para enviar nas opções"
},
"clearTimesButton": {
"message": "Limpar Intervalos"
},
"publicStats": {
"message": "Isto é usado na página pública de estatísticas que mostra o quanto já contríbuíu. Veje-a"
},
"Username": {
"message": "Nome de Utilizador"
},
"setUsername": {
"message": "Criar nome de utilizador"
},
"copyPublicID": {
"message": "Copiar ID público de utilizador"
},
"copySegmentID": {
"message": "Copiar ID do segmento"
},
"discordAdvert": {
"message": "Junte-se ao discord oficial para sugerir dicas e sugestões!"
},
"hideThis": {
"message": "Esconder isto"
},
"Options": {
"message": "Opções"
},
"showButtons": {
"message": "Mostrar botões no player do Youtube"
},
"hideButtons": {
"message": "Esconder botões no player do Youtube"
},
"hideButtonsDescription": {
"message": "Isto esconde os botões que aparecem no player do Youtube para submeter patrocínios. Entendemos que possa ser\n incómodo a algumas pessoas. Em vez de usar esses botões pode usar os do popup. Para esconder a mensagem que aparece, \n ususe o botão na mesma que diz \"Don't show this again\". Pode sempre reactivar estas definições novamente."
},
"showSkipButton": {
"message": "Mantenha o Botão Saltar para Destaque 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"
},
"autoHideInfoButton": {
"message": "Ocultar automaticamente o Botão de Informação"
},
"hideDeleteButton": {
"message": "Esconder botão de Apagar no player do Youtube"
},
"showDeleteButton": {
"message": "Mostrar botão de Apagar no player do Youtube"
},
"enableViewTracking": {
"message": "Ativar Rastreamento de Contagem de Saltos"
},
"whatViewTracking": {
"message": "Esse recurso rastreia quais segmentos você pulou para permitir que os usuários saibam o quanto seu envio ajudou outras pessoas e é usado como métrica junto com votos positivos para garantir que o spam não entre no banco de dados. A extensão envia uma mensagem ao servidor cada vez que você pular um segmento. Espero que a maioria das pessoas não altere essa configuração para que os números de visualização sejam precisos. :)"
},
"enableViewTrackingInPrivate": {
"message": "Ativar o Rastreamento de Contagem de Saltos nas Guias Privadas/Anônimas"
},
"enableTrackDownvotes": {
"message": "Guardar segmentos de votos negativos"
},
"whatTrackDownvotes": {
"message": "Quaisquer segmentos que você votar negativo permanecerão ocultos mesmo após a atualização"
},
"trackDownvotesWarning": {
"message": "Aviso: Ao desabilitar isso excluirá todos os votos negativos armazenados anteriormente"
},
"enableQueryByHashPrefix": {
"message": "Consulta por Prefixo de Hash"
},
"whatQueryByHashPrefix": {
"message": "Em vez de solicitar segmentos do servidor usando o ID do Vídeo, são enviados os primeiros 4 caracteres do hash do ID do Vídeo. Este servidor enviará de volta dados para todos os vídeos com hashes semelhantes."
},
"enableRefetchWhenNotFound": {
"message": "Recuperar segmentos em novos vídeos"
},
"whatRefetchWhenNotFound": {
"message": "Se o vídeo for novo e nenhum segmento for encontrado, continuaremos a monitorizar enquanto assiste."
},
"whatShowCategoryWithoutPermission": {
"message": "Algumas categorias requerem permissão para submeter devido aos requisitos mínimos de reputação"
},
"showNotice": {
"message": "Mostrar notificação outra vez"
},
"showSkipNotice": {
"message": "Mostrar aviso após um segmento ser ignorado"
},
"showCategoryGuidelines": {
"message": "Mostrar Categoria de Ajuda"
},
"noticeVisibilityMode0": {
"message": "Avisos de ignorar em tamanho inteiro"
},
"noticeVisibilityMode1": {
"message": "Avisos pequenos quando ignorado automaticamente"
},
"noticeVisibilityMode2": {
"message": "Todos os avisos de ignorar em tamanho pequeno"
},
"website": {
"message": "Site",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "Código-fonte",
"description": "Used on Firefox Store Page"
},
"setStartSponsorShortcut": {
"message": "Iniciar/parar segmento",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "Enviar segmentos",
"description": "Keybind label"
},
"nextChapterKeybind": {
"message": "Próximo capítulo",
"description": "Keybind label"
},
"previousChapterKeybind": {
"message": "Capítulo anterior",
"description": "Keybind label"
},
"502": {
"message": "O servidor parece estar sobrecarregado. Tente novamente em alguns segundos."
},
"errorCode": {
"message": "Código de erro: "
},
"skip": {
"message": "Saltar"
},
"mute": {
"message": "Silenciar"
},
"full": {
"message": "Vídeo completo",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "Saltar {0}?"
},
"mute_category": {
"message": "Silenciar {0}?"
},
"skip_to_category": {
"message": "Avançar para {0}?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} ignorado",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} silenciado",
"description": "Example: Sponsor Muted"
},
"minLower": {
"message": "minuto"
},
"minsLower": {
"message": "minutos"
},
"hourLower": {
"message": "hora"
},
"hoursLower": {
"message": "horas"
},
"youHaveSavedTime": {
"message": "Poupou pessoas de",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " das suas vidas",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"setUserID": {
"message": "Definir UserID Privado"
},
"createdBy": {
"message": "Criado por"
},
"supportOtherSitesDescription": {
"message": "Apoie clientes de terceiros do YouTube. Para ativar o suporte, deve aceitar as permissões adicionais.",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
},
"supportedSites": {
"message": "Sites suportados: "
},
"addInvidiousInstanceDescription": {
"message": "Adicione uma instância personalizada. Isso deve ser formatado APENAS com o domínio. Exemplo: invidious.ajay.app"
},
"addInvidiousInstanceError": {
"message": "Este é um domínio inválido. Isto deve APENAS incluir a parte do domínio. Exemplo: invidious.ajay.app"
},
"areYouSureReset": {
"message": "Tem certeza que deseja redefinir?"
},
"mobileUpdateInfo": {
"message": "m.youtube.com é agora suportado"
},
"exportOptions": {
"message": "Importar/Exportar todas as opções"
},
"exportOptionsCopy": {
"message": "Editar/copiar"
},
"exportOptionsDownload": {
"message": "Guardar num ficheiro"
},
"exportOptionsUpload": {
"message": "Carregar a partir de ficheiro"
},
"setOptions": {
"message": "Definir opções"
},
"submit": {
"message": "Enviar"
},
"cancel": {
"message": "Cancelar"
},
"delete": {
"message": "Eliminar"
},
"preview": {
"message": "Pré-visualizar"
},
"inspect": {
"message": "Inspecionar"
},
"edit": {
"message": "Editar"
},
"copyDebugInformation": {
"message": "Copiar informações de depuração para a área de transferência"
},
"copyDebugInformationFailed": {
"message": "Falha ao copiar para a área de transferência"
},
"to": {
"message": "até",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"generic_guideline2": {
"message": "Reproduz como se nada tivesse sido ignorado"
},
"category_sponsor": {
"message": "Patrocinador"
},
"category_exclusive_access": {
"message": "Acesso exclusivo"
},
"category_interaction_short": {
"message": "Lembrete de interação"
},
"category_livestream_messages_short": {
"message": "Leitura de mensagens"
},
"autoSkip": {
"message": "Saltar automaticamente"
},
"manualSkip": {
"message": "Saltar manualmente"
},
"disable": {
"message": "Desativar"
},
"category": {
"message": "Categoria"
},
"bracketNow": {
"message": "(agora)"
},
"moreCategories": {
"message": "Mais categorias"
},
"chooseACategory": {
"message": "Escolher uma categoria"
},
"bracketEnd": {
"message": "(fim)"
},
"manuallyHidden": {
"message": "ocultado manualmente"
},
"incorrectCategory": {
"message": "Alterar categoria"
},
"guidelines": {
"message": "Orientações"
},
"readTheGuidelines": {
"message": "Leia as nossas orientações!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"darkModeOptionsPage": {
"message": "Modo escuro na página de opções"
},
"helpPageThanksForInstalling": {
"message": "Obrigado por instalar o SponsorBlock."
},
"helpPageReviewOptions": {
"message": "Por favor, reveja as opções abaixo"
},
"helpPageHowSkippingWorks": {
"message": "Como a função saltar funciona"
},
"Submitting": {
"message": "A enviar"
},
"Editing": {
"message": "A editar"
},
"helpPageTooSlow": {
"message": "Está demasiado lento"
},
"Credits": {
"message": "Créditos"
},
"LearnMore": {
"message": "Saber mais"
},
"FullDetails": {
"message": "Todos os detalhes"
},
"CopyAndDownvote": {
"message": "Copiar e dar voto negativo"
},
"ContinueVoting": {
"message": "Continuar a votar"
},
"downvote": {
"message": "Voto negativo"
},
"upvote": {
"message": "Voto positivo"
},
"hideSegment": {
"message": "Ocultar segmento"
},
"dayAbbreviation": {
"message": "d",
"description": "100d"
},
"hourAbbreviation": {
"message": "h",
"description": "100h"
},
"optionsTabBehavior": {
"message": "Comportamento",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "Interface",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "Atalhos de teclado",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "Cópia de seg./restauro",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "Diversos",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"unbind": {
"message": "Desvincular",
"description": "Unbind keyboard shortcut"
},
"notSet": {
"message": "Não definido"
},
"change": {
"message": "Alterar"
},
"betaServerWarning": {
"message": "O servidor BETA está ativado!"
},
"openOptionsPage": {
"message": "Abrir página de opções"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,30 +0,0 @@
{
"Options": {
"message": "Подешавања"
},
"sourceCode": {
"message": "Изворни код",
"description": "Used on Firefox Store Page"
},
"errorCode": {
"message": "Код грешке: "
},
"skip": {
"message": "Прескочи"
},
"add": {
"message": "Додај"
},
"save": {
"message": "Сачувај"
},
"cancel": {
"message": "Откажи"
},
"edit": {
"message": "Измени"
},
"help": {
"message": "Помоћ"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
{}

View File

@@ -1,766 +0,0 @@
{
"fullName": {
"message": "YouTube க்கான SponsorBlock - ஸ்பான்சர்ஷிப்களைத் தவிர்",
"description": "Name of the extension."
},
"Description": {
"message": "YouTube வீடியோக்களில் ஸ்பான்சர்ஷிப்கள், சந்தா பிச்சை மற்றும் பலவற்றைத் தவிர்க்கவும். மற்றவர்களின் நேரத்தைச் சேமிக்க நீங்கள் பார்க்கும் வீடியோக்களில் ஸ்பான்சர்களைப் புகாரளிக்கவும்.",
"description": "Description of the extension."
},
"400": {
"message": "இந்த கோரிக்கை தவறானது என்று சர்வர் கூறினார்"
},
"429": {
"message": "இந்த ஒரு வீடியோவிற்கு நீங்கள் பல ஸ்பான்சர் நேரங்களை சமர்ப்பித்துள்ளீர்கள், இது பல உள்ளன என்று நீங்கள் உறுதியாக நம்புகிறீர்களா?"
},
"409": {
"message": "இது ஏற்கனவே சமர்ப்பிக்கப்பட்டுள்ளது"
},
"channelWhitelisted": {
"message": "சேனல் அனுமதிப்பட்டியல்!"
},
"Segment": {
"message": "பிரிவு"
},
"Segments": {
"message": "பிரிவுகள்"
},
"upvoteButtonInfo": {
"message": "இந்த சமர்ப்பிப்பை மேம்படுத்துங்கள்"
},
"reportButtonTitle": {
"message": "அறிக்கை"
},
"reportButtonInfo": {
"message": "இந்த சமர்ப்பிப்பு தவறானது என புகாரளிக்கவும்."
},
"Dismiss": {
"message": "நீக்கு"
},
"Loading": {
"message": "ஏற்றுகிறது..."
},
"Hide": {
"message": "ஒருபோதும் அனுமதிக்காதே"
},
"hitGoBack": {
"message": "நீங்கள் எங்கிருந்து வந்தீர்கள் என்பதைத் தட்டவும்."
},
"unskip": {
"message": "அன்ஸ்கிப்"
},
"reskip": {
"message": "ரெஸ்கிப்"
},
"unmute": {
"message": "ஒலியடக்கு"
},
"paused": {
"message": "இடைநிறுத்தப்பட்டது"
},
"manualPaused": {
"message": "டைமர் நிறுத்தப்பட்டது"
},
"confirmMSG": {
"message": "தனிப்பட்ட மதிப்புகளைத் திருத்த அல்லது நீக்க, தகவல் பொத்தானைக் கிளிக் செய்யவும் அல்லது மேல் வலது மூலையில் உள்ள நீட்டிப்பு ஐகானைக் கிளிக் செய்வதன் மூலம் நீட்டிப்பு பாப்அப்பைத் திறக்கவும்."
},
"clearThis": {
"message": "இதை அழிக்க விரும்புகிறீர்களா?\n\n"
},
"Unknown": {
"message": "உங்கள் ஸ்பான்சர் நேரங்களைச் சமர்ப்பிப்பதில் பிழை ஏற்பட்டது, தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும்."
},
"sponsorFound": {
"message": "இந்த வீடியோவில் தரவுத்தளத்தில் பகுதிகள் உள்ளன!"
},
"sponsor404": {
"message": "எந்தப் பகுதியும் கிடைக்கவில்லை"
},
"sponsorStart": {
"message": "பிரிவு இப்போது தொடங்குகிறது"
},
"sponsorEnd": {
"message": "பிரிவு இப்போது முடிகிறது"
},
"sponsorCancel": {
"message": "உருவாக்கும் பகுதியை ரத்து செய்"
},
"noVideoID": {
"message": "YouTube வீடியோ எதுவும் கிடைக்கவில்லை.\nஇது தவறாக இருந்தால், தாவலைப் புதுப்பிக்கவும்."
},
"refreshSegments": {
"message": "பிரிவுகளைப் புதுப்பிக்கவும்"
},
"success": {
"message": "வெற்றி!"
},
"voted": {
"message": "வாக்களித்தார்!"
},
"serverDown": {
"message": "சேவையகம் செயலிழந்துவிட்டதாகத் தெரிகிறது. டெவலப்பரை உடனடியாக தொடர்பு கொள்ளவும்."
},
"connectionError": {
"message": "இணைப்பு பிழை ஏற்பட்டது. பிழை குறியீடு: "
},
"clearTimes": {
"message": "பிரிவுகளை அழிக்கவும்"
},
"openPopup": {
"message": "ஸ்பான்சர் பிளாக் பாப்அப்பைத் திறக்கவும்"
},
"closePopup": {
"message": "பாப்அப்பை மூடு"
},
"submitCheck": {
"message": "இதை நிச்சயமாக சமர்ப்பிக்க விரும்புகிறீர்களா?"
},
"whitelistChannel": {
"message": "அனுமதிப்பட்டியல் சேனல்"
},
"removeFromWhitelist": {
"message": "அனுமதிப்பட்டியலில் இருந்து சேனலை அகற்று"
},
"voteOnTime": {
"message": "ஒரு பிரிவில் வாக்களியுங்கள்"
},
"Submissions": {
"message": "சமர்ப்பிப்புகள்"
},
"savedPeopleFrom": {
"message": "நீங்கள் மக்களை காப்பாற்றியுள்ளீர்கள் "
},
"viewLeaderboard": {
"message": "லீடர்போர்டு"
},
"recordTimesDescription": {
"message": "சமர்ப்பிக்கவும்"
},
"submissionEditHint": {
"message": "நீங்கள் சமர்ப்பி என்பதைக் கிளிக் செய்த பிறகு பிரிவு எடிட்டிங் தோன்றும்",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "குறிப்பு: விருப்பங்களில் சமர்ப்பிக்க விசைப்பலகைகளை அமைக்கலாம்"
},
"clearTimesButton": {
"message": "நேரங்களை அழி"
},
"publicStats": {
"message": "நீங்கள் எவ்வளவு பங்களித்தீர்கள் என்பதைக் காட்ட இது பொது புள்ளிவிவரங்கள் பக்கத்தில் பயன்படுத்தப்படுகிறது. அதை பார்"
},
"Username": {
"message": "பயனர்பெயர்"
},
"setUsername": {
"message": "பயனர்பெயரை அமைக்கவும்"
},
"copyPublicID": {
"message": "பொது பயனர் IDயை நகலெடுக்கவும்"
},
"copySegmentID": {
"message": "துண்டத்தின் IDஐ நகலெடு"
},
"discordAdvert": {
"message": "பரிந்துரைகள் மற்றும் கருத்துக்களை வழங்க அதிகாரப்பூர்வ டிஸ்கார்ட் சேவையகத்தில் சேர வாருங்கள்!"
},
"hideThis": {
"message": "இதை மறை"
},
"Options": {
"message": "விருப்பங்கள்"
},
"showButtons": {
"message": "YouTube பிளேயரில் பொத்தான்களைக் காட்டு"
},
"hideButtons": {
"message": "YouTube பிளேயரில் பொத்தான்களை மறைக்கவும்"
},
"hideButtonsDescription": {
"message": "ஸ்கிப் பிரிவுகளைச் சமர்ப்பிக்க YouTube பிளேயரில் தோன்றும் பொத்தான்களை இது மறைக்கிறது."
},
"showSkipButton": {
"message": "பிளேயரில் Skip To Highlight பொத்தானை வைக்கவும்"
},
"showInfoButton": {
"message": "YouTube பிளேயரில் தகவல் பொத்தானைக் காட்டு"
},
"hideInfoButton": {
"message": "YouTube பிளேயரில் தகவல் பொத்தானை மறைக்கவும்"
},
"autoHideInfoButton": {
"message": "தகவல் பொத்தானை தானாக மறைக்கவும்"
},
"hideDeleteButton": {
"message": "YouTube பிளேயரில் நீக்கு பொத்தானை மறைக்க"
},
"showDeleteButton": {
"message": "YouTube பிளேயரில் நீக்கு பொத்தானைக் காட்டு"
},
"enableViewTracking": {
"message": "ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கு"
},
"whatViewTracking": {
"message": "இந்த அம்சம் பயனர்கள் தங்கள் சமர்ப்பிப்பு மற்றவர்களுக்கு எவ்வளவு உதவியது மற்றும் ஸ்பேம் தரவுத்தளத்தில் வரவில்லை என்பதை உறுதிப்படுத்த அப்வோட்களுடன் ஒரு மெட்ரிக்காகப் பயன்படுத்தப்படுவதை பயனர்களுக்குத் தெரியப்படுத்த நீங்கள் எந்த பகுதிகளைத் தவிர்த்துவிட்டீர்கள் என்பதைக் கண்காணிக்கிறது. ஒவ்வொரு முறையும் நீங்கள் ஒரு பகுதியைத் தவிர்க்கும்போது நீட்டிப்பு சேவையகத்திற்கு ஒரு செய்தியை அனுப்புகிறது. பார்வை எண்கள் துல்லியமாக இருக்க பெரும்பாலான மக்கள் இந்த அமைப்பை மாற்ற மாட்டார்கள் என்று நம்புகிறோம். :)"
},
"enableViewTrackingInPrivate": {
"message": "தனிப்பட்ட/மறைநிலை தாவல்களில் ஸ்கிப் கவுண்ட் டிராக்கிங்கை இயக்கவும்"
},
"enableTrackDownvotes": {
"message": "துண்டத்தின் வாக்கிறக்கங்களைச் சேமி"
},
"whatTrackDownvotes": {
"message": "புதுப்பித்தப் பின் நீங்கள் வாக்கிறக்கிய துண்டங்கள் மறைந்தே இருக்கும்"
},
"trackDownvotesWarning": {
"message": "எச்சரிக்கை: இதை முடக்குதல் முன்னர் சேமித்த எல்லா வாக்கிறக்கங்களையும் அழிக்கும்"
},
"enableQueryByHashPrefix": {
"message": "ஹாஷ் முன்னொட்டு மூலம் வினவல்"
},
"whatQueryByHashPrefix": {
"message": "வீடியோஐடியைப் பயன்படுத்தி சேவையகத்திலிருந்து பிரிவுகளைக் கோருவதற்கு பதிலாக, வீடியோஐடியின் ஹாஷின் முதல் 4 எழுத்துக்கள் அனுப்பப்படுகின்றன. இந்த சேவையகம் எல்லா வீடியோக்களுக்கும் ஒத்த ஹாஷ்கள் கொண்ட தரவை திருப்பி அனுப்பும்."
},
"enableRefetchWhenNotFound": {
"message": "புதிய வீடியோக்களில் பிரிவுகளை மீண்டும் பெறுக"
},
"whatRefetchWhenNotFound": {
"message": "வீடியோ புதியது மற்றும் எந்தப் பகுதியும் காணப்படவில்லை என்றால், நீங்கள் பார்க்கும் போது ஒவ்வொரு சில நிமிடங்களுக்கும் இது மீண்டும் புதுப்பிக்கப்படும்."
},
"showNotice": {
"message": "அறிவிப்பை மீண்டும் காட்டு"
},
"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."
},
"website": {
"message": "இணையதளம்",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "மூல குறியீடு",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "அறிவிப்பு மேம்படுத்தப்பட்டது!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "உங்களுக்கு இன்னும் பிடிக்கவில்லை என்றால், ஒருபோதும் காண்பி பொத்தானை அழுத்தவும்.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"setSkipShortcut": {
"message": "துண்டத்தைக் கெந்து",
"description": "Keybind label"
},
"setStartSponsorShortcut": {
"message": "துண்டத்தை ஆரம்பி/நிறுத்து",
"description": "Keybind label"
},
"setSubmitKeybind": {
"message": "துண்டங்களைச் சமர்ப்பி",
"description": "Keybind label"
},
"0": {
"message": "இணைப்பு நேரம் முடிந்தது. உங்கள் இணைய இணைப்பைச் சரிபார்க்கவும். உங்கள் இணையம் இயங்கினால், சேவையகம் அதிக சுமை அல்லது கீழே இருக்கும்."
},
"disableSkipping": {
"message": "ஸ்கிப்பிங் இயக்கப்பட்டது"
},
"enableSkipping": {
"message": "ஸ்கிப்பிங் முடக்கப்பட்டுள்ளது"
},
"yourWork": {
"message": "உங்கள் வேலை",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "சேவையகம் அதிக சுமை கொண்டதாக தெரிகிறது. சில நொடிகளில் மீண்டும் முயற்சிக்கவும்."
},
"errorCode": {
"message": "பிழை குறியீடு: "
},
"skip": {
"message": "தவிர்"
},
"mute": {
"message": "ஒலியடக்கு"
},
"full": {
"message": "முழு காணொளி",
"description": "Used for the name of the option to label an entire video as sponsor or self promotion."
},
"skip_category": {
"message": "{0} ஐ தவிர்?"
},
"mute_category": {
"message": "{0} ஐ ஒலியடக்கவா?"
},
"skip_to_category": {
"message": "{0} க்குச் செல்லவா?",
"description": "Used for skipping to things (Skip to Highlight)"
},
"skipped": {
"message": "{0} தவிர்க்கப்பட்டது",
"description": "Example: Sponsor Skipped"
},
"muted": {
"message": "{0} ஒலியடக்கப்பட்டது",
"description": "Example: Sponsor Muted"
},
"skipped_to_category": {
"message": "{0} தவிர்க்கப்பட்டது",
"description": "Used for skipping to things (Skipped to Highlight)"
},
"disableAutoSkip": {
"message": "ஆட்டோ ஸ்கிப்பை முடக்கு"
},
"enableAutoSkip": {
"message": "ஆட்டோ ஸ்கிப்பை இயக்கு"
},
"audioNotification": {
"message": "தவிர்க்க ஆடியோ அறிவிப்பு"
},
"audioNotificationDescription": {
"message": "ஒரு பகுதியைத் தவிர்க்கும்போதெல்லாம் ஸ்கிப்பில் ஆடியோ அறிவிப்பு ஒலிக்கும். முடக்கப்பட்டிருந்தால் (அல்லது தானாகத் தவிர் முடக்கப்பட்டுள்ளது), ஒலி எதுவும் இயக்கப்படாது."
},
"showTimeWithSkips": {
"message": "அகற்றப்பட்ட ஸ்கிப்களுடன் நேரத்தைக் காட்டு"
},
"showTimeWithSkipsDescription": {
"message": "இந்த நேரம் தற்போதைய நேரத்திற்கு அடுத்த அடைப்புக்குறிக்குள் தோன்றும். இது எந்தவொரு வீடியோவிற்கும் கழித்த மொத்த வீடியோ கால அளவைக் காட்டுகிறது. இதில் \"சீக்பாரில் காண்பி\" என்று மட்டுமே குறிக்கப்பட்ட பகுதிகள் அடங்கும்."
},
"youHaveSkipped": {
"message": "நீங்கள் தவிர்த்துவிட்டீர்கள் "
},
"minLower": {
"message": "நிமிடம்"
},
"minsLower": {
"message": "நிமிடங்கள்"
},
"hourLower": {
"message": "மணி"
},
"hoursLower": {
"message": "மணி"
},
"youHaveSavedTime": {
"message": "நீங்கள் மக்களைக் காப்பாற்றியுள்ளீர்கள்",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " அவர்களின் வாழ்க்கையில்",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "சேவையக நிலைக்கு status.sponsor.ajay.app ஐச் சரிபார்க்கவும்."
},
"whatChangeUserID": {
"message": "இதை தனிப்பட்டதாக வைத்திருக்க வேண்டும். இது கடவுச்சொல் போன்றது, அதை யாருடனும் பகிரக்கூடாது. யாரிடமாவது இது இருந்தால், அவர் உங்களைப் போல் ஆள்மாறாட்டம் செய்யலாம். உங்கள் பொது பயனர் IDயை நீங்கள் தேடுகிறீர்களானால், பாப்அப்பில் உள்ள கிளிப்போர்டு ஐகானைக் கிளிக் செய்யவும்."
},
"createdBy": {
"message": "உருவாக்கியது"
},
"supportOtherSites": {
"message": "3 வது தரப்பு YouTube-தளங்களை ஆதரிக்கவும்"
},
"supportedSites": {
"message": "ஆதரிக்கப்படும் தளங்கள்: "
},
"optionsInfo": {
"message": "ஆக்கிரமிப்பு ஆதரவை இயக்கு, ஆட்டோஸ்கிப்பை முடக்கு, பொத்தான்களை மறை மற்றும் பலவற்றை."
},
"addInvidiousInstance": {
"message": "3 வது தரப்பு தளங்களை சேர்க்கவும்"
},
"addInvidiousInstanceDescription": {
"message": "தனிப்பட்ட தளங்களை சேர்க்கவும். இது Domain வடிவமைப்பில் இருக்க வேண்டும். உதாரணம்: invidious.ajay.app"
},
"add": {
"message": "சேர்"
},
"addInvidiousInstanceError": {
"message": "இது தவறான களமாகும். இது டொமைன் பகுதியை மட்டுமே கொண்டிருக்க வேண்டும். எடுத்துக்காட்டு: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "Invidous நிகழ்வு பட்டியலை மீட்டமைக்கவும்"
},
"resetInvidiousInstanceAlert": {
"message": "Invidous நிகழ்வு பட்டியலை மீட்டமைக்கவும்"
},
"currentInstances": {
"message": "தற்போதைய நிகழ்வுகள்:"
},
"minDuration": {
"message": "குறைந்தபட்ச காலம் (விநாடிகள்):"
},
"minDurationDescription": {
"message": "தொகுப்பு மதிப்பை விடக் குறைவான பகுதிகள் தவிர்க்கப்படாது அல்லது பிளேயரில் காண்பிக்கப்படாது."
},
"skipNoticeDuration": {
"message": "அறிவிப்பு காலத்தை தவிர்க்கவும் (வினாடிகள்):"
},
"skipNoticeDurationDescription": {
"message": "தவிர்க்கும் அறிவிப்பு குறைந்தபட்சம் இவ்வளவு நேரம் திரையில் இருக்கும். மேனுவல் ஸ்கிப்பிங்கிற்கு, இது நீண்ட நேரம் தெரியும்."
},
"shortCheck": {
"message": "பின்வரும் சமர்ப்பிப்பு உங்கள் குறைந்தபட்ச கால விருப்பத்தை விட குறைவாக உள்ளது. இது ஏற்கனவே சமர்ப்பிக்கப்பட்டுள்ளது என்பதையும், இந்த விருப்பத்தின் காரணமாக புறக்கணிக்கப்படுவதையும் இது குறிக்கலாம். நீங்கள் சமர்ப்பிக்க விரும்புகிறீர்களா?"
},
"showUploadButton": {
"message": "பதிவேற்ற பொத்தானைக் காட்டு"
},
"customServerAddress": {
"message": "ஸ்பான்சர் பிளாக் சேவையக முகவரி"
},
"customServerAddressDescription": {
"message": "சேவையகத்திற்கு அழைப்புகளைச் செய்ய ஸ்பான்சர் பிளாக் பயன்படுத்தும் முகவரி.\nஉங்களிடம் உங்கள் சொந்த சேவையக நிகழ்வு இல்லையென்றால், இதை மாற்றக்கூடாது."
},
"save": {
"message": "சேமி"
},
"reset": {
"message": "மீட்டமை"
},
"customAddressError": {
"message": "இந்த முகவரி சரியான வடிவத்தில் இல்லை. உங்களிடம் ஆரம்பத்தில் http: // அல்லது https: // இருப்பதை உறுதிசெய்து கொள்ளுங்கள்."
},
"areYouSureReset": {
"message": "இதை மீட்டமைக்க விரும்புகிறீர்களா?"
},
"mobileUpdateInfo": {
"message": "m.youtube.com இப்போது துணைபுரிகிறது"
},
"exportOptions": {
"message": "அனைத்து விருப்பங்களையும் இறக்குமதி / ஏற்றுமதி"
},
"exportOptionsCopy": {
"message": "திருத்து/நகலெடு"
},
"exportOptionsDownload": {
"message": "கோப்பிற்கு சேமி"
},
"exportOptionsUpload": {
"message": "கோப்பிலிருந்து ஏற்று"
},
"setOptions": {
"message": "விருப்பங்களை அமைக்கவும்"
},
"exportOptionsWarning": {
"message": "எச்சரிக்கை: விருப்பங்களை மாற்றுவது நிரந்தரமானது மற்றும் உங்கள் நிறுவலை உடைக்கலாம். இதை நிச்சயமாக செய்ய விரும்புகிறீர்களா? உங்கள் பழையதை காப்புப்பிரதி எடுக்க உறுதிசெய்க."
},
"incorrectlyFormattedOptions": {
"message": "இந்த JSON சரியாக வடிவமைக்கப்படவில்லை. உங்கள் விருப்பங்கள் மாற்றப்படவில்லை."
},
"confirmNoticeTitle": {
"message": "பகுதியை சமர்ப்பிக்கவும்"
},
"submit": {
"message": "சமர்ப்பிக்கவும்"
},
"cancel": {
"message": "ரத்துசெய்"
},
"delete": {
"message": "அழி"
},
"preview": {
"message": "முன்னோட்ட"
},
"unsubmitted": {
"message": "சமர்ப்பிக்கப்படவில்லை"
},
"inspect": {
"message": "ஆய்வு செய்யுங்கள்"
},
"edit": {
"message": "தொகு"
},
"copyDebugInformation": {
"message": "பிழைத்திருத்த தகவலை கிளிப்போர்டுக்கு நகலெடுக்கவும்"
},
"copyDebugInformationFailed": {
"message": "கிளிப்போர்டுக்கு எழுத முடியவில்லை"
},
"copyDebugInformationOptions": {
"message": "ஒரு பிழையை எழுப்பும்போது / ஒரு டெவலப்பர் கோருகையில் ஒரு டெவலப்பருக்கு வழங்க வேண்டிய தகவலை கிளிப்போர்டுக்கு நகலெடுக்கிறது. உங்கள் பயனர் ஐடி, அனுமதிப்பட்டியல் சேனல்கள் மற்றும் தனிப்பயன் சேவையக முகவரி போன்ற உணர்திறன் தகவல்கள் அகற்றப்பட்டுள்ளன. இருப்பினும் இது உங்கள் பயனர், உலாவி, இயக்க முறைமை மற்றும் நீட்டிப்பு பதிப்பு எண் போன்ற தகவல்களைக் கொண்டுள்ளது. "
},
"copyDebugInformationComplete": {
"message": "பிழைத்திருத்த தகவல்கள் கிளிப் போர்டில் நகலெடுக்கப்பட்டுள்ளன. நீங்கள் பகிர விரும்பாத எந்த தகவலையும் அகற்ற தயங்க. இதை உரை கோப்பில் சேமிக்கவும் அல்லது பிழை அறிக்கையில் ஒட்டவும்."
},
"to": {
"message": "க்கு",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "ஸ்பான்சர்"
},
"category_sponsor_description": {
"message": "கட்டண பதவி உயர்வு, கட்டண பரிந்துரைகள் மற்றும் நேரடி விளம்பரங்கள். சுய விளம்பரத்திற்காகவோ அல்லது அவர்கள் விரும்பும் காரணங்கள் / படைப்பாளிகள் / வலைத்தளங்கள் / தயாரிப்புகளுக்கு இலவசக் கூச்சலுக்காகவோ அல்ல."
},
"category_selfpromo": {
"message": "செலுத்தப்படாத / சுய ஊக்குவிப்பு"
},
"category_selfpromo_description": {
"message": "செலுத்தப்படாத அல்லது சுய விளம்பரத்தைத் தவிர \"ஸ்பான்சர்\" போன்றது. பொருட்கள், நன்கொடைகள் அல்லது அவர்கள் யாருடன் ஒத்துழைத்தார்கள் என்பது பற்றிய தகவல்கள் இதில் அடங்கும்."
},
"category_exclusive_access": {
"message": "பிரத்யேக அணுகல்"
},
"category_interaction": {
"message": "தொடர்பு நினைவூட்டல் (குழுசேர்)"
},
"category_interaction_description": {
"message": "உள்ளடக்கத்தின் நடுவில் அவற்றைப் பிடிக்க, குழுசேர அல்லது பின்பற்ற ஒரு குறுகிய நினைவூட்டல் இருக்கும்போது. இது நீண்டதாகவோ அல்லது குறிப்பிட்ட ஒன்றைப் பற்றியோ இருந்தால், அதற்கு பதிலாக அது சுய விளம்பரத்தின் கீழ் இருக்க வேண்டும்."
},
"category_interaction_short": {
"message": "தொடர்பு நினைவூட்டல்"
},
"category_intro": {
"message": "இடைமறிப்பு / அறிமுக அனிமேஷன்"
},
"category_intro_description": {
"message": "உண்மையான உள்ளடக்கம் இல்லாத இடைவெளி. இடைநிறுத்தம், நிலையான சட்டகம், மீண்டும் மீண்டும் அனிமேஷன் இருக்கலாம். தகவல்களைக் கொண்ட மாற்றங்களுக்கு இது பயன்படுத்தப்படக்கூடாது."
},
"category_intro_short": {
"message": "இடைமறிப்பு"
},
"category_outro": {
"message": "எண்ட்கார்டுகள் / வரவு"
},
"category_outro_description": {
"message": "வரவுகளை அல்லது YouTube எண்ட்கார்டுகள் தோன்றும் போது. தகவலுடன் முடிவுகளுக்கு அல்ல."
},
"category_preview": {
"message": "முன்னோட்டம்/மறுபரிசீலனை"
},
"category_filler_short": {
"message": "நிரப்பி"
},
"category_music_offtopic": {
"message": "இசை: இசை அல்லாத பிரிவு"
},
"category_music_offtopic_description": {
"message": "இசை வீடியோக்களில் மட்டுமே பயன்படுத்த வேண்டும். இது ஏற்கனவே மற்றொரு வகையால் மூடப்பட்டிருக்கும் இசை வீடியோக்களின் பிரிவுகளுக்கு மட்டுமே பயன்படுத்தப்பட வேண்டும்."
},
"category_music_offtopic_short": {
"message": "இசை அல்லாதது"
},
"category_poi_highlight": {
"message": "முன்னிலைப்படுத்த"
},
"category_poi_highlight_description": {
"message": "பெரும்பாலான மக்கள் தேடும் வீடியோவின் பகுதி. \"வீடியோ x இல் தொடங்குகிறது\" போன்றது."
},
"category_livestream_messages": {
"message": "லைவ்ஸ்ட்ரீம்: நன்கொடை / செய்தி அளவீடுகள்"
},
"category_livestream_messages_short": {
"message": "செய்தி வாசிப்பு"
},
"autoSkip": {
"message": "ஆட்டோ ஸ்கிப்"
},
"manualSkip": {
"message": "கையேடு தவிர்"
},
"showOverlay": {
"message": "சீக் பட்டியில் காட்டு"
},
"disable": {
"message": "முடக்கு"
},
"autoSkip_POI": {
"message": "துவக்கத்திற்கு தானாகக் கெந்து"
},
"manualSkip_POI": {
"message": "காணொளி ஏறுகையில் கேள்"
},
"previewColor": {
"message": "சமர்ப்பிக்கப்படாதவை நிறம்",
"description": "Referring to submissions that have not been sent to the server yet."
},
"seekBarColor": {
"message": "பார் வண்ணத்தைத் தேடுங்கள்"
},
"category": {
"message": "வகை"
},
"skipOption": {
"message": "விருப்பத்தைத் தவிர்",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "பீட்டா சோதனை சேவையகத்தை இயக்கு"
},
"whatEnableTestingServer": {
"message": "உங்கள் சமர்ப்பிப்புகள் மற்றும் வாக்குகள் பிரதான சேவையகத்தை நோக்கி வராது. சோதனைக்கு மட்டுமே இதைப் பயன்படுத்தவும்."
},
"testingServerWarning": {
"message": "சோதனை சேவையகத்துடன் இணைக்கும்போது அனைத்து சமர்ப்பிப்புகளும் வாக்குகளும் பிரதான சேவையகத்தை நோக்கி வராது. நீங்கள் உண்மையான சமர்ப்பிப்புகளை செய்ய விரும்பும்போது இதை முடக்க உறுதிப்படுத்தவும்."
},
"bracketNow": {
"message": "(இப்போது)"
},
"moreCategories": {
"message": "மேலும் வகைகள்"
},
"chooseACategory": {
"message": "ஒரு வகையைத் தேர்வுசெய்க"
},
"enableThisCategoryFirst": {
"message": "\"{0}\" வகையுடன் பிரிவுகளைச் சமர்ப்பிக்க, நீங்கள் அதை விருப்பங்களில் இயக்க வேண்டும். நீங்கள் இப்போது விருப்பங்களுக்கு திருப்பி விடப்படுவீர்கள்.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
"message": "நீங்கள் சமர்ப்பிக்கும் அனைத்து பிரிவுகளுக்கும் ஒரு வகையைத் தேர்ந்தெடுக்க வேண்டும்!"
},
"bracketEnd": {
"message": "(முடிவு)"
},
"hiddenDueToDownvote": {
"message": "மறைக்கப்பட்ட: கீழ்நோக்கி"
},
"hiddenDueToDuration": {
"message": "மறைக்கப்பட்ட: மிகக் குறுகிய"
},
"manuallyHidden": {
"message": "கைமுறையாக மறைக்கப்பட்டது"
},
"acceptPermission": {
"message": "அனுமதியை ஏற்றுக்கொள்"
},
"permissionRequestSuccess": {
"message": "அனுமதி கோரிக்கை வெற்றி!"
},
"forceChannelCheck": {
"message": "தவிர்ப்பதற்கு முன் சேனல் சோதனை கட்டாயப்படுத்தவும்"
},
"whatForceChannelCheck": {
"message": "இயல்பாக, சேனல் என்னவென்று கூடத் தெரிவதற்கு முன்பே அது பிரிவுகளைத் தவிர்க்கும். இயல்பாக, வீடியோவின் தொடக்கத்தில் சில பகுதிகள் அனுமதிப்பட்டியல் சேனல்களில் தவிர்க்கப்படலாம். இந்த விருப்பத்தை இயக்குவது இதைத் தடுக்கும், ஆனால் சேனல் ஐடியைப் பெறுவதற்கு சிறிது நேரம் ஆகலாம் என்பதால் எல்லா ஸ்கிப்பிங்கையும் சிறிது தாமதப்படுத்துகிறது. உங்களிடம் வேகமான இணையம் இருந்தால் இந்த தாமதம் கவனிக்கப்படாமல் இருக்கலாம்."
},
"forceChannelCheckPopup": {
"message": "\"தவிர்க்கும் முன் சேனல் சரிபார்ப்பை\" இயக்குவதைக் கருத்தில் கொள்ளுங்கள்"
},
"downvoteDescription": {
"message": "தவறான / தவறான நேரம்"
},
"incorrectCategory": {
"message": "வகையை மாற்று"
},
"nonMusicCategoryOnMusic": {
"message": "இந்த வீடியோ இசை என வகைப்படுத்தப்பட்டுள்ளது. இதற்கு ஒரு ஸ்பான்சர் இருப்பதை நீங்கள் உறுதியாக நம்புகிறீர்களா? இது உண்மையில் \"இசை அல்லாத பிரிவு\" என்றால், நீட்டிப்பு விருப்பங்களைத் திறந்து இந்த வகையை இயக்கவும். பின்னர், நீங்கள் இந்த பகுதியை ஸ்பான்சருக்கு பதிலாக \"இசை அல்லாதது\" என்று சமர்ப்பிக்கலாம். நீங்கள் குழப்பமாக இருந்தால் வழிகாட்டுதல்களைப் படிக்கவும்."
},
"multipleSegments": {
"message": "பல பிரிவுகள்"
},
"guidelines": {
"message": "வழிகாட்டுதல்கள்"
},
"readTheGuidelines": {
"message": "வழிகாட்டுதல்களைப் படியுங்கள்!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "வகைகள் இங்கே!"
},
"categoryUpdate2": {
"message": "அறிமுகங்கள், அவுட்ரோஸ், மெர்ச் போன்றவற்றைத் தவிர்க்க விருப்பங்களைத் திறக்கவும்."
},
"help": {
"message": "உதவி"
},
"GotIt": {
"message": "புரிந்தது",
"description": "Used as the button to dismiss a tooltip"
},
"hideForever": {
"message": "என்றென்றும் மறை"
},
"Donate": {
"message": "கொடையளி"
},
"hideDonationLink": {
"message": "நன்கொடை இணைப்பை மறை"
},
"darkModeOptionsPage": {
"message": "தெரிவுகள் பக்கத்தில் இருண்ட பயன்முறை"
},
"helpPageThanksForInstalling": {
"message": "ஸ்பான்சர்ப்ளாக் நிறுவியதற்கு நன்றி."
},
"ContinueVoting": {
"message": "தொடர்ந்து வாக்களி"
},
"ChangeCategoryTooltip": {
"message": "இது உம் துண்டங்களை உடனடியாகச் செயல்படுத்தும்"
},
"downvote": {
"message": "வாக்கிறக்கு"
},
"upvote": {
"message": "வாக்கேற்று"
},
"hideSegment": {
"message": "துண்டத்தை மறை"
},
"dayAbbreviation": {
"message": "நா",
"description": "100d"
},
"hourAbbreviation": {
"message": "ம",
"description": "100h"
},
"optionsTabBehavior": {
"message": "நடத்தை",
"description": "Appears in Options as a tab header for options related to categories and skipping behavior. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabInterface": {
"message": "இடைமுகம்",
"description": "Appears in Options as a tab header for options related to GUI and sounds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabKeyBinds": {
"message": "விசைப்பலகை குறுக்குவழிகள்",
"description": "Appears in Options as a tab header for keybinds. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabBackup": {
"message": "காப்புநகல்/மீட்டெடுப்பு",
"description": "Appears in Options as a tab header for options related to saving/restoring your settings. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"optionsTabAdvanced": {
"message": "இதர",
"description": "Appears in Options as a tab header for advanced/niche options. To fit inside the button, it should not be longer than ~20-25 characters (depending on their width)."
},
"notSet": {
"message": "அமைக்கவில்லை"
},
"change": {
"message": "மாற்று"
},
"betaServerWarning": {
"message": "பீட்டா சேவையகம் இயக்கப்பட்டுள்ளது!"
},
"openOptionsPage": {
"message": "தெரிவுகள் பக்கத்தைத் திற"
}
}

View File

@@ -1,533 +0,0 @@
{
"fullName": {
"message": "YouTube కోసం SponsorBlock - స్పాన్సర్‌షిప్‌లను దాటవేయి",
"description": "Name of the extension."
},
"Description": {
"message": "YouTube వీడియోలలో స్పాన్సర్‌షిప్‌లు, సభ్యత్వ యాచన మరియు మరిన్ని దాటవేయండి. ఇతరుల సమయాన్ని ఆదా చేయడానికి మీరు చూసే వీడియోలపై స్పాన్సర్‌లను నివేదించండి.",
"description": "Description of the extension."
},
"400": {
"message": "ఈ అభ్యర్థన చెల్లదని సర్వర్ తెలిపింది"
},
"429": {
"message": "ఈ ఒక వీడియో కోసం మీరు చాలా స్పాన్సర్ సమయాలను సమర్పించారు, ఈ చాలా ఉన్నాయి అని మీరు ఖచ్చితంగా అనుకుంటున్నారా?"
},
"409": {
"message": "ఇది ఇప్పటికే ముందు సమర్పించబడింది"
},
"channelWhitelisted": {
"message": "ఛానెల్ వైట్‌లిస్ట్!"
},
"Segment": {
"message": "విభాగం"
},
"Segments": {
"message": "విభాగాలు"
},
"upvoteButtonInfo": {
"message": "ఈ సమర్పణను పెంచండి"
},
"reportButtonTitle": {
"message": "నివేదిక"
},
"reportButtonInfo": {
"message": "ఈ సమర్పణ తప్పు అని నివేదించండి."
},
"Dismiss": {
"message": "రద్దుచేసే"
},
"Loading": {
"message": "లోడ్ అవుతుంది..."
},
"Hide": {
"message": "నెవర్ షో"
},
"hitGoBack": {
"message": "మీరు ఎక్కడి నుండి వచ్చారో అన్‌స్కిప్ నొక్కండి."
},
"unskip": {
"message": "అన్‌స్కిప్"
},
"reskip": {
"message": "రెస్కిప్"
},
"paused": {
"message": "పాజ్ చేయబడింది"
},
"manualPaused": {
"message": "టైమర్ ఆగిపోయింది"
},
"confirmMSG": {
"message": "వ్యక్తిగత విలువలను సవరించడానికి లేదా తొలగించడానికి, ఎగువ కుడి మూలలోని పొడిగింపు చిహ్నాన్ని క్లిక్ చేయడం ద్వారా సమాచార బటన్‌ను క్లిక్ చేయండి లేదా పొడిగింపు పాపప్‌ను తెరవండి."
},
"clearThis": {
"message": "మీరు దీన్ని ఖచ్చితంగా క్లియర్ చేయాలనుకుంటున్నారా?\n\n"
},
"Unknown": {
"message": "మీ స్పాన్సర్ సమయాన్ని సమర్పించడంలో లోపం ఉంది, దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి."
},
"sponsorFound": {
"message": "ఈ వీడియో డేటాబేస్లో విభాగాలు ఉన్నాయి!"
},
"sponsor404": {
"message": "విభాగాలు ఏవీ కనుగొనబడలేదు"
},
"sponsorStart": {
"message": "విభాగం ఇప్పుడు ప్రారంభమవుతుంది"
},
"sponsorEnd": {
"message": "సెగ్మెంట్ ఇప్పుడు ముగుస్తుంది"
},
"noVideoID": {
"message": "YouTube వీడియో కనుగొనబడలేదు.\nఇది తప్పు అయితే, టాబ్‌ను రిఫ్రెష్ చేయండి."
},
"success": {
"message": "విజయం!"
},
"voted": {
"message": "ఓటు వేశారు!"
},
"serverDown": {
"message": "సర్వర్ డౌన్ అయిందనిపిస్తోంది. వెంటనే డెవలపర్‌ను సంప్రదించండి."
},
"connectionError": {
"message": "కనెక్షన్ లోపం సంభవించింది. లోపం కోడ్: "
},
"clearTimes": {
"message": "విభాగాలను క్లియర్ చేయండి"
},
"openPopup": {
"message": "స్పాన్సర్బ్లాక్ పాపప్‌ను తెరవండి"
},
"closePopup": {
"message": "పాపప్ మూసివేయండి"
},
"submitCheck": {
"message": "మీరు దీన్ని ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?"
},
"whitelistChannel": {
"message": "వైట్‌లిస్ట్ ఛానెల్"
},
"removeFromWhitelist": {
"message": "వైట్‌లిస్ట్ నుండి ఛానెల్‌ని తొలగించండి"
},
"voteOnTime": {
"message": "ఒక విభాగంలో ఓటు వేయండి"
},
"Submissions": {
"message": "సమర్పణలు"
},
"savedPeopleFrom": {
"message": "మీరు ప్రజలను రక్షించారు "
},
"viewLeaderboard": {
"message": "లీడర్‌బోర్డ్"
},
"recordTimesDescription": {
"message": "సమర్పించండి"
},
"submissionEditHint": {
"message": "మీరు సమర్పించు క్లిక్ చేసిన తర్వాత విభాగం సవరణ కనిపిస్తుంది",
"description": "Appears in the popup to inform them that editing has been moved to the video player."
},
"popupHint": {
"message": "సూచన: మీరు ఎంపికలలో సమర్పించడానికి కీబైండ్లను సెటప్ చేయవచ్చు"
},
"clearTimesButton": {
"message": "టైమ్స్ క్లియర్"
},
"publicStats": {
"message": "మీరు ఎంత సహకరించారో చూపించడానికి ఇది పబ్లిక్ గణాంకాల పేజీలో ఉపయోగించబడుతుంది. ఇది చూడు"
},
"Username": {
"message": "వినియోగదారు పేరు"
},
"setUsername": {
"message": "వినియోగదారు పేరును సెట్ చేయండి"
},
"discordAdvert": {
"message": "సూచనలు మరియు అభిప్రాయాలను ఇవ్వడానికి అధికారిక అసమ్మతి సర్వర్‌లో చేరండి!"
},
"hideThis": {
"message": "దీన్ని దాచండి"
},
"Options": {
"message": "ఎంపికలు"
},
"showButtons": {
"message": "YouTube ప్లేయర్‌లో బటన్లను చూపించు"
},
"hideButtons": {
"message": "YouTube ప్లేయర్‌లో బటన్లను దాచండి"
},
"hideButtonsDescription": {
"message": "దాటవేసే విభాగాలను సమర్పించడానికి ఇది YouTube ప్లేయర్‌లో కనిపించే బటన్లను దాచిపెడుతుంది."
},
"showInfoButton": {
"message": "YouTube ప్లేయర్‌లో సమాచారం బటన్‌ను చూపించు"
},
"hideInfoButton": {
"message": "YouTube ప్లేయర్‌లో సమాచారం బటన్‌ను దాచండి"
},
"hideDeleteButton": {
"message": "YouTube ప్లేయర్‌లో తొలగించు బటన్‌ను దాచండి"
},
"showDeleteButton": {
"message": "YouTube ప్లేయర్‌లో తొలగించు బటన్‌ను చూపించు"
},
"enableViewTracking": {
"message": "స్కిప్ కౌంట్ ట్రాకింగ్‌ను ప్రారంభించండి"
},
"whatViewTracking": {
"message": "ఈ ఫీచర్ మీరు సమర్పించిన విభాగాలు వినియోగదారులకు వారి సమర్పణ ఇతరులకు ఎంతవరకు సహాయపడిందో తెలియజేయడానికి మరియు స్పామ్ డేటాబేస్లోకి రాకుండా చూసుకోవటానికి అప్‌వోట్‌లతో పాటు మెట్రిక్‌గా ఉపయోగించబడుతుందని ట్రాక్ చేస్తుంది. మీరు ప్రతి విభాగాన్ని దాటవేసిన ప్రతిసారీ పొడిగింపు సర్వర్‌కు సందేశాన్ని పంపుతుంది. వీక్షణ సంఖ్యలు ఖచ్చితమైనవి కాబట్టి చాలా మంది ఈ సెట్టింగ్‌ను మార్చరు. :)"
},
"enableQueryByHashPrefix": {
"message": "హాష్ ఉపసర్గ ద్వారా ప్రశ్న"
},
"whatQueryByHashPrefix": {
"message": "వీడియోఐడిని ఉపయోగించి సర్వర్ నుండి విభాగాలను అభ్యర్థించే బదులు, వీడియోఐడి యొక్క హాష్ యొక్క మొదటి 4 అక్షరాలు పంపబడతాయి. ఈ సర్వర్ సారూప్య హాష్‌లతో ఉన్న అన్ని వీడియోల కోసం డేటాను తిరిగి పంపుతుంది."
},
"enableRefetchWhenNotFound": {
"message": "క్రొత్త వీడియోలలో విభాగాలను తిరిగి పొందండి"
},
"whatRefetchWhenNotFound": {
"message": "వీడియో క్రొత్తది మరియు విభాగాలు ఏవీ కనుగొనబడకపోతే, మీరు చూసేటప్పుడు ప్రతి కొన్ని నిమిషాలకు ఇది రీఫెట్ చేస్తూనే ఉంటుంది."
},
"showNotice": {
"message": "మళ్ళీ నోటీసు చూపించు"
},
"showSkipNotice": {
"message": "ఒక విభాగం దాటవేయబడిన తర్వాత నోటీసు చూపించు"
},
"longDescription": {
"message": "స్పాన్సర్లు, పరిచయాలు, ros ట్రోలు, చందా రిమైండర్‌లు మరియు YouTube వీడియోల యొక్క ఇతర బాధించే భాగాలను దాటవేయడానికి స్పాన్సర్‌బ్లాక్ మిమ్మల్ని అనుమతిస్తుంది. స్పాన్సర్బ్లాక్ అనేది క్రౌడ్ సోర్స్డ్ బ్రౌజర్ పొడిగింపు, ఇది ఎవరైనా స్పాన్సర్ చేసిన విభాగాలు మరియు యూట్యూబ్ వీడియోల యొక్క ప్రారంభ మరియు ముగింపు సమయాన్ని సమర్పించనివ్వండి. ఒక వ్యక్తి ఈ సమాచారాన్ని సమర్పించిన తర్వాత, ఈ పొడిగింపు ఉన్న ప్రతి ఒక్కరూ ప్రాయోజిత విభాగంలో దాటవేస్తారు. మీరు మ్యూజిక్ వీడియోల యొక్క నాన్-మ్యూజిక్ విభాగాలను కూడా దాటవేయవచ్చు.",
"description": "Full description of the extension on the store pages."
},
"website": {
"message": "వెబ్‌సైట్",
"description": "Used on Firefox Store Page"
},
"sourceCode": {
"message": "మూల కోడ్",
"description": "Used on Firefox Store Page"
},
"noticeUpdate": {
"message": "నోటీసు అప్‌గ్రేడ్ చేయబడింది!",
"description": "The first line of the message displayed after the notice was upgraded."
},
"noticeUpdate2": {
"message": "మీకు ఇంకా నచ్చకపోతే, ఎప్పుడూ చూపించు బటన్ నొక్కండి.",
"description": "The second line of the message displayed after the notice was upgraded."
},
"0": {
"message": "అనుసంధాన సమయం సమాప్తం. మీ ఇంటర్నెట్ కనెక్షన్‌ను తనిఖీ చేయండి. మీ ఇంటర్నెట్ పనిచేస్తుంటే, సర్వర్ ఓవర్‌లోడ్ లేదా డౌన్ అయి ఉండవచ్చు."
},
"disableSkipping": {
"message": "దాటవేయడం ప్రారంభించబడింది"
},
"enableSkipping": {
"message": "దాటవేయడం నిలిపివేయబడింది"
},
"yourWork": {
"message": "నీ పని",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "సర్వర్ ఓవర్‌లోడ్ అయినట్లు ఉంది. కొన్ని సెకన్లలో మళ్ళీ ప్రయత్నించండి."
},
"errorCode": {
"message": "లోపం కోడ్: "
},
"skip": {
"message": "దాటవేయి"
},
"skip_category": {
"message": "{0} ని దాటవేయాలా?"
},
"disableAutoSkip": {
"message": "ఆటో దాటవేయిని ఆపివేయి"
},
"enableAutoSkip": {
"message": "ఆటో దాటవేయిని ప్రారంభించండి"
},
"audioNotification": {
"message": "దాటవేసిన ఆడియో నోటిఫికేషన్"
},
"audioNotificationDescription": {
"message": "ఒక విభాగం దాటవేయబడినప్పుడల్లా స్కిప్‌లోని ఆడియో నోటిఫికేషన్ ధ్వనిని ప్లే చేస్తుంది. నిలిపివేయబడితే (లేదా ఆటో స్కిప్ నిలిపివేయబడింది), శబ్దం ప్లే చేయబడదు."
},
"showTimeWithSkips": {
"message": "తొలగించబడిన స్కిప్‌లతో సమయాన్ని చూపించు"
},
"showTimeWithSkipsDescription": {
"message": "ఈ సమయం సీక్ బార్ క్రింద ప్రస్తుత సమయం పక్కన బ్రాకెట్లలో కనిపిస్తుంది. ఇది మొత్తం వీడియో వ్యవధి మైనస్ ఏదైనా విభాగాలను చూపుతుంది. ఇందులో \"సీక్బార్లో చూపించు\" అని మాత్రమే గుర్తించబడిన విభాగాలు ఉన్నాయి."
},
"youHaveSkipped": {
"message": "మీరు దాటవేశారు "
},
"minLower": {
"message": "నిమిషం"
},
"minsLower": {
"message": "నిమిషాలు"
},
"hourLower": {
"message": "గంట"
},
"hoursLower": {
"message": "గంటలు"
},
"youHaveSavedTime": {
"message": "మీరు ప్రజలను రక్షించారు",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"youHaveSavedTimeEnd": {
"message": " వారి జీవితాల",
"description": "You've saved people from 887,362 segments (236d 15h 5.3 minutes of their lives)."
},
"statusReminder": {
"message": "సర్వర్ స్థితి కోసం status.sponsor.ajay.app ని తనిఖీ చేయండి."
},
"createdBy": {
"message": "సృష్టికర్త"
},
"optionsInfo": {
"message": "ఇన్విడియస్ మద్దతును ప్రారంభించండి, ఆటోస్కిప్‌ను డిసేబుల్ చేయండి, బటన్లను దాచు మరియు మరిన్ని చేయండి."
},
"add": {
"message": "జోడించు"
},
"addInvidiousInstanceError": {
"message": "ఇది చెల్లని డొమైన్. ఇది డొమైన్ భాగాన్ని కలిగి ఉండాలి. ఉదాహరణ: invidious.ajay.app"
},
"resetInvidiousInstance": {
"message": "ఇన్విడియస్ ఇన్‌స్టాన్స్ జాబితాను రీసెట్ చేయండి"
},
"resetInvidiousInstanceAlert": {
"message": "మీరు ఇన్విడియస్ ఉదాహరణ జాబితాను రీసెట్ చేయబోతున్నారు"
},
"currentInstances": {
"message": "ప్రస్తుత సందర్భాలు:"
},
"minDuration": {
"message": "కనిష్ట వ్యవధి (సెకన్లు):"
},
"minDurationDescription": {
"message": "సెట్ విలువ కంటే తక్కువ విభాగాలు దాటవేయబడవు లేదా ప్లేయర్‌లో చూపబడవు."
},
"shortCheck": {
"message": "కింది సమర్పణ మీ కనీస వ్యవధి ఎంపిక కంటే తక్కువగా ఉంటుంది. ఇది ఇప్పటికే సమర్పించబడిందని మరియు ఈ ఎంపిక కారణంగా విస్మరించబడిందని దీని అర్థం. మీరు ఖచ్చితంగా సమర్పించాలనుకుంటున్నారా?"
},
"showUploadButton": {
"message": "అప్‌లోడ్ బటన్ చూపించు"
},
"customServerAddress": {
"message": "స్పాన్సర్బ్లాక్ సర్వర్ చిరునామా"
},
"customServerAddressDescription": {
"message": "స్పాన్సర్‌బ్లాక్ చిరునామా సర్వర్‌కు కాల్ చేయడానికి ఉపయోగిస్తుంది.\nమీకు మీ స్వంత సర్వర్ ఉదాహరణ లేకపోతే, ఇది మార్చబడదు."
},
"save": {
"message": "సేవ్ చేయండి"
},
"reset": {
"message": "రీసెట్ చేయండి"
},
"customAddressError": {
"message": "ఈ చిరునామా సరైన రూపంలో లేదు. మీకు ప్రారంభంలో http: // లేదా https: // ఉందని మరియు వెనుకంజలో స్లాష్‌లు లేవని నిర్ధారించుకోండి."
},
"areYouSureReset": {
"message": "మీరు దీన్ని రీసెట్ చేయాలనుకుంటున్నారా?"
},
"mobileUpdateInfo": {
"message": "m.youtube.com కి ఇప్పుడు మద్దతు ఉంది"
},
"exportOptions": {
"message": "అన్ని ఎంపికలను దిగుమతి / ఎగుమతి చేయండి"
},
"setOptions": {
"message": "ఎంపికలను సెట్ చేయండి"
},
"exportOptionsWarning": {
"message": "హెచ్చరిక: ఎంపికలను మార్చడం శాశ్వతం మరియు మీ ఇన్‌స్టాల్‌ను విచ్ఛిన్నం చేస్తుంది. మీరు దీన్ని ఖచ్చితంగా చేయాలనుకుంటున్నారా? ఒకవేళ మీ పాతదాన్ని బ్యాకప్ చేయాలని నిర్ధారించుకోండి."
},
"incorrectlyFormattedOptions": {
"message": "ఈ JSON సరిగ్గా ఆకృతీకరించబడలేదు. మీ ఎంపికలు మార్చబడలేదు."
},
"confirmNoticeTitle": {
"message": "విభాగాన్ని సమర్పించండి"
},
"submit": {
"message": "సమర్పించండి"
},
"cancel": {
"message": "రద్దు చేయండి"
},
"delete": {
"message": "తొలగించు"
},
"preview": {
"message": "పరిదృశ్యం"
},
"inspect": {
"message": "పరిశీలించండి"
},
"edit": {
"message": "సవరించండి"
},
"copyDebugInformation": {
"message": "డీబగ్ సమాచారాన్ని క్లిప్‌బోర్డ్‌కు కాపీ చేయండి"
},
"copyDebugInformationFailed": {
"message": "క్లిప్‌బోర్డ్‌కు వ్రాయడంలో విఫలమైంది"
},
"copyDebugInformationOptions": {
"message": "బగ్‌ను పెంచేటప్పుడు / డెవలపర్ అభ్యర్థించినప్పుడు డెవలపర్‌కు అందించాల్సిన సమాచారాన్ని క్లిప్‌బోర్డ్‌కు కాపీ చేస్తుంది. మీ యూజర్ ఐడి, వైట్‌లిస్ట్ చేసిన ఛానెల్‌లు మరియు అనుకూల సర్వర్ చిరునామా వంటి సున్నితమైన సమాచారం తొలగించబడింది. అయితే ఇది మీ ఉపయోగకరమైన, బ్రౌజర్, ఆపరేటింగ్ సిస్టమ్ మరియు పొడిగింపు సంస్కరణ సంఖ్య వంటి సమాచారాన్ని కలిగి ఉంటుంది. "
},
"copyDebugInformationComplete": {
"message": "డీబగ్ సమాచారం క్లిప్ బోర్డ్‌కు కాపీ చేయబడింది. మీరు భాగస్వామ్యం చేయని సమాచారాన్ని తొలగించడానికి సంకోచించకండి. దీన్ని టెక్స్ట్ ఫైల్‌లో సేవ్ చేయండి లేదా బగ్ రిపోర్ట్‌లో అతికించండి."
},
"to": {
"message": "కు",
"description": "Used between segments. Example: 1:20 to 1:30"
},
"category_sponsor": {
"message": "స్పాన్సర్"
},
"category_sponsor_description": {
"message": "చెల్లింపు ప్రమోషన్, చెల్లింపు సూచనలు మరియు ప్రత్యక్ష ప్రకటనలు. స్వీయ-ప్రమోషన్ కోసం లేదా వారు ఇష్టపడే కారణాలు / సృష్టికర్తలు / వెబ్‌సైట్లు / ఉత్పత్తులకు ఉచిత అరవడం కోసం కాదు."
},
"category_selfpromo": {
"message": "చెల్లించని / స్వీయ ప్రమోషన్"
},
"category_selfpromo_description": {
"message": "చెల్లించని లేదా స్వీయ ప్రమోషన్ మినహా \"స్పాన్సర్\" మాదిరిగానే. వాణిజ్య వస్తువులు, విరాళాలు లేదా వారు ఎవరితో సహకరించారు అనే సమాచారం గురించి విభాగాలు ఇందులో ఉన్నాయి."
},
"category_interaction": {
"message": "ఇంటరాక్షన్ రిమైండర్ (సబ్‌స్క్రయిబ్)"
},
"category_interaction_description": {
"message": "కంటెంట్ మధ్యలో వాటిని ఇష్టపడటానికి, సభ్యత్వాన్ని పొందటానికి లేదా అనుసరించడానికి చిన్న రిమైండర్ ఉన్నప్పుడు. ఇది పొడవైనది లేదా ఏదైనా ప్రత్యేకమైనది అయితే, అది బదులుగా స్వీయ ప్రమోషన్ కింద ఉండాలి."
},
"category_interaction_short": {
"message": "ఇంటరాక్షన్ రిమైండర్"
},
"category_intro": {
"message": "ఇంటర్‌మిషన్ / ఇంట్రో యానిమేషన్"
},
"category_intro_description": {
"message": "అసలు కంటెంట్ లేని విరామం. విరామం, స్టాటిక్ ఫ్రేమ్, పునరావృత యానిమేషన్ కావచ్చు. సమాచారాన్ని కలిగి ఉన్న పరివర్తనలకు ఇది ఉపయోగించరాదు."
},
"category_intro_short": {
"message": "అంతరాయం"
},
"category_outro": {
"message": "ఎండ్ కార్డులు / క్రెడిట్స్"
},
"category_outro_description": {
"message": "క్రెడిట్స్ లేదా YouTube ఎండ్‌కార్డ్‌లు కనిపించినప్పుడు. సమాచారంతో తీర్మానాల కోసం కాదు."
},
"category_music_offtopic": {
"message": "సంగీతం: నాన్-మ్యూజిక్ విభాగం"
},
"category_music_offtopic_description": {
"message": "మ్యూజిక్ వీడియోలలో మాత్రమే ఉపయోగం కోసం. ఇది ఇప్పటికే మరొక వర్గం ద్వారా కవర్ చేయని సంగీతం వీడియోల విభాగాలకు మాత్రమే ఉపయోగించాలి."
},
"category_music_offtopic_short": {
"message": "నాన్-మ్యూజిక్"
},
"category_livestream_messages": {
"message": "లైవ్ స్ట్రీమ్: విరాళం / సందేశ రీడింగులు"
},
"category_livestream_messages_short": {
"message": "సందేశ పఠనం"
},
"autoSkip": {
"message": "ఆటో దాటవేయి"
},
"manualSkip": {
"message": "మాన్యువల్ దాటవేయి"
},
"showOverlay": {
"message": "సీక్ బార్‌లో చూపించు"
},
"disable": {
"message": "డిసేబుల్"
},
"seekBarColor": {
"message": "బార్ కలర్ కోరుకుంటారు"
},
"category": {
"message": "వర్గం"
},
"skipOption": {
"message": "ఎంపికను దాటవేయి",
"description": "Used on the options page to describe the ways to skip the segment (auto skip, manual, etc.)"
},
"enableTestingServer": {
"message": "బీటా టెస్టింగ్ సర్వర్‌ను ప్రారంభించండి"
},
"whatEnableTestingServer": {
"message": "మీ సమర్పణలు మరియు ఓట్లు ప్రధాన సర్వర్ వైపు లెక్కించబడవు. పరీక్ష కోసం మాత్రమే దీన్ని ఉపయోగించండి."
},
"testingServerWarning": {
"message": "అన్ని సమర్పణలు మరియు ఓట్లు పరీక్ష సర్వర్‌కు కనెక్ట్ చేసేటప్పుడు ప్రధాన సర్వర్ వైపు లెక్కించబడవు. మీరు నిజమైన సమర్పణలు చేయాలనుకున్నప్పుడు దీన్ని నిలిపివేయాలని నిర్ధారించుకోండి."
},
"bracketNow": {
"message": "(ఇప్పుడు)"
},
"moreCategories": {
"message": "మరిన్ని వర్గాలు"
},
"chooseACategory": {
"message": "వర్గాన్ని ఎంచుకోండి"
},
"enableThisCategoryFirst": {
"message": "\"{0}\" వర్గంతో విభాగాలను సమర్పించడానికి, మీరు దీన్ని ఎంపికలలో ప్రారంభించాలి. మీరు ఇప్పుడు ఎంపికలకు మళ్ళించబడతారు.",
"description": "Used when submitting segments to only let them select a certain category if they have it enabled in the options."
},
"youMustSelectACategory": {
"message": "మీరు సమర్పించే అన్ని విభాగాల కోసం మీరు తప్పనిసరిగా ఒక వర్గాన్ని ఎంచుకోవాలి!"
},
"bracketEnd": {
"message": "(ముగింపు)"
},
"hiddenDueToDownvote": {
"message": "దాచిన: డౌన్ వోట్"
},
"hiddenDueToDuration": {
"message": "దాచబడింది: చాలా చిన్నది"
},
"forceChannelCheck": {
"message": "దాటవేయడానికి ముందు ఛానెల్ తనిఖీ చేయమని బలవంతం చేయండి"
},
"whatForceChannelCheck": {
"message": "అప్రమేయంగా, ఛానెల్ ఏమిటో తెలియక ముందే ఇది విభాగాలను దాటవేస్తుంది. అప్రమేయంగా, వీడియో ప్రారంభంలో కొన్ని విభాగాలు వైట్‌లిస్ట్ చేసిన ఛానెల్‌లలో దాటవేయబడవచ్చు. ఈ ఎంపికను ప్రారంభించడం దీనిని నిరోధిస్తుంది, కాని ఛానెల్ ఐడిని పొందడానికి కొంత సమయం పట్టవచ్చు కాబట్టి అన్ని దాటవేయడం కొంచెం ఆలస్యం అవుతుంది. మీకు వేగవంతమైన ఇంటర్నెట్ ఉంటే ఈ ఆలస్యం గుర్తించబడదు."
},
"forceChannelCheckPopup": {
"message": "\"దాటవేయడానికి ముందు ఫోర్స్ ఛానల్ చెక్\" ప్రారంభించడం పరిగణించండి"
},
"downvoteDescription": {
"message": "తప్పు / తప్పు సమయం"
},
"nonMusicCategoryOnMusic": {
"message": "ఈ వీడియోను సంగీతంగా వర్గీకరించారు. దీనికి స్పాన్సర్ ఉందని మీరు ఖచ్చితంగా అనుకుంటున్నారా? ఇది వాస్తవానికి \"నాన్-మ్యూజిక్ సెగ్మెంట్\" అయితే, పొడిగింపు ఎంపికలను తెరిచి ఈ వర్గాన్ని ప్రారంభించండి. అప్పుడు, మీరు ఈ విభాగాన్ని స్పాన్సర్‌కు బదులుగా \"నాన్-మ్యూజిక్\" గా సమర్పించవచ్చు. మీరు గందరగోళంలో ఉంటే దయచేసి మార్గదర్శకాలను చదవండి."
},
"multipleSegments": {
"message": "బహుళ విభాగాలు"
},
"guidelines": {
"message": "మార్గదర్శకాలు"
},
"readTheGuidelines": {
"message": "మార్గదర్శకాలను చదవండి!!",
"description": "Show the first time they submit or if they are \"high risk\""
},
"categoryUpdate1": {
"message": "వర్గాలు ఇక్కడ ఉన్నాయి!"
},
"categoryUpdate2": {
"message": "పరిచయాలు, ros ట్రోస్, మెర్చ్ మొదలైనవాటిని దాటవేయడానికి ఎంపికలను తెరవండి."
}
}

View File

@@ -1,80 +0,0 @@
{
"fullName": {
"message": "SponsorBlock สำหรับ YouTube - ข้ามสปอนเซอร์",
"description": "Name of the extension."
},
"Description": {
"message": "ข้ามสปอนเซอร์, การก่อการติดตาม, ฯลฯ ในวีดีโอ YouTube. รายงานสปอนเซอร์ในวีดีโอเพื่อประหยัดเวลาคนอื่น",
"description": "Description of the extension."
},
"400": {
"message": "เซิร์ฟเวอร์รายงานว่าคำขอนี้ไม่ถูกต้อง"
},
"429": {
"message": "คุณรายงานสปอนเซอร์มากเกินไปในวิดีโอนี้ คุณมั่นใจว่ามีมากเท่านี้จริงหรือไม่?"
},
"409": {
"message": "สปอนเซอร์นี้ได้รับการรายงานมาก่อน"
},
"channelWhitelisted": {
"message": "ช่องนี้ถูกนำเข้ารายการอนุญาตพิเศษแล้ว"
},
"Segment": {
"message": "ส่วน"
},
"Segments": {
"message": "ส่วน"
},
"SegmentsCap": {
"message": "ส่วน"
},
"upvoteButtonInfo": {
"message": "เห็นด้วยกับรายงานนี้"
},
"reportButtonTitle": {
"message": "รายงาน"
},
"reportButtonInfo": {
"message": "รายงานส่วนนี้ว่าไม่ถูกต้อง"
},
"Dismiss": {
"message": "ปฏิเสธ"
},
"Loading": {
"message": "กำลังโหลด..."
},
"Hide": {
"message": "ไม่แสดงเสมอ"
},
"hitGoBack": {
"message": "กด \"ยกเลิกการข้าม\" เพื่อกลับไปที่เดิม"
},
"unskip": {
"message": "ยกเลิกการข้าม"
},
"reskip": {
"message": "ข้ามใหม่"
},
"unmute": {
"message": "เปิดเสียง"
},
"paused": {
"message": "กำลังหยุดชั่วคราว"
},
"manualPaused": {
"message": "หยุดการจับเวลาแล้ว"
},
"clearThis": {
"message": "คุณมั่นใจว่าจะลบส่วนนี้หรือไม่?\n\n"
},
"sponsor404": {
"message": "ไม่พบส่วนในวีดีโอนี้"
},
"clearTimesButton": {
"message": "ล้างเวลา"
},
"supportOtherSitesDescription": {
"message": "สนับสนุนลูกค้า YouTube บุคคลที่สาม.\nในการเปิดใช้งานการสนับสนุน คุณต้องยอมรับการอนุญาตพิเศษ!",
"description": "This replaces the 'supports Invidious' option because it now works on other YouTube sites such as Cloudtube"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -45,6 +45,7 @@ div:hover > #previewbar.sbNotInvidious {
.previewbar {
display: inline-block;
height: 100%;
min-width: 1px;
}
.previewbar.requiredSegment {
@@ -187,6 +188,10 @@ div:hover > .sponsorBlockChapterBar {
margin-right: var(--skip-notice-margin);
}
.sponsorSkipObjectFirst {
margin-left: 0;
}
.sponsorSkipLogo {
height: 18px;
@@ -250,7 +255,7 @@ div:hover > .sponsorBlockChapterBar {
}
.exportCopiedNotice .sponsorSkipNoticeTableContainer {
background-color: transparent;
background-color: transparent;
}
.sponsorSkipNotice {
@@ -783,6 +788,10 @@ input::-webkit-inner-spin-button {
align-items: center;
}
.sponsorBlockCategoryPillTitle {
white-space: nowrap;
}
.categoryPillClose {
display: none;
height: 10px;
@@ -803,3 +812,44 @@ input::-webkit-inner-spin-button {
color: #fff;
opacity: .7;
}
/* full video labels on thumbnails */
.sponsorThumbnailLabel {
display: none;
position: absolute;
top: 0;
left: 0;
padding: 0.5em;
margin: 0.5em;
border-radius: 2em;
z-index: 1000;
background-color: var(--category-color, #000);
opacity: 0.7;
box-shadow: 0 0 8px 2px #333;
font-size: 10px;
}
.sponsorThumbnailLabel.sponsorThumbnailLabelVisible {
display: flex;
}
.sponsorThumbnailLabel svg {
height: 2em;
fill: var(--category-text-color, #fff);
}
.sponsorThumbnailLabel span {
display: none;
padding-left: 0.25em;
font-size: 1.5em;
color: var(--category-text-color, #fff);
}
.sponsorThumbnailLabel:hover {
border-radius: 0.25em;
opacity: 1;
}
.sponsorThumbnailLabel:hover span {
display: inline;
}

View File

@@ -8,7 +8,6 @@
<link href="styles.css" rel="stylesheet"/>
<script src="../js/vendor.js"></script>
<script src="../js/help.js"></script>
</head>

View File

@@ -696,4 +696,9 @@ svg {
.upsellButton {
cursor: pointer;
vertical-align: middle;
}
.no-bottom-border {
border: none !important;
padding: 20px 0px 0px 0px !important;
}

View File

@@ -9,7 +9,6 @@
<link href="options.css" rel="stylesheet"/>
<script src="../js/vendor.js"></script>
<script src="../js/options.js"></script>
</head>
@@ -78,7 +77,7 @@
</div>
</div>
<div data-type="toggle" data-sync="fullVideoSegments">
<div data-type="toggle" data-sync="fullVideoSegments" class="no-bottom-border">
<div class="switch-container">
<label class="switch">
<input id="fullVideoSegments" type="checkbox" checked>
@@ -90,6 +89,19 @@
</div>
</div>
<div data-type="toggle" data-sync="fullVideoLabelsOnThumbnails"
data-dependent-on="fullVideoSegments">
<div class="switch-container">
<label class="switch">
<input id="fullVideoLabelsOnThumbnails" type="checkbox" checked>
<span class="slider round"></span>
</label>
<label class="switch-label" for="fullVideoLabelsOnThumbnails">
__MSG_fullVideoLabelsOnThumbnails__
</label>
</div>
</div>
<div data-type="number-change" data-sync="minDuration">
<label class="number-container">
<span class="optionLabel">__MSG_minDuration__</span>

View File

@@ -6,7 +6,6 @@
<link href="styles.css" rel="stylesheet"/>
<script src="../js/vendor.js"></script>
<script src="../js/permissions.js"></script>
</head>

View File

@@ -40,7 +40,7 @@
color: var(--sb-main-fg-color);
background: transparent;
width: fit-content;
padding: none;
padding: 0;
border: none;
}
@@ -498,6 +498,7 @@
}
#setUsernameContainer {
display: flex;
align-items: center;
width: fit-content;
}
#setUsernameContainer > button {
@@ -522,7 +523,7 @@
white-space: nowrap;
overflow: hidden;
margin: 0 8px 0 0;
max-width: 130px;
max-width: 165px;
}
/*
* Set username form container with "expanded" state

View File

@@ -202,7 +202,6 @@
</div>
<!-- Scripts that need to load after the html -->
<script src="./js/vendor.js" async></script>
<script src="./js/popup.js" async></script>
</body>
</html>

View File

@@ -1,101 +0,0 @@
<!DOCTYPE html>
<head>
<title>Upsell - SponsorBlock</title>
<meta charset="utf-8">
<link href="styles.css" rel="stylesheet" />
<script src="../js/vendor.js"></script>
<script src="../js/upsell.js"></script>
</head>
<body class="sponsorBlockPageBody">
<div id="title" class="titleBar">
<img src="../icons/LogoSponsorBlocker256px.png" height="80" class="profilepic" />
SponsorBlock
</div>
<br />
<div class="center">
<p>
__MSG_chaptersPage1__
</p>
<p class="smaller">
__MSG_chaptersPage2__
</p>
</div>
<div class="center">
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/H_mP7bpbA_c?modestbranding=1&rel=0" title="Demo Video"
frameborder="0" allow="autoplay; clipboard-write; encrypted-media; picture-in-picture"
allowfullscreen>
</iframe>
</div>
<br />
<div class="center row-item">
<a href="https://buy.ajay.app/l/sponsorblock" class="option-link side-by-side" target="_blank" rel="noreferrer">
<div id="oneTimePurchase" class="option-button inline">
__MSG_oneTimePurchase__
</div>
</a>
<a href="https://www.patreon.com/ajayyy" class="option-link side-by-side" target="_blank" rel="noreferrer">
<div class="option-button side-by-side inline">
__MSG_joinOnPatreon__
</div>
</a>
</div>
<div class="center row-item">
<input id="redeemCodeInput" class="option-text-box" type="text" placeholder="__MSG_enterLicenseKey__">
<div id="redeemButton" class="option-button inline">
__MSG_redeem__
</div>
</div>
<div class="center row-item">
<a href="https://www.patreon.com/oauth2/authorize?response_type=code&client_id=-W7ib8J-LB3jowb1fqE07A7RDUovy45_pOoWcjby6yr5upo6At8Jlg2BPhWDXO2k&redirect_uri=https%3A%2F%2Fsponsor.ajay.app%2Fapi%2FgenerateToken%2Fpatreon"
class="option-link" target="_blank" rel="noreferrer">
<div class="option-button inline">
__MSG_patreonSignIn__
</div>
</a>
</div>
<div class="center">
<p id="cantAfford" class="smaller no-margin">
</p>
</div>
<div class="center">
<p class="smaller no-margin">
__MSG_alreadyDonated__ sponsorblock-free@ajay.app
</p>
</div>
<div id="subsidizedPrice" class="center hidden">
__MSG_selectYourCountry__
</div>
<div id="subsidizedLink" class="center hidden">
<a href="https://buy.ajay.app/l/sponsorblock/purchasing-power" class="option-link" target="_blank"
rel="noreferrer">
<div class="option-button inline">
__MSG_discountLink__
</div>
</a>
</div>
<div id="noSubsidizedLink" class="center hidden">
__MSG_noDiscount__
</div>
</body>

View File

@@ -1,397 +0,0 @@
/* Based on options page CSS */
html {
color-scheme: dark;
}
body {
font-family: sans-serif;
}
.center {
text-align: center;
}
.center p {
margin: auto;
}
.inline {
display: inline-block;
}
.bold {
font-weight: bold;
}
.hidden {
display: none !important;
}
.row-item {
margin-top: 10px;
margin-bottom: 10px;
}
.keybind-status {
display: inline;
}
.small-description {
color: white;
font-size: 13px;
}
.medium-description {
color: white;
font-size: 15px;
}
.option-text-box {
width: 300px;
}
.option-button {
cursor: pointer;
background-color: #c00000;
padding: 10px;
color: white;
border-radius: 5px;
font-size: 14px;
width: max-content;
}
.option-link {
text-decoration: none;
}
.option-link.side-by-side {
padding: 50px;
}
.option-button:hover {
background-color: #fc0303;
}
.option-button.disabled {
cursor: default;
background-color: #520000;
color: grey;
}
#options {
max-width: 60%;
text-align: left;
display: inline-block;
}
.switch-container:after {
content: attr(label-name);
position: absolute;
padding: 4px;
width: max-content;
font-size: 14px;
color: white;
}
.text-label-container {
font-size: 14px;
color: white;
}
.switch {
position: relative;
display: inline-block;
width: 40px;
height: 24px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #707070;
}
.animated * {
-webkit-transition: .4s;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 16px;
width: 16px;
left: 4px;
bottom: 4px;
background-color: white;
}
.animated .slider:before {
-webkit-transition: .4s;
transition: .4s;
}
input:checked + .slider {
background-color: #fc0303;
}
input:checked + .slider:before {
-webkit-transform: translateX(16px);
-ms-transform: translateX(16px);
transform: translateX(16px);
}
/* Rounded sliders */
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
/* Boilerplate CSS from https://ajay.app */
body {
background-color: #333333;
}
.projectPreview {
position: relative;
}
.projectPreviewImage {
position: absolute;
left: -90px;
width: 80px;
top: 50%;
transform: translateY(-50%);
}
.projectPreviewImageLarge {
position: absolute;
left: -210px;
width: 200px;
top: 50%;
transform: translateY(-20%);
}
.projectPreviewImageLargeRight {
position: absolute;
right: -210px;
width: 200px;
top: 50%;
transform: translateY(-50%);
}
.createdBy {
font-size: 14px;
text-align: center;
padding-top: 0px;
padding-bottom: 0px;
display: inline-block;
}
#title {
background-color: #636363;
text-align: center;
vertical-align: middle;
font-size: 50px;
color: #212121;
padding: 20px;
text-decoration: none;
transition: font-size 1s;
}
.subtitle {
font-size: 40px;
color: #dad8d8;
padding-top: 10px;
transition: font-size 0.4s;
}
.subtitle:hover {
font-size: 45px;
transition: font-size 0.4s;
}
.profilepic {
background-color: #636363 !important;
vertical-align: middle;
}
.profilepiccircle {
vertical-align: middle;
overflow: hidden;
border-radius: 50%;
}
a {
text-decoration: underline;
color: inherit;
}
.link {
padding: 20px;
height: 80px;
transition: height 0.2s;
}
.link:hover {
height: 95px;
transition: height 0.2s;
}
#contact,.smalllink {
font-size: 25px;
color: #e8e8e8;
text-align: center;
padding: 10px;
}
#contact {
text-decoration: none;
}
p,li {
font-size: 20px;
color: #c4c4c4;
padding: 10px;
}
.smaller {
font-size: 12px;
text-align: center;
}
.no-margin {
padding: 0;
margin: 0;
}
p,li,code,a {
max-width: 60%;
text-align: left;
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;
}
}
.previewImage {
max-height: 200px;
}
img {
max-width: 100%;
text-align: center;
}
#recentPostTitle {
font-size: 30px;
color: #dad8d8;
}
#recentPostDate {
font-size: 15px;
color: #dad8d8;
}
h1,h2,h3,h4,h5,h6 {
color: #dad8d8;
}
svg {
text-decoration: none;
}
.number-container:before {
content: attr(label-name);
padding-right: 4px;
width: max-content;
font-size: 14px;
color: white;
}
/* React styles */
.categoryTableElement {
font-size: 16px;
color: white;
}
.categoryTableElement > * {
padding-right: 15px;
padding-bottom: 15px;
}
.optionsSelector {
background-color: #c00000;
color: white;
border: none;
font-size: 14px;
padding: 5px;
border-radius: 5px;
}
.categoryColorTextBox {
width: 60px;
background: none;
border: none;
}
#subsidizedPrice {
margin-top: 5px;
margin-bottom: 5px;
}
#discountButton {
text-decoration: underline;
cursor: pointer;
}

View File

@@ -38,9 +38,6 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
case "openHelp":
chrome.tabs.create({url: chrome.runtime.getURL('help/index.html')});
return false;
case "openUpsell":
chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')});
return false;
case "openPage":
chrome.tabs.create({url: chrome.runtime.getURL(request.url)});
return false;
@@ -82,6 +79,20 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
}
});
chrome.runtime.onMessageExternal.addListener((request, sender, callback) => {
if (CompileConfig.extensionCommunicationAllowList.includes(sender.id)) {
if (request.message === "requestConfig") {
callback({
userID: Config.config.userID,
allowExpirements: Config.config.allowExpirements,
showDonationLink: Config.config.showDonationLink,
showUpsells: Config.config.showUpsells,
darkMode: Config.config.darkMode,
})
}
}
});
chrome.runtime.onConnect.addListener((port) => {
if (port.name === "popup") {
chrome.tabs.query({

View File

@@ -7,8 +7,8 @@ import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
import { VoteResponse } from "../messageTypes";
import { AnimationUtils } from "../utils/animationUtils";
import { GenericUtils } from "../utils/genericUtils";
import { Tooltip } from "../render/Tooltip";
import { getErrorMessage } from "@ajayyy/maze-utils/lib/formating";
export interface CategoryPillProps {
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
@@ -43,7 +43,7 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
return (
<span style={style}
className={"sponsorBlockCategoryPill"}
className={"sponsorBlockCategoryPill"}
aria-label={this.getTitleText()}
onClick={(e) => this.toggleOpen(e)}
onMouseEnter={() => this.openTooltip()}
@@ -104,39 +104,26 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
await stopAnimation();
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
this.setState({
open: false,
this.setState({
open: false,
show: type === 1
});
} else if (response.statusCode !== 403) {
alert(GenericUtils.getErrorMessage(response.statusCode, response.responseText));
alert(getErrorMessage(response.statusCode, response.responseText));
}
}
}
private getColor(): string {
const configObject = Config.config.barTypes["preview-" + this.state.segment?.category]
|| Config.config.barTypes[this.state.segment?.category];
return configObject?.color;
// Handled by setCategoryColorCSSVariables() of content.ts
const category = this.state.segment?.category;
return category == null ? null : `var(--sb-category-preview-${category}, var(--sb-category-${category}))`;
}
private getTextColor(): string {
const color = this.getColor();
if (!color) return null;
const existingCalculatedColor = Config.config.categoryPillColors[this.state.segment?.category];
if (existingCalculatedColor && existingCalculatedColor.lastColor === color) {
return existingCalculatedColor.textColor;
} else {
const luminance = GenericUtils.getLuminance(color);
const textColor = luminance > 128 ? "black" : "white";
Config.config.categoryPillColors[this.state.segment?.category] = {
lastColor: color,
textColor
};
return textColor;
}
// Handled by setCategoryColorCSSVariables() of content.ts
const category = this.state.segment?.category;
return category == null ? null : `var(--sb-category-text-preview-${category}, var(--sb-category-text-${category}))`;
}
private openTooltip(): void {

View File

@@ -1,14 +1,14 @@
import * as React from "react";
import Config from "../config";
import { Category, SegmentUUID, SponsorTime } from "../types";
import { ActionType, Category, SegmentUUID, SponsorTime } from "../types";
import ThumbsUpSvg from "../svg-icons/thumbs_up_svg";
import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
import { VoteResponse } from "../messageTypes";
import { AnimationUtils } from "../utils/animationUtils";
import { GenericUtils } from "../utils/genericUtils";
import { Tooltip } from "../render/Tooltip";
import { getErrorMessage } from "@ajayyy/maze-utils/lib/formating";
export interface ChapterVoteProps {
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
@@ -65,35 +65,39 @@ class ChapterVoteComponent extends React.Component<ChapterVoteProps, ChapterVote
this.tooltip.close();
this.tooltip = null;
} else {
const referenceNode = chapterNode?.parentElement?.parentElement;
if (referenceNode) {
const outerBounding = referenceNode.getBoundingClientRect();
const buttonBounding = (e.target as HTMLElement)?.parentElement?.getBoundingClientRect();
this.tooltip = new Tooltip({
referenceNode: chapterNode?.parentElement?.parentElement,
prependElement: chapterNode?.parentElement,
showLogo: false,
showGotIt: false,
bottomOffset: `${outerBounding.height + 25}px`,
leftOffset: `${buttonBounding.x - outerBounding.x}px`,
extraClass: "centeredSBTriangle",
buttons: [
{
name: chrome.i18n.getMessage("incorrectVote"),
listener: (event) => this.vote(event, 0, e.target as HTMLElement).then(() => {
this.tooltip?.close();
this.tooltip = null;
})
}, {
name: chrome.i18n.getMessage("harmfulVote"),
listener: (event) => this.vote(event, 30, e.target as HTMLElement).then(() => {
this.tooltip?.close();
this.tooltip = null;
})
}
]
});
if (this.state.segment?.actionType === ActionType.Chapter) {
const referenceNode = chapterNode?.parentElement?.parentElement;
if (referenceNode) {
const outerBounding = referenceNode.getBoundingClientRect();
const buttonBounding = (e.target as HTMLElement)?.parentElement?.getBoundingClientRect();
this.tooltip = new Tooltip({
referenceNode: chapterNode?.parentElement?.parentElement,
prependElement: chapterNode?.parentElement,
showLogo: false,
showGotIt: false,
bottomOffset: `${outerBounding.height + 25}px`,
leftOffset: `${buttonBounding.x - outerBounding.x}px`,
extraClass: "centeredSBTriangle",
buttons: [
{
name: chrome.i18n.getMessage("incorrectVote"),
listener: (event) => this.vote(event, 0, e.target as HTMLElement).then(() => {
this.tooltip?.close();
this.tooltip = null;
})
}, {
name: chrome.i18n.getMessage("harmfulVote"),
listener: (event) => this.vote(event, 30, e.target as HTMLElement).then(() => {
this.tooltip?.close();
this.tooltip = null;
})
}
]
});
}
} else {
this.vote(e, 0, e.target as HTMLElement)
}
}
}}>
@@ -120,7 +124,7 @@ class ChapterVoteComponent extends React.Component<ChapterVoteProps, ChapterVote
show: type === 1
});
} else if (response.statusCode !== 403) {
alert(GenericUtils.getErrorMessage(response.statusCode, response.responseText));
alert(getErrorMessage(response.statusCode, response.responseText));
}
}
}

View File

@@ -195,7 +195,7 @@ class NoticeComponent extends React.Component<NoticeProps, NoticeState> {
id={"skipNoticeTimerText" + this.idSuffix}
key="skipNoticeTimerText"
className={this.state.countdownMode !== CountdownMode.Timer ? "hidden" : ""} >
{this.state.countdownTime + "s"}
{chrome.i18n.getMessage("NoticeTimeAfterSkip").replace("{seconds}", this.state.countdownTime.toString())}
</span>
),(
<img

View File

@@ -7,13 +7,13 @@ import NoticeTextSelectionComponent from "./NoticeTextSectionComponent";
import Utils from "../utils";
const utils = new Utils();
import { getSkippingText } from "../utils/categoryUtils";
import { keybindToString } from "../utils/configUtils";
import ThumbsUpSvg from "../svg-icons/thumbs_up_svg";
import ThumbsDownSvg from "../svg-icons/thumbs_down_svg";
import PencilSvg from "../svg-icons/pencil_svg";
import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
import { generateUserID } from "@ajayyy/maze-utils/lib/setup";
import { keybindToString } from "@ajayyy/maze-utils/lib/config";
enum SkipButtonState {
Undo, // Unskip

View File

@@ -6,7 +6,6 @@ import Utils from "../utils";
import SubmissionNoticeComponent from "./SubmissionNoticeComponent";
import { RectangleTooltip } from "../render/RectangleTooltip";
import SelectorComponent, { SelectorOption } from "./SelectorComponent";
import { noRefreshFetchingChaptersAllowed } from "../utils/licenseKey";
import { DEFAULT_CATEGORY } from "../utils/categoryUtils";
import { getFormattedTime, getFormattedTimeToSeconds } from "@ajayyy/maze-utils/lib/formating";
@@ -420,7 +419,7 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
// If permission not loaded, treat it like we have permission except chapter
const defaultBlockCategories = ["chapter"];
const permission = (Config.config.showCategoryWithoutPermission
|| Config.config.permissions[category as Category]) && (category !== "chapter" || noRefreshFetchingChaptersAllowed());
|| Config.config.permissions[category as Category]);
if ((defaultBlockCategories.includes(category)
|| (permission !== undefined && !Config.config.showCategoryWithoutPermission)) && !permission) continue;
@@ -687,13 +686,13 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
descriptionUpdate(description: string): void {
this.setState({
description
}, () => {
this.saveEditTimes();
});
if (!this.fetchingSuggestions) {
this.fetchSuggestions(description);
}
this.saveEditTimes();
}
async fetchSuggestions(description: string): Promise<void> {

View File

@@ -6,8 +6,6 @@ import { Category, CategorySkipOption } from "../../types";
import { getCategorySuffix } from "../../utils/categoryUtils";
import ToggleOptionComponent from "./ToggleOptionComponent";
import { fetchingChaptersAllowed } from "../../utils/licenseKey";
import LockSvg from "../../svg-icons/lock_svg";
export interface CategorySkipOptionsProps {
category: Category;
@@ -19,7 +17,6 @@ export interface CategorySkipOptionsProps {
export interface CategorySkipOptionsState {
color: string;
previewColor: string;
hideChapter: boolean;
}
export interface ToggleOption {
@@ -37,29 +34,11 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
// Setup state
this.state = {
color: props.defaultColor || Config.config.barTypes[this.props.category]?.color,
previewColor: props.defaultPreviewColor || Config.config.barTypes["preview-" + this.props.category]?.color,
hideChapter: true
previewColor: props.defaultPreviewColor || Config.config.barTypes["preview-" + this.props.category]?.color
};
fetchingChaptersAllowed().then((allowed) => {
this.setState({
hideChapter: !allowed
});
});
}
render(): React.ReactElement {
if (this.state.hideChapter) {
// Ensure force update refreshes this
fetchingChaptersAllowed().then((allowed) => {
if (allowed) {
this.setState({
hideChapter: !allowed
});
}
});
}
let defaultOption = "disable";
// Set the default opton properly
for (const categorySelection of Config.config.categorySelections) {
@@ -80,20 +59,10 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
}
}
let extraClasses = "";
const disabled = this.props.category === "chapter" && this.state.hideChapter;
if (disabled) {
extraClasses += " disabled";
if (!Config.config.showUpsells) {
return <></>;
}
}
return (
<>
<tr id={this.props.category + "OptionsRow"}
className={`categoryTableElement${extraClasses}`} >
className={`categoryTableElement`} >
<td id={this.props.category + "OptionName"}
className="categoryTableLabel">
{chrome.i18n.getMessage("category_" + this.props.category)}
@@ -104,14 +73,9 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
<select
className="optionsSelector"
defaultValue={defaultOption}
disabled={disabled}
onChange={this.skipOptionSelected.bind(this)}>
{this.getCategorySkipOptions()}
</select>
{disabled &&
<LockSvg className="upsellButton" onClick={() => chrome.tabs.create({url: chrome.runtime.getURL('upsell/index.html')})}/>
}
</td>
{this.props.category !== "chapter" &&
@@ -120,7 +84,6 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
<input
className="categoryColorTextBox option-text-box"
type="color"
disabled={disabled}
onChange={(event) => this.setColorState(event, false)}
value={this.state.color} />
</td>
@@ -140,7 +103,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
</tr>
<tr id={this.props.category + "DescriptionRow"}
className={`small-description categoryTableDescription${extraClasses}`}>
className={`small-description categoryTableDescription`}>
<td
colSpan={2}>
{chrome.i18n.getMessage("category_" + this.props.category + "_description")}
@@ -151,7 +114,7 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
</td>
</tr>
{this.getExtraOptionComponents(this.props.category, extraClasses, disabled)}
{this.getExtraOptionComponents(this.props.category)}
</>
);
@@ -235,16 +198,15 @@ class CategorySkipOptionsComponent extends React.Component<CategorySkipOptionsPr
}, 50);
}
getExtraOptionComponents(category: string, extraClasses: string, disabled: boolean): JSX.Element[] {
getExtraOptionComponents(category: string): JSX.Element[] {
const result = [];
for (const option of this.getExtraOptions(category)) {
result.push(
<tr key={option.configKey} className={extraClasses}>
<tr key={option.configKey}>
<td id={`${category}_${option.configKey}`} className="categoryExtraOptions">
<ToggleOptionComponent
configKey={option.configKey}
label={option.label}
disabled={!option.dontDisable && disabled}
style={{width: "inherit"}}
/>
</td>

View File

@@ -1,9 +1,8 @@
import * as React from "react";
import { createRoot, Root } from 'react-dom/client';
import Config from "../../config";
import { Keybind } from "../../types";
import KeybindDialogComponent from "./KeybindDialogComponent";
import { keybindEquals, keybindToString, formatKey } from "../../utils/configUtils";
import { formatKey, Keybind, keybindEquals, keybindToString } from "@ajayyy/maze-utils/lib/config";
export interface KeybindProps {
option: string;

View File

@@ -1,8 +1,7 @@
import * as React from "react";
import { ChangeEvent } from "react";
import Config from "../../config";
import { Keybind } from "../../types";
import { keybindEquals, formatKey } from "../../utils/configUtils";
import { Keybind, formatKey, keybindEquals } from "@ajayyy/maze-utils/lib/config";
export interface KeybindDialogProps {
option: string;

View File

@@ -1,8 +1,7 @@
import * as CompileConfig from "../config.json";
import * as invidiousList from "../ci/invidiouslist.json";
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, Keybind, VideoID, SponsorHideType } from "./types";
import { keybindEquals } from "./utils/configUtils";
import { ProtoConfig } from "@ajayyy/maze-utils/lib/config";
import { Category, CategorySelection, CategorySkipOption, NoticeVisbilityMode, PreviewBarOption, SponsorTime, VideoID, SponsorHideType } from "./types";
import { Keybind, ProtoConfig, keybindEquals } from "@ajayyy/maze-utils/lib/config";
import { HashedValue } from "@ajayyy/maze-utils/lib/hash";
export interface Permission {
@@ -27,6 +26,7 @@ interface SBConfig {
disableSkipping: boolean;
muteSegments: boolean;
fullVideoSegments: boolean;
fullVideoLabelsOnThumbnails: boolean;
manualSkipOnFullVideo: boolean;
trackViewCount: boolean;
trackViewCountInPrivate: boolean;
@@ -144,6 +144,19 @@ class ConfigClass extends ProtoConfig<SBConfig, SBStorage> {
}
function migrateOldSyncFormats(config: SBConfig) {
if (!config["chapterCategoryAdded"]) {
config["chapterCategoryAdded"] = true;
if (!config.categorySelections.some((s) => s.name === "chapter")) {
config.categorySelections.push({
name: "chapter" as Category,
option: CategorySkipOption.ShowOverlay
});
config.categorySelections = config.categorySelections;
}
}
if (config["segmentTimes"]) {
const unsubmittedSegments = {};
for (const item of config["segmentTimes"]) {
@@ -153,15 +166,8 @@ function migrateOldSyncFormats(config: SBConfig) {
chrome.storage.sync.remove("segmentTimes", () => config.unsubmittedSegments = unsubmittedSegments);
}
if (!config["exclusive_accessCategoryAdded"] && !config.categorySelections.some((s) => s.name === "exclusive_access")) {
config["exclusive_accessCategoryAdded"] = true;
config.categorySelections.push({
name: "exclusive_access" as Category,
option: CategorySkipOption.ShowOverlay
});
config.categorySelections = config.categorySelections;
if (config["exclusive_accessCategoryAdded"] !== undefined) {
chrome.storage.sync.remove("exclusive_accessCategoryAdded");
}
if (config["fillerUpdate"] !== undefined) {
@@ -258,6 +264,7 @@ const syncDefaults = {
disableSkipping: false,
muteSegments: true,
fullVideoSegments: true,
fullVideoLabelsOnThumbnails: true,
manualSkipOnFullVideo: false,
trackViewCount: true,
trackViewCountInPrivate: true,
@@ -323,6 +330,9 @@ const syncDefaults = {
}, {
name: "exclusive_access" as Category,
option: CategorySkipOption.ShowOverlay
}, {
name: "chapter" as Category,
option: CategorySkipOption.ShowOverlay
}],
payments: {

View File

@@ -6,7 +6,6 @@ import {
ChannelIDInfo,
ChannelIDStatus,
ContentContainer,
Keybind,
ScheduledTime,
SegmentUUID,
SkipToTimeParams,
@@ -26,7 +25,6 @@ import { Message, MessageResponse, VoteResponse } from "./messageTypes";
import { SkipButtonControlBar } from "./js-components/skipButtonControlBar";
import { getStartTimeFromUrl } from "./utils/urlParser";
import { getControls, getExistingChapters, getHashParams, isVisible } from "./utils/pageUtils";
import { isSafari, keybindEquals } from "./utils/configUtils";
import { CategoryPill } from "./render/CategoryPill";
import { AnimationUtils } from "./utils/animationUtils";
import { GenericUtils } from "./utils/genericUtils";
@@ -34,20 +32,24 @@ import { logDebug } from "./utils/logger";
import { importTimes } from "./utils/exporter";
import { ChapterVote } from "./render/ChapterVote";
import { openWarningDialog } from "./utils/warnings";
import { Tooltip } from "./render/Tooltip";
import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey";
import { waitFor } from "@ajayyy/maze-utils";
import { getFormattedTime } from "@ajayyy/maze-utils/lib/formating";
import { setupVideoMutationListener, getChannelIDInfo, getVideo, refreshVideoAttachments, getIsAdPlaying, getIsLivePremiere, setIsAdPlaying, checkVideoIDChange, getVideoID, getYouTubeVideoID, setupVideoModule, checkIfNewVideoID, isOnInvidious, isOnMobileYouTube } from "@ajayyy/maze-utils/lib/video";
import { StorageChangesObject } from "@ajayyy/maze-utils/lib/config";
import { isFirefoxOrSafari, waitFor } from "@ajayyy/maze-utils";
import { getErrorMessage, getFormattedTime } from "@ajayyy/maze-utils/lib/formating";
import { getChannelIDInfo, getVideo, getIsAdPlaying, getIsLivePremiere, setIsAdPlaying, checkVideoIDChange, getVideoID, getYouTubeVideoID, setupVideoModule, checkIfNewVideoID, isOnInvidious, isOnMobileYouTube } from "@ajayyy/maze-utils/lib/video";
import { Keybind, StorageChangesObject, isSafari, keybindEquals } from "@ajayyy/maze-utils/lib/config";
import { findValidElement } from "@ajayyy/maze-utils/lib/dom"
import { getHash, HashedValue } from "@ajayyy/maze-utils/lib/hash";
import { generateUserID } from "@ajayyy/maze-utils/lib/setup";
import { updateAll } from "@ajayyy/maze-utils/lib/thumbnailManagement";
import { setupThumbnailListener } from "./utils/thumbnails";
import * as documentScript from "../dist/js/document.js";
const utils = new Utils();
// Hack to get the CSS loaded on permission-based sites (Invidious)
utils.wait(() => Config.isReady(), 5000, 10).then(addCSS);
utils.wait(() => Config.isReady(), 5000, 10).then(() => {
// Hack to get the CSS loaded on permission-based sites (Invidious)
addCSS();
setCategoryColorCSSVariables();
});
const skipBuffer = 0.003;
@@ -106,8 +108,10 @@ setupVideoModule({
updatePreviewBar();
updateVisibilityOfPlayerControlsButton();
},
resetValues
resetValues,
documentScript
}, () => Config);
setupThumbnailListener();
//the video id of the last preview bar update
let lastPreviewBarUpdate: VideoID;
@@ -258,7 +262,7 @@ function messageListener(request: Message, sender: unknown, sendResponse: (respo
utils.addHiddenSegment(getVideoID(), request.UUID, request.type);
updatePreviewBar();
if (skipButtonControlBar?.isEnabled()
if (skipButtonControlBar?.isEnabled()
&& sponsorTimesSubmitting.every((s) => s.hidden !== SponsorHideType.Visible || s.actionType !== ActionType.Poi)) {
skipButtonControlBar.disable();
}
@@ -332,6 +336,13 @@ function contentConfigUpdateListener(changes: StorageChangesObject) {
case "categorySelections":
sponsorsLookup();
break;
case "barTypes":
setCategoryColorCSSVariables();
break;
case "fullVideoSegments":
case "fullVideoLabelsOnThumbnails":
updateAll();
break;
}
}
}
@@ -487,7 +498,7 @@ function createPreviewBar(): void {
if (el) {
const chapterVote = new ChapterVote(voteAsync);
previewBar = new PreviewBar(el, isOnMobileYouTube(), isOnInvidious(), chapterVote, () => importExistingChapters(false));
previewBar = new PreviewBar(el, isOnMobileYouTube(), isOnInvidious(), chapterVote, () => importExistingChapters(true));
updatePreviewBar();
@@ -648,6 +659,11 @@ async function startSponsorSchedule(includeIntersectingSegments = false, current
forcedSkipTime = forceVideoTime + 0.001;
}
// Don't pretend to be earlier than we are, could result in loops
if (forcedSkipTime !== null && forceVideoTime > forcedSkipTime) {
forcedSkipTime = null;
}
startSponsorSchedule(forcedIncludeIntersectingSegments, forcedSkipTime, forcedIncludeNonIntersectingSegments);
};
@@ -655,9 +671,9 @@ async function startSponsorSchedule(includeIntersectingSegments = false, current
skippingFunction(currentTime);
} else {
let delayTime = timeUntilSponsor * 1000 * (1 / getVideo().playbackRate);
if (delayTime < 300) {
if (delayTime < (isFirefoxOrSafari() && !isSafari() ? 750 : 300)) {
let forceStartIntervalTime: number | null = null;
if (utils.isFirefox() && !isSafari() && delayTime > 100) {
if (isFirefoxOrSafari() && !isSafari() && delayTime > 300) {
forceStartIntervalTime = await waitForNextTimeChange();
}
@@ -665,15 +681,16 @@ async function startSponsorSchedule(includeIntersectingSegments = false, current
const startIntervalTime = forceStartIntervalTime || performance.now();
const startVideoTime = Math.max(currentTime, getVideo().currentTime);
delayTime = (skipTime?.[0] - startVideoTime) * 1000 * (1 / getVideo().playbackRate);
let startWaitingForReportedTimeToChange = true;
const reportedVideoTimeAtStart = getVideo().currentTime;
logDebug(`Starting setInterval skipping ${getVideo().currentTime} to skip at ${skipTime[0]}`);
if (currentSkipInterval !== null) clearInterval(currentSkipInterval);
currentSkipInterval = setInterval(() => {
// Estimate delay, but only take the current time right after a change
// Current time remains the same for many "frames" on Firefox
if (utils.isFirefox() && !lastKnownVideoTime.fromPause && startWaitingForReportedTimeToChange
if (isFirefoxOrSafari() && !lastKnownVideoTime.fromPause && startWaitingForReportedTimeToChange
&& reportedVideoTimeAtStart !== getVideo().currentTime) {
startWaitingForReportedTimeToChange = false;
const delay = getVirtualTime() - getVideo().currentTime;
@@ -683,7 +700,7 @@ async function startSponsorSchedule(includeIntersectingSegments = false, current
const intervalDuration = performance.now() - startIntervalTime;
if (intervalDuration + skipBuffer * 1000 >= delayTime || getVideo().currentTime >= skipTime[0]) {
clearInterval(currentSkipInterval);
if (!utils.isFirefox() && !getVideo().muted) {
if (!isFirefoxOrSafari() && !getVideo().muted && !inMuteSegment(getVideo().currentTime, true)) {
// Workaround for more accurate skipping on Chromium
getVideo().muted = true;
getVideo().muted = false;
@@ -691,11 +708,11 @@ async function startSponsorSchedule(includeIntersectingSegments = false, current
skippingFunction(Math.max(getVideo().currentTime, startVideoTime + getVideo().playbackRate * Math.max(delayTime, intervalDuration) / 1000));
}
}, 1);
}, 0);
} else {
logDebug(`Starting timeout to skip ${getVideo().currentTime} to skip at ${skipTime[0]}`);
const offset = (utils.isFirefox() && !isSafari ? 300 : 150);
const offset = (isFirefoxOrSafari() && !isSafari() ? 600 : 150);
// Schedule for right before to be more precise than normal timeout
currentSkipSchedule = setTimeout(skippingFunction, Math.max(0, delayTime - offset));
}
@@ -707,23 +724,8 @@ async function startSponsorSchedule(includeIntersectingSegments = false, current
* the video time has changed
*/
function waitForNextTimeChange(): Promise<DOMHighResTimeStamp | null> {
const startVideoTime = getVideo().currentTime;
let tries = 0;
return new Promise((resolve) => {
const callback = (timestamp: DOMHighResTimeStamp) => {
tries++;
if (startVideoTime !== getVideo().currentTime) {
resolve(timestamp);
return;
} else if (tries > 4) {
// Give up
resolve(null);
} else {
requestAnimationFrame(callback);
}
}
requestAnimationFrame(callback);
getVideo().addEventListener("timeupdate", () => resolve(performance.now()), { once: true });
});
}
@@ -731,7 +733,7 @@ function getVirtualTime(): number {
const virtualTime = lastTimeFromWaitingEvent ?? (lastKnownVideoTime.videoTime !== null ?
(performance.now() - lastKnownVideoTime.preciseTime) * getVideo().playbackRate / 1000 + lastKnownVideoTime.videoTime : null);
if (Config.config.useVirtualTime && !isSafari() && virtualTime
if (Config.config.useVirtualTime && !isSafari() && virtualTime
&& Math.abs(virtualTime - getVideo().currentTime) < 0.2 && getVideo().currentTime !== 0) {
return Math.max(virtualTime, getVideo().currentTime);
} else {
@@ -751,12 +753,13 @@ function inMuteSegment(currentTime: number, includeOverlap: boolean): boolean {
*/
function incorrectVideoCheck(videoID?: string, sponsorTime?: SponsorTime): boolean {
const currentVideoID = getYouTubeVideoID();
if (currentVideoID !== (videoID || getVideoID()) || (sponsorTime
const recordedVideoID = videoID || getVideoID();
if (currentVideoID !== recordedVideoID || (sponsorTime
&& (!sponsorTimes || !sponsorTimes?.some((time) => time.segment === sponsorTime.segment))
&& !sponsorTimesSubmitting.some((time) => time.segment === sponsorTime.segment))) {
// Something has really gone wrong
console.error("[SponsorBlock] The videoID recorded when trying to skip is different than what it should be.");
console.error("[SponsorBlock] VideoID recorded: " + getVideoID() + ". Actual VideoID: " + currentVideoID);
console.error("[SponsorBlock] VideoID recorded: " + recordedVideoID + ". Actual VideoID: " + currentVideoID);
// Video ID change occured
checkVideoIDChange();
@@ -848,7 +851,12 @@ function setupVideoListeners() {
updateVirtualTime();
clearWaitingTime();
startSponsorSchedule();
// Sometimes looped videos loop back to almost zero, but not quite
if (getVideo().loop && getVideo().currentTime < 0.2) {
startSponsorSchedule(false, 0);
} else {
startSponsorSchedule();
}
} else {
updateActiveSegment(getVideo().currentTime);
@@ -904,7 +912,7 @@ function updateVirtualTime() {
lastKnownVideoTime.preciseTime = performance.now();
// If on Firefox, wait for the second time change (time remains fixed for many "frames" for privacy reasons)
if (utils.isFirefox()) {
if (isFirefoxOrSafari()) {
let count = 0;
let rawCount = 0;
let lastTime = lastKnownVideoTime.videoTime;
@@ -914,7 +922,7 @@ function updateVirtualTime() {
const frameTime = performance.now() - lastPerformanceTime;
if (lastTime !== getVideo().currentTime) {
rawCount++;
// If there is lag, give it another shot at finding a good change time
if (frameTime < 20 || rawCount > 30) {
count++;
@@ -923,12 +931,12 @@ function updateVirtualTime() {
}
if (count > 1) {
const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ?
const delay = lastKnownVideoTime.fromPause && lastKnownVideoTime.approximateDelay ?
lastKnownVideoTime.approximateDelay : 0;
lastKnownVideoTime.videoTime = getVideo().currentTime + delay;
lastKnownVideoTime.preciseTime = performance.now();
clearInterval(currentVirtualTimeInterval);
currentVirtualTimeInterval = null;
}
@@ -973,7 +981,6 @@ function setupCategoryPill() {
async function sponsorsLookup(keepOldSubmissions = true) {
if (lookupWaiting) return;
if (!getVideo() || !isVisible(getVideo())) refreshVideoAttachments();
//there is still no video here
if (!getVideo()) {
lookupWaiting = true;
@@ -984,38 +991,7 @@ async function sponsorsLookup(keepOldSubmissions = true) {
return;
}
setupVideoMutationListener();
const showChapterMessage = Config.config.showUpsells
&& Config.config.payments.lastCheck !== 0
&& !noRefreshFetchingChaptersAllowed()
&& Config.config.showChapterInfoMessage
&& Config.config.skipCount > 200;
if (!showChapterMessage
&& Config.config.showChapterInfoMessage
&& Config.config.payments.freeAccess) {
Config.config.showChapterInfoMessage = false;
if (!utils.getCategorySelection("chapter")) {
const prependElement = document.querySelector(".ytp-chrome-bottom") as HTMLElement;
if (prependElement) {
Config.config.showChapterInfoMessage = false;
new Tooltip({
text: chrome.i18n.getMessage("chapterNewFeature2"),
linkOnClick: () => void chrome.runtime.sendMessage({ "message": "openConfig" }),
referenceNode: prependElement.parentElement,
prependElement,
timeout: 1500,
leftOffset: "20px",
positionRealtive: false
});
}
}
}
const categories: string[] = Config.config.categorySelections.map((category) => category.name);
if (showChapterMessage && !categories.includes("chapter")) categories.push("chapter");
const extraRequestData: Record<string, unknown> = {};
const hashParams = getHashParams();
@@ -1024,7 +1000,7 @@ async function sponsorsLookup(keepOldSubmissions = true) {
const hashPrefix = (await getHash(getVideoID(), 1)).slice(0, 4) as VideoID & HashedValue;
const response = await utils.asyncRequestToServer('GET', "/api/skipSegments/" + hashPrefix, {
categories,
actionTypes: getEnabledActionTypes(showChapterMessage),
actionTypes: getEnabledActionTypes(),
userAgent: `${chrome.runtime.id}`,
...extraRequestData
});
@@ -1033,7 +1009,7 @@ async function sponsorsLookup(keepOldSubmissions = true) {
lastResponseStatus = response?.status;
if (response?.ok) {
let recievedSegments: SponsorTime[] = JSON.parse(response.responseText)
const receivedSegments: SponsorTime[] = JSON.parse(response.responseText)
?.filter((video) => video.videoID === getVideoID())
?.map((video) => video.segments)?.[0]
?.map((segment) => ({
@@ -1041,44 +1017,23 @@ async function sponsorsLookup(keepOldSubmissions = true) {
source: SponsorSourceType.Server
}))
?.sort((a, b) => a.segment[0] - b.segment[0]);
if (recievedSegments && recievedSegments.length) {
if (showChapterMessage) {
const chapterSegments = recievedSegments.filter((s) => s.actionType === ActionType.Chapter);
if (chapterSegments.length > 3) {
const prependElement = document.querySelector(".ytp-chrome-bottom") as HTMLElement;
if (prependElement) {
Config.config.showChapterInfoMessage = false;
new Tooltip({
text: `🟨${chrome.i18n.getMessage("chapterNewFeature")}${chapterSegments.slice(0, 3).map((s) => s.description).join(", ")}`,
linkOnClick: () => void chrome.runtime.sendMessage({ "message": "openUpsell" }),
referenceNode: prependElement.parentElement,
prependElement,
timeout: 1500,
leftOffset: "20px",
positionRealtive: false
});
}
}
recievedSegments = recievedSegments.filter((s) => s.actionType !== ActionType.Chapter);
}
if (receivedSegments && receivedSegments.length) {
sponsorDataFound = true;
// Check if any old submissions should be kept
if (sponsorTimes !== null && keepOldSubmissions) {
for (let i = 0; i < sponsorTimes.length; i++) {
if (sponsorTimes[i].source === SponsorSourceType.Local) {
// This is a user submission, keep it
recievedSegments.push(sponsorTimes[i]);
receivedSegments.push(sponsorTimes[i]);
}
}
}
const oldSegments = sponsorTimes || [];
sponsorTimes = recievedSegments;
sponsorTimes = receivedSegments;
existingChaptersImported = false;
// Hide all submissions smaller than the minimum duration
if (Config.config.minDuration !== 0) {
for (const segment of sponsorTimes) {
@@ -1088,7 +1043,7 @@ async function sponsorsLookup(keepOldSubmissions = true) {
}
}
}
if (keepOldSubmissions) {
for (const segment of oldSegments) {
const otherSegment = sponsorTimes.find((other) => segment.UUID === other.UUID);
@@ -1099,7 +1054,7 @@ async function sponsorsLookup(keepOldSubmissions = true) {
}
}
}
// See if some segments should be hidden
const downvotedData = Config.local.downvotedSegments[hashPrefix];
if (downvotedData) {
@@ -1111,9 +1066,9 @@ async function sponsorsLookup(keepOldSubmissions = true) {
}
}
}
startSkipScheduleCheckingForStartSponsors();
//update the preview bar
//leave the type blank for now until categories are added
if (lastPreviewBarUpdate == getVideoID() || (lastPreviewBarUpdate == null && !isNaN(getVideo().duration))) {
@@ -1223,7 +1178,7 @@ function retryFetch(errorCode: number): void {
*/
function startSkipScheduleCheckingForStartSponsors() {
// switchingVideos is ignored in Safari due to event fire order. See #1142
if ((!switchingVideos || isSafari) && sponsorTimes) {
if ((!switchingVideos || isSafari()) && sponsorTimes) {
// See if there are any starting sponsors
let startingSegmentTime = getStartTimeFromUrl(document.URL) || -1;
let found = false;
@@ -1248,7 +1203,7 @@ function startSkipScheduleCheckingForStartSponsors() {
// For highlight category
const poiSegments = sponsorTimes
.filter((time) => time.segment[1] > getVideo().currentTime
.filter((time) => time.segment[1] > getVideo().currentTime
&& time.actionType === ActionType.Poi && time.hidden === SponsorHideType.Visible)
.sort((a, b) => b.segment[0] - a.segment[0]);
for (const time of poiSegments) {
@@ -1365,12 +1320,21 @@ function videoElementChange(newVideo: boolean): void {
setupCategoryPill();
}
checkPreviewbarState();
// Incase the page is still transitioning, check again in a few seconds
setTimeout(checkPreviewbarState, 100);
setTimeout(checkPreviewbarState, 1000);
setTimeout(checkPreviewbarState, 5000);
}
function checkPreviewbarState(): void {
if (previewBar && !utils.findReferenceNode()?.contains(previewBar.container)) {
previewBar.remove();
previewBar = null;
createPreviewBar();
}
createPreviewBar();
}
/**
@@ -1497,7 +1461,8 @@ function getStartTimes(sponsorTimes: SponsorTime[], includeIntersectingSegments:
const shouldIncludeTime = (segment: ScheduledTime ) => (minimum === undefined
|| ((includeNonIntersectingSegments && segment.scheduledTime >= minimum)
|| (includeIntersectingSegments && segment.scheduledTime < minimum && segment.segment[1] > minimum)))
|| (includeIntersectingSegments && segment.scheduledTime < minimum
&& segment.segment[1] > minimum && shouldSkip(segment)))) // Only include intersecting skippable segments
&& (!hideHiddenSponsors || segment.hidden === SponsorHideType.Visible)
&& segment.segment.length === 2
&& segment.actionType !== ActionType.Poi;
@@ -1584,6 +1549,12 @@ function skipToTime({v, skipTime, skippingSegments, openNotice, forceAutoSkip, u
// MacOS will loop otherwise #1027
v.currentTime = v.duration - 0.001;
} else {
if (inMuteSegment(skipTime[1], true)) {
// Make sure not to mute if skipping into a mute segment
v.muted = true;
videoMuted = true;
}
v.currentTime = skipTime[1];
}
@@ -1737,7 +1708,7 @@ function shouldSkip(segment: SponsorTime): boolean {
return (segment.actionType !== ActionType.Full
&& segment.source !== SponsorSourceType.YouTube
&& utils.getCategorySelection(segment.category)?.option !== CategorySkipOption.ShowOverlay)
|| (Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic")
|| (Config.config.autoSkipOnMusicVideos && sponsorTimes?.some((s) => s.category === "music_offtopic")
&& segment.actionType === ActionType.Skip);
}
@@ -1869,7 +1840,7 @@ function startOrEndTimingNewSegment() {
importExistingChapters(false);
if (lastResponseStatus !== 200 && lastResponseStatus !== 404
if (lastResponseStatus !== 200 && lastResponseStatus !== 404
&& !shownSegmentFailedToFetchWarning && Config.config.showSegmentFailedToFetchWarning) {
alert(chrome.i18n.getMessage("segmentFetchFailureWarning"));
@@ -1972,7 +1943,7 @@ function openInfoMenu() {
}
const parentNodeOptions = [{
// YouTube
// YouTube
selector: "#secondary-inner",
hasChildCheck: true
}, {
@@ -2045,7 +2016,7 @@ async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNo
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a warning from a moderator.")) {
openWarningDialog(skipNoticeContentContainer);
} else {
skipNotice.setNoticeInfoMessage.bind(skipNotice)(GenericUtils.getErrorMessage(response.statusCode, response.responseText))
skipNotice.setNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode, response.responseText))
}
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
@@ -2199,10 +2170,10 @@ async function sendSubmitMessage() {
const newSegments = sponsorTimesSubmitting;
try {
const recievedNewSegments = JSON.parse(response.responseText);
if (recievedNewSegments?.length === newSegments.length) {
for (let i = 0; i < recievedNewSegments.length; i++) {
newSegments[i].UUID = recievedNewSegments[i].UUID;
const receivedNewSegments = JSON.parse(response.responseText);
if (receivedNewSegments?.length === newSegments.length) {
for (let i = 0; i < receivedNewSegments.length; i++) {
newSegments[i].UUID = receivedNewSegments[i].UUID;
newSegments[i].source = SponsorSourceType.Server;
}
}
@@ -2235,7 +2206,7 @@ async function sendSubmitMessage() {
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a warning from a moderator.")) {
openWarningDialog(skipNoticeContentContainer);
} else {
alert(GenericUtils.getErrorMessage(response.status, response.responseText));
alert(getErrorMessage(response.status, response.responseText));
}
}
}
@@ -2377,7 +2348,7 @@ function hotkeyListener(e: KeyboardEvent): void {
* Adds the CSS to the page if needed. Required on optional sites with Chrome.
*/
function addCSS() {
if (!utils.isFirefox() && Config.config.invidiousInstances.includes(new URL(document.URL).host)) {
if (!isFirefoxOrSafari() && Config.config.invidiousInstances.includes(new URL(document.URL).host)) {
window.addEventListener("DOMContentLoaded", () => {
const head = document.getElementsByTagName("head")[0];
@@ -2407,14 +2378,15 @@ function updateAdFlag(): void {
}
function showTimeWithoutSkips(skippedDuration: number): void {
if (isOnInvidious()) return;
if (isNaN(skippedDuration) || skippedDuration < 0) {
skippedDuration = 0;
}
// YouTube player time display
const displayClass = isOnMobileYouTube() ? "ytm-time-display" : "ytp-time-display.notranslate"
const displayClass =
isOnInvidious() ? "vjs-duration" :
isOnMobileYouTube() ? "ytm-time-display" :
"ytp-time-display.notranslate";
const display = document.querySelector(`.${displayClass}`);
if (!display) return;
@@ -2425,7 +2397,7 @@ function showTimeWithoutSkips(skippedDuration: number): void {
if (duration === null) {
duration = document.createElement('span');
duration.id = durationID;
duration.classList.add(displayClass);
if (!isOnInvidious()) duration.classList.add(displayClass);
display.appendChild(duration);
}
@@ -2466,4 +2438,27 @@ function checkForPreloadedSegment() {
Config.config.unsubmittedSegments[getVideoID()] = sponsorTimesSubmitting;
Config.forceSyncUpdate("unsubmittedSegments");
}
}
}
// Generate and inject a stylesheet that creates CSS variables with configured category colors
function setCategoryColorCSSVariables() {
let styleContainer = document.getElementById("sbCategoryColorStyle");
if (!styleContainer) {
styleContainer = document.createElement("style");
styleContainer.id = "sbCategoryColorStyle";
document.head.appendChild(styleContainer)
}
let css = ":root {"
for (const [category, config] of Object.entries(Config.config.barTypes)) {
css += `--sb-category-${category}: ${config.color};`;
css += `--darkreader-bg--sb-category-${category}: ${config.color};`;
const luminance = GenericUtils.getLuminance(config.color);
css += `--sb-category-text-${category}: ${luminance > 128 ? "black" : "white"};`;
css += `--darkreader-text--sb-category-text-${category}: ${luminance > 128 ? "black" : "white"};`;
}
css += "}";
styleContainer.innerText = css;
}

View File

@@ -1,7 +1,7 @@
import { localizeHtmlPage } from "@ajayyy/maze-utils/lib/setup";
import Config from "./config";
import { showDonationLink } from "./utils/configUtils";
import { localizeHtmlPage } from "./utils/pageUtils";
import { waitFor } from "@ajayyy/maze-utils";
window.addEventListener('DOMContentLoaded', init);

View File

@@ -152,8 +152,8 @@ class PreviewBar {
}
// Find the segment at that location, using the shortest if multiple found
const [normalSegments, chapterSegments] =
partition(this.segments.filter((s) => s.source !== SponsorSourceType.YouTube),
const [normalSegments, chapterSegments] =
partition(this.segments.filter((s) => s.source !== SponsorSourceType.YouTube),
(segment) => segment.actionType !== ActionType.Chapter);
let mainSegment = this.getSmallestSegment(timeInSeconds, normalSegments, "normal");
let secondarySegment = this.getSmallestSegment(timeInSeconds, chapterSegments, "chapter");
@@ -292,7 +292,7 @@ class PreviewBar {
if (this.originalChapterBar) {
this.originalChapterBarBlocks = this.originalChapterBar.querySelectorAll(":scope > div") as NodeListOf<HTMLElement>
this.existingChapters = this.segments.filter((s) => s.source === SponsorSourceType.YouTube).sort((a, b) => a.segment[0] - b.segment[0]);
if (this.existingChapters?.length > 0) {
const margin = parseFloat(this.originalChapterBarBlocks?.[0]?.style?.marginRight?.replace("px", ""));
if (margin) this.chapterMargin = margin;
@@ -331,18 +331,22 @@ class PreviewBar {
const fullCategoryName = (unsubmitted ? 'preview-' : '') + category;
bar.setAttribute('sponsorblock-category', fullCategoryName);
bar.style.backgroundColor = Config.config.barTypes[fullCategoryName]?.color;
// Handled by setCategoryColorCSSVariables() of content.ts
bar.style.backgroundColor = `var(--sb-category-${fullCategoryName})`;
if (!this.onMobileYouTube) bar.style.opacity = Config.config.barTypes[fullCategoryName]?.opacity;
bar.style.position = "absolute";
const duration = Math.min(segment[1], this.videoDuration) - segment[0];
const startTime = segment[1] ? Math.min(this.videoDuration, segment[0]) : segment[0];
const endTime = Math.min(this.videoDuration, segment[1]);
bar.style.left = this.timeToPercentage(startTime);
if (duration > 0) {
bar.style.width = `calc(${this.intervalToPercentage(segment[0], segment[1])}${
this.chapterFilter(barSegment) && segment[1] < this.videoDuration ? ` - ${this.chapterMargin}px` : ''})`;
bar.style.right = this.timeToPercentage(this.videoDuration - endTime);
}
if (this.chapterFilter(barSegment) && segment[1] < this.videoDuration) {
bar.style.marginRight = `${this.chapterMargin}px`;
}
const time = segment[1] ? Math.min(this.videoDuration, segment[0]) : segment[0];
bar.style.left = this.timeToPercentage(time);
return bar;
}
@@ -365,9 +369,9 @@ class PreviewBar {
this.unfilteredChapterGroups = this.createChapterRenderGroups(segments);
}
if (segments.every((segments) => segments.source === SponsorSourceType.YouTube)
|| (!Config.config.renderSegmentsAsChapters
&& segments.every((segment) => segment.actionType !== ActionType.Chapter
if (segments.every((segments) => segments.source === SponsorSourceType.YouTube)
|| (!Config.config.renderSegmentsAsChapters
&& segments.every((segment) => segment.actionType !== ActionType.Chapter
|| segment.source === SponsorSourceType.YouTube))) {
if (this.customChaptersBar) this.customChaptersBar.style.display = "none";
this.originalChapterBar.style.removeProperty("display");
@@ -462,7 +466,7 @@ class PreviewBar {
const latestChapter = result[result.length - 1];
if (latestChapter && latestChapter.segment[1] > segment.segment[0]) {
const segmentDuration = segment.segment[1] - segment.segment[0];
if (segment.segment[0] < latestChapter.segment[0]
if (segment.segment[0] < latestChapter.segment[0]
|| segmentDuration < latestChapter.originalDuration) {
// Remove latest if it starts too late
let latestValidChapter = latestChapter;
@@ -664,7 +668,7 @@ class PreviewBar {
if (changedData.scale !== null) {
const transformScale = (changedData.scale) / progressBar.clientWidth;
customChangedElement.style.transform =
customChangedElement.style.transform =
`scaleX(${Math.max(0, Math.min(1 - calculatedLeft, (transformScale - cursor) / fullSectionWidth - calculatedLeft))}`;
if (firstUpdate) {
customChangedElement.style.transition = "none";
@@ -681,7 +685,7 @@ class PreviewBar {
cursor += sectionWidthDecimal;
}
if (sections.length !== 0 && sections.length !== this.existingChapters?.length
if (sections.length !== 0 && sections.length !== this.existingChapters?.length
&& Date.now() - this.lastChapterUpdate > 3000) {
this.lastChapterUpdate = Date.now();
this.updateExistingChapters();
@@ -689,7 +693,7 @@ class PreviewBar {
}
}
private findLeftAndScale(selector: string, currentElement: HTMLElement, progressBar: HTMLElement):
private findLeftAndScale(selector: string, currentElement: HTMLElement, progressBar: HTMLElement):
{ left: number; scale: number } {
const sections = currentElement.parentElement.parentElement.parentElement.children;
let currentWidth = 0;
@@ -707,7 +711,7 @@ class PreviewBar {
const section = sections[i] as HTMLElement;
const checkElement = section.querySelector(selector) as HTMLElement;
const currentSectionWidthNoMargin = this.getPartialChapterSectionStyle(section, "width") ?? progressBar.clientWidth;
const currentSectionWidth = currentSectionWidthNoMargin
const currentSectionWidth = currentSectionWidthNoMargin
+ this.getPartialChapterSectionStyle(section, "marginRight");
// First check for left
@@ -750,8 +754,8 @@ class PreviewBar {
currentWidth += lastWidth;
}
return {
left: left + leftPosition,
return {
left: left + leftPosition,
scale: scale !== null ? scale * scaleWidth + scalePosition : null
};
}
@@ -766,7 +770,7 @@ class PreviewBar {
}
updateChapterText(segments: SponsorTime[], submittingSegments: SponsorTime[], currentTime: number): SponsorTime[] {
if (!Config.config.showSegmentNameInChapterBar
if (!Config.config.showSegmentNameInChapterBar
|| ((!segments || segments.length <= 0) && submittingSegments?.length <= 0)) {
const chaptersContainer = this.getChaptersContainer();
const chapterButton = this.getChapterButton(chaptersContainer);
@@ -780,7 +784,7 @@ class PreviewBar {
segments ??= [];
if (submittingSegments?.length > 0) segments = segments.concat(submittingSegments);
const activeSegments = segments.filter((segment) => {
return segment.hidden === SponsorHideType.Visible
return segment.hidden === SponsorHideType.Visible
&& segment.segment[0] <= currentTime && segment.segment[1] > currentTime
&& segment.category !== DEFAULT_CATEGORY;
});
@@ -837,7 +841,7 @@ class PreviewBar {
if (oldVoteContainers.length > 0) {
oldVoteContainers.forEach((oldVoteContainer) => oldVoteContainer.remove());
}
chapterButton.insertBefore(chapterVoteContainer, this.getChapterChevron());
}
@@ -913,7 +917,7 @@ class PreviewBar {
for (let i = 0; i < this.originalChapterBarBlocks.length; i++) {
const chapterElement = this.originalChapterBarBlocks[i];
const widthPixels = parseFloat(chapterElement.style.width.replace("px", ""));
if (time >= this.existingChapters[i].segment[1]) {
const marginPixels = chapterElement.style.marginRight ? parseFloat(chapterElement.style.marginRight.replace("px", "")) : 0;
pixelOffset += widthPixels + marginPixels;
@@ -928,8 +932,8 @@ class PreviewBar {
if (latestChapter) {
const latestWidth = parseFloat(this.originalChapterBarBlocks[lastCheckedChapter + 1].style.width.replace("px", ""));
const latestChapterDuration = latestChapter.segment[1] - latestChapter.segment[0];
const percentageInCurrentChapter = (time - latestChapter.segment[0]) / latestChapterDuration;
const percentageInCurrentChapter = (time - latestChapter.segment[0]) / latestChapterDuration;
const sizeOfCurrentChapter = latestWidth / totalPixels;
return Math.min(1, ((pixelOffset / totalPixels) + (percentageInCurrentChapter * sizeOfCurrentChapter)));
}
@@ -954,7 +958,7 @@ class PreviewBar {
let segment: PreviewBarSegment | null = null;
let index = -1;
let currentSegmentLength = Infinity;
for (let i = startSearchIndex; i < segments.length && i >= 0; i += direction) {
const seg = segments[i];
const segmentLength = seg.segment[1] - seg.segment[0];

View File

@@ -1,8 +1,8 @@
import Config from "../config";
import { SponsorTime } from "../types";
import { getSkippingText } from "../utils/categoryUtils";
import { keybindToString } from "../utils/configUtils";
import { AnimationUtils } from "../utils/animationUtils";
import { keybindToString } from "@ajayyy/maze-utils/lib/config";
export interface SkipButtonControlBarProps {
skip: (segment: SponsorTime) => void;

View File

@@ -13,9 +13,10 @@ import CategoryChooser from "./render/CategoryChooser";
import UnsubmittedVideos from "./render/UnsubmittedVideos";
import KeybindComponent from "./components/options/KeybindComponent";
import { showDonationLink } from "./utils/configUtils";
import { localizeHtmlPage } from "./utils/pageUtils";
import { localizeHtmlPage } from "@ajayyy/maze-utils/lib/setup";
import { StorageChangesObject } from "@ajayyy/maze-utils/lib/config";
import { getHash } from "@ajayyy/maze-utils/lib/hash";
import { isFirefoxOrSafari } from "@ajayyy/maze-utils";
const utils = new Utils();
let embed = false;
@@ -186,7 +187,7 @@ async function init() {
}
// Permission needed on Firefox
if (utils.isFirefox()) {
if (isFirefoxOrSafari()) {
const permissionSuccess = await new Promise((resolve) => {
chrome.permissions.request({
origins: [textChangeInput.value + "/"],

View File

@@ -1,6 +1,6 @@
import Config from "./config";
import Utils from "./utils";
import { localizeHtmlPage } from "./utils/pageUtils";
import { localizeHtmlPage } from "@ajayyy/maze-utils/lib/setup";
const utils = new Utils();
// This is needed, if Config is not imported before Utils, things break.

View File

@@ -20,13 +20,11 @@ import {
} from "./messageTypes";
import { showDonationLink } from "./utils/configUtils";
import { AnimationUtils } from "./utils/animationUtils";
import { GenericUtils } from "./utils/genericUtils";
import { shortCategoryName } from "./utils/categoryUtils";
import { localizeHtmlPage } from "./utils/pageUtils";
import { localizeHtmlPage } from "@ajayyy/maze-utils/lib/setup";
import { exportTimes } from "./utils/exporter";
import GenericNotice from "./render/GenericNotice";
import { noRefreshFetchingChaptersAllowed } from "./utils/licenseKey";
import { getFormattedTime } from "@ajayyy/maze-utils/lib/formating";
import { getErrorMessage, getFormattedTime } from "@ajayyy/maze-utils/lib/formating";
import { StorageChangesObject } from "@ajayyy/maze-utils/lib/config";
import { getHash } from "@ajayyy/maze-utils/lib/hash";
@@ -282,7 +280,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
}
const values = ["userName", "viewCount", "minutesSaved", "vip", "permissions"];
if (!Config.config.payments.freeAccess && !noRefreshFetchingChaptersAllowed()) values.push("freeChaptersAccess");
utils.asyncRequestToServer("GET", "/api/userInfo", {
publicUserID: await getHash(Config.config.userID),
@@ -317,13 +314,6 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
Config.config.isVip = userInfo.vip;
Config.config.permissions = userInfo.permissions;
if (userInfo.freeChaptersAccess) {
Config.config.payments.chaptersAllowed = userInfo.freeChaptersAccess;
Config.config.payments.freeAccess = userInfo.freeChaptersAccess;
Config.config.payments.lastCheck = Date.now();
Config.forceSyncUpdate("payments");
}
}
});
@@ -824,7 +814,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
PageElements.sponsorTimesContributionsContainer.classList.remove("hidden");
} else {
PageElements.setUsernameStatus.innerText = GenericUtils.getErrorMessage(response.status, response.responseText);
PageElements.setUsernameStatus.innerText = getErrorMessage(response.status, response.responseText);
}
});
@@ -877,7 +867,7 @@ async function runThePopup(messageListener?: MessageListener): Promise<void> {
//success (treat rate limits as a success)
addVoteMessage(chrome.i18n.getMessage("voted"), UUID);
} else if (response.successType == -1) {
addVoteMessage(GenericUtils.getErrorMessage(response.statusCode, response.responseText), UUID);
addVoteMessage(getErrorMessage(response.statusCode, response.responseText), UUID);
}
setTimeout(() => removeVoteMessage(UUID), 1500);
}

View File

@@ -67,7 +67,7 @@ export class Tooltip {
</img>
: null}
{this.text ?
<span className="sponsorSkipObject">
<span className={`sponsorSkipObject${!props.showLogo ? ` sponsorSkipObjectFirst` : ``}`}>
{this.text + (props.link ? ". " : "")}
{props.link ?
<a style={{textDecoration: "underline"}}

View File

@@ -31,6 +31,7 @@ export interface VideoDurationResponse {
}
export enum CategorySkipOption {
Disabled = -1,
ShowOverlay,
ManualSkip,
AutoSkip
@@ -221,14 +222,6 @@ export enum NoticeVisbilityMode {
FadedForAll = 4
}
export type Keybind = {
key: string;
code?: string;
ctrl?: boolean;
alt?: boolean;
shift?: boolean;
}
export interface ButtonListener {
name: string;
listener: (e?: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;

View File

@@ -1,83 +0,0 @@
import Config from "./config";
import { checkLicenseKey } from "./utils/licenseKey";
import { localizeHtmlPage } from "./utils/pageUtils";
import * as countries from "../public/res/countries.json";
import Utils from "./utils";
import { Category, CategorySkipOption } from "./types";
// This is needed, if Config is not imported before Utils, things break.
// Probably due to cyclic dependencies
Config.config;
const utils = new Utils();
window.addEventListener('DOMContentLoaded', init);
async function init() {
localizeHtmlPage();
const cantAfford = document.getElementById("cantAfford");
const cantAffordTexts = chrome.i18n.getMessage("cantAfford").split(/{|}/);
cantAfford.appendChild(document.createTextNode(cantAffordTexts[0]));
const discountButton = document.createElement("span");
discountButton.id = "discountButton";
discountButton.innerText = cantAffordTexts[1];
cantAfford.appendChild(discountButton);
cantAfford.appendChild(document.createTextNode(cantAffordTexts[2]));
const redeemButton = document.getElementById("redeemButton") as HTMLInputElement;
const redeemInput = document.getElementById("redeemCodeInput") as HTMLInputElement;
redeemButton.addEventListener("click", async () => {
const licenseKey = redeemInput.value;
if (await checkLicenseKey(licenseKey)) {
Config.config.payments.licenseKey = licenseKey;
Config.forceSyncUpdate("payments");
if (!utils.getCategorySelection("chapter")) {
Config.config.categorySelections.push({
name: "chapter" as Category,
option: CategorySkipOption.ShowOverlay
});
}
alert(chrome.i18n.getMessage("redeemSuccess"));
} else {
alert(chrome.i18n.getMessage("redeemFailed"));
}
});
discountButton.addEventListener("click", async () => {
const subsidizedSection = document.getElementById("subsidizedPrice");
subsidizedSection.classList.remove("hidden");
const oldSelector = document.getElementById("countrySelector");
if (oldSelector) oldSelector.remove();
const countrySelector = document.createElement("select");
countrySelector.id = "countrySelector";
countrySelector.className = "optionsSelector";
const defaultOption = document.createElement("option");
defaultOption.innerText = chrome.i18n.getMessage("chooseACountry");
countrySelector.appendChild(defaultOption);
for (const country of Object.keys(countries)) {
const option = document.createElement("option");
option.value = country;
option.innerText = country;
countrySelector.appendChild(option);
}
countrySelector.addEventListener("change", () => {
if (countries[countrySelector.value]?.allowed) {
document.getElementById("subsidizedLink").classList.remove("hidden");
document.getElementById("noSubsidizedLink").classList.add("hidden");
} else {
document.getElementById("subsidizedLink").classList.add("hidden");
document.getElementById("noSubsidizedLink").classList.remove("hidden");
}
});
subsidizedSection.appendChild(countrySelector);
});
}

View File

@@ -1,12 +1,12 @@
import Config, { VideoDownvotes } from "./config";
import { CategorySelection, SponsorTime, BackgroundScriptContainer, Registration, VideoID, SponsorHideType } from "./types";
import { CategorySelection, SponsorTime, BackgroundScriptContainer, Registration, VideoID, SponsorHideType, CategorySkipOption } from "./types";
import { getHash, HashedValue } from "@ajayyy/maze-utils/lib/hash";
import * as CompileConfig from "../config.json";
import { waitFor } from "@ajayyy/maze-utils";
import { isSafari } from "./utils/configUtils";
import { isFirefoxOrSafari, waitFor } from "@ajayyy/maze-utils";
import { findValidElementFromSelector } from "@ajayyy/maze-utils/lib/dom";
import { FetchResponse, sendRequestToCustomServer } from "@ajayyy/maze-utils/lib/background-request-proxy"
import { isSafari } from "@ajayyy/maze-utils/lib/config";
export default class Utils {
@@ -15,7 +15,6 @@ export default class Utils {
// Used to add content scripts and CSS required
js = [
"./js/vendor.js",
"./js/content.js"
];
css = [
@@ -50,7 +49,7 @@ export default class Utils {
setupExtraSitePermissions(callback: (granted: boolean) => void): void {
let permissions = ["webNavigation"];
if (!isSafari()) permissions.push("declarativeContent");
if (this.isFirefox() && !isSafari()) permissions = [];
if (isFirefoxOrSafari() && !isSafari()) permissions = [];
chrome.permissions.request({
origins: this.getPermissionRegex(),
@@ -114,7 +113,7 @@ export default class Utils {
});
}
if (!this.isFirefox() && chrome.declarativeContent) {
if (!isFirefoxOrSafari() && chrome.declarativeContent) {
// Only if we have permission
chrome.declarativeContent.onPageChanged.removeRules(["invidious"]);
}
@@ -144,7 +143,7 @@ export default class Utils {
containsInvidiousPermission(): Promise<boolean> {
return new Promise((resolve) => {
let permissions = ["declarativeContent"];
if (this.isFirefox()) permissions = [];
if (isFirefoxOrSafari()) permissions = [];
chrome.permissions.contains({
origins: this.getPermissionRegex(),
@@ -226,7 +225,7 @@ export default class Utils {
return selection;
}
}
return { name: "None", option: 0} as CategorySelection;
return { name: category, option: CategorySkipOption.Disabled} as CategorySelection;
}
/**
@@ -294,6 +293,7 @@ export default class Utils {
const selectors = [
"#player-container-id", // Mobile YouTube
"#movie_player",
".html5-video-player", // May 2023 Card-Based YouTube Layout
"#c4-player", // Channel Trailer
"#player-container", // Preview on hover
"#main-panel.ytmusic-player-page", // YouTube music
@@ -330,13 +330,6 @@ export default class Utils {
return Boolean(num.match(/^[0-9a-f]+$/i));
}
/**
* Is this Firefox (web-extensions)
*/
isFirefox(): boolean {
return typeof(browser) !== "undefined";
}
async addHiddenSegment(videoID: VideoID, segmentUUID: string, hidden: SponsorHideType) {
if (chrome.extension.inIncognitoContext || !Config.config.trackDownvotes) return;

View File

@@ -1,48 +1,5 @@
import Config from "../config";
import { Keybind } from "../types";
export function showDonationLink(): boolean {
return navigator.vendor !== "Apple Computer, Inc." && Config.config.showDonationLink;
}
export function isSafari(): boolean {
return typeof(navigator) !== "undefined" && navigator.vendor === "Apple Computer, Inc.";
}
export function keybindEquals(first: Keybind, second: Keybind): boolean {
if (first == null || second == null ||
Boolean(first.alt) != Boolean(second.alt) || Boolean(first.ctrl) != Boolean(second.ctrl) || Boolean(first.shift) != Boolean(second.shift) ||
first.key == null && first.code == null || second.key == null && second.code == null)
return false;
if (first.code != null && second.code != null)
return first.code === second.code;
if (first.key != null && second.key != null)
return first.key.toUpperCase() === second.key.toUpperCase();
return false;
}
export function formatKey(key: string): string {
if (key == null)
return "";
else if (key == " ")
return "Space";
else if (key.length == 1)
return key.toUpperCase();
else
return key;
}
export function keybindToString(keybind: Keybind): string {
if (keybind == null || keybind.key == null)
return "";
let ret = "";
if (keybind.ctrl)
ret += "Ctrl+";
if (keybind.alt)
ret += "Alt+";
if (keybind.shift)
ret += "Shift+";
return ret += formatKey(keybind.key);
}

View File

@@ -1,24 +1,3 @@
/**
* Gets the error message in a nice string
*
* @param {int} statusCode
* @returns {string} errorMessage
*/
function getErrorMessage(statusCode: number, responseText: string): string {
const postFix = ((responseText && !(responseText.includes(`cf-wrapper`) || responseText.includes("<!DOCTYPE html>"))) ? "\n\n" + responseText : "");
// display response body for 4xx
if([400, 429, 409, 0].includes(statusCode)) {
return chrome.i18n.getMessage(statusCode + "") + " " + chrome.i18n.getMessage("errorCode") + statusCode + postFix;
} else if (statusCode >= 500 && statusCode <= 599) {
// 503 == 502
if (statusCode == 503) statusCode = 502;
return chrome.i18n.getMessage(statusCode + "") + " " + chrome.i18n.getMessage("errorCode") + statusCode
+ "\n\n" + chrome.i18n.getMessage("statusReminder");
} else {
return chrome.i18n.getMessage("connectionError") + statusCode + postFix;
}
}
/* Gets percieved luminance of a color */
function getLuminance(color: string): number {
const {r, g, b} = hexToRgb(color);
@@ -50,7 +29,6 @@ function indexesOf<T>(array: T[], value: T): number[] {
}
export const GenericUtils = {
getErrorMessage,
getLuminance,
indexesOf
}

View File

@@ -1,78 +0,0 @@
import Config from "../config";
import Utils from "../utils";
import * as CompileConfig from "../../config.json";
import { getHash } from "@ajayyy/maze-utils/lib/hash";
const utils = new Utils();
export async function checkLicenseKey(licenseKey: string): Promise<boolean> {
const result = await utils.asyncRequestToServer("GET", "/api/verifyToken", {
licenseKey
});
try {
if (result.ok && JSON.parse(result.responseText).allowed) {
Config.config.payments.chaptersAllowed = true;
Config.config.showChapterInfoMessage = false;
Config.config.payments.lastCheck = Date.now();
Config.forceSyncUpdate("payments");
return true;
}
} catch (e) { } //eslint-disable-line no-empty
return false
}
/**
* The other one also tried refreshing, so returns a promise
*/
export function noRefreshFetchingChaptersAllowed(): boolean {
return Config.config.payments.chaptersAllowed || CompileConfig["freeChapterAccess"];
}
export async function fetchingChaptersAllowed(): Promise<boolean> {
if (Config.config.payments.freeAccess || CompileConfig["freeChapterAccess"]) {
return true;
}
//more than 14 days
if (Config.config.payments.licenseKey && Date.now() - Config.config.payments.lastCheck > 14 * 24 * 60 * 60 * 1000) {
const licensePromise = checkLicenseKey(Config.config.payments.licenseKey);
if (!Config.config.payments.chaptersAllowed) {
return licensePromise;
}
}
if (Config.config.payments.chaptersAllowed) return true;
if (Config.config.payments.lastCheck === 0 && Date.now() - Config.config.payments.lastFreeCheck > 2 * 24 * 60 * 60 * 1000) {
Config.config.payments.lastFreeCheck = Date.now();
Config.forceSyncUpdate("payments");
// Check for free access if no license key, and it is the first time
const result = await utils.asyncRequestToServer("GET", "/api/userInfo", {
value: "freeChaptersAccess",
publicUserID: await getHash(Config.config.userID)
});
try {
if (result.ok) {
const userInfo = JSON.parse(result.responseText);
Config.config.payments.lastCheck = Date.now();
if (userInfo.freeChaptersAccess) {
Config.config.payments.freeAccess = true;
Config.config.payments.chaptersAllowed = true;
Config.config.showChapterInfoMessage = false;
Config.forceSyncUpdate("payments");
return true;
}
}
} catch (e) { } //eslint-disable-line no-empty
}
return false;
}

View File

@@ -14,9 +14,9 @@ export function getControls(): HTMLElement {
];
for (const controlsSelector of controlsSelectors) {
const controls = document.querySelectorAll(controlsSelector);
const controls = Array.from(document.querySelectorAll(controlsSelector)).filter(el => !isInPreviewPlayer(el));
if (controls && controls.length > 0) {
if (controls.length > 0) {
return <HTMLElement> controls[controls.length - 1];
}
}
@@ -24,6 +24,10 @@ export function getControls(): HTMLElement {
return null;
}
export function isInPreviewPlayer(element: Element): boolean {
return !!element.closest("#inline-preview-player");
}
export function isVisible(element: HTMLElement): boolean {
return element && element.offsetWidth > 0 && element.offsetHeight > 0;
}
@@ -63,14 +67,14 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number):
const timeElement = link.querySelector("#time") as HTMLElement;
const description = link.querySelector("#details h4") as HTMLElement;
if (timeElement && description?.innerText?.length > 0 && link.getAttribute("href")?.includes(currentVideoID)) {
const time = getFormattedTimeToSeconds(timeElement.innerText.replace(".", ":"));
const time = getFormattedTimeToSeconds(timeElement.innerText.replace(/\./g, ":"));
if (time === null) return [];
if (lastSegment) {
lastSegment.segment[1] = time;
chapters.push(lastSegment);
}
lastSegment = {
segment: [time, null],
category: "chapter" as Category,
@@ -89,27 +93,4 @@ export function getExistingChapters(currentVideoID: VideoID, duration: number):
}
return chapters;
}
export function localizeHtmlPage(): void {
//Localize by replacing __MSG_***__ meta tags
const localizedTitle = getLocalizedMessage(document.title);
if (localizedTitle) document.title = localizedTitle;
const body = document.querySelector(".sponsorBlockPageBody");
const localizedMessage = getLocalizedMessage(body.innerHTML.toString());
if (localizedMessage) body.innerHTML = localizedMessage;
}
export function getLocalizedMessage(text: string): string | false {
const valNewH = text.replace(/__MSG_(\w+)__/g, function(match, v1) {
return v1 ? chrome.i18n.getMessage(v1).replace(/</g, "&#60;")
.replace(/"/g, "&quot;").replace(/\n/g, "<br/>") : "";
});
if (valNewH != text) {
return valNewH;
} else {
return false;
}
}

115
src/utils/thumbnails.ts Normal file
View File

@@ -0,0 +1,115 @@
import { isOnInvidious, parseYouTubeVideoIDFromURL } from "@ajayyy/maze-utils/lib/video";
import Config from "../config";
import { getVideoLabel } from "./videoLabels";
import { setThumbnailListener } from "@ajayyy/maze-utils/lib/thumbnailManagement";
export async function labelThumbnails(thumbnails: HTMLImageElement[]): Promise<void> {
await Promise.all(thumbnails.map((t) => labelThumbnail(t)));
}
export async function labelThumbnail(thumbnail: HTMLImageElement): Promise<HTMLElement | null> {
if (!Config.config?.fullVideoSegments || !Config.config?.fullVideoLabelsOnThumbnails) {
hideThumbnailLabel(thumbnail);
return null;
}
const link = (isOnInvidious() ? thumbnail.parentElement : thumbnail.querySelector("#thumbnail")) as HTMLAnchorElement
if (!link || link.nodeName !== "A" || !link.href) return null; // no link found
const videoID = parseYouTubeVideoIDFromURL(link.href)?.videoID;
if (!videoID) {
hideThumbnailLabel(thumbnail);
return null;
}
const category = await getVideoLabel(videoID);
if (!category) {
hideThumbnailLabel(thumbnail);
return null;
}
const { overlay, text } = createOrGetThumbnail(thumbnail);
overlay.style.setProperty('--category-color', `var(--sb-category-preview-${category}, var(--sb-category-${category}))`);
overlay.style.setProperty('--category-text-color', `var(--sb-category-text-preview-${category}, var(--sb-category-text-${category}))`);
text.innerText = chrome.i18n.getMessage(`category_${category}`);
overlay.classList.add("sponsorThumbnailLabelVisible");
return overlay;
}
function getOldThumbnailLabel(thumbnail: HTMLImageElement): HTMLElement | null {
return thumbnail.querySelector(".sponsorThumbnailLabel") as HTMLElement | null;
}
function hideThumbnailLabel(thumbnail: HTMLImageElement): void {
const oldLabel = getOldThumbnailLabel(thumbnail);
if (oldLabel) {
oldLabel.classList.remove("sponsorThumbnailLabelVisible");
}
}
function createOrGetThumbnail(thumbnail: HTMLImageElement): { overlay: HTMLElement; text: HTMLElement } {
const oldElement = getOldThumbnailLabel(thumbnail);
if (oldElement) {
return {
overlay: oldElement as HTMLElement,
text: oldElement.querySelector("span") as HTMLElement
};
}
const overlay = document.createElement("div") as HTMLElement;
overlay.classList.add("sponsorThumbnailLabel");
// Disable hover autoplay
overlay.addEventListener("pointerenter", (e) => {
e.stopPropagation();
thumbnail.dispatchEvent(new PointerEvent("pointerleave", { bubbles: true }));
});
overlay.addEventListener("pointerleave", (e) => {
e.stopPropagation();
thumbnail.dispatchEvent(new PointerEvent("pointerenter", { bubbles: true }));
});
const icon = createSBIconElement();
const text = document.createElement("span");
overlay.appendChild(icon);
overlay.appendChild(text);
thumbnail.appendChild(overlay);
return {
overlay,
text
};
}
function createSBIconElement(): SVGSVGElement {
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("viewBox", "0 0 565.15 568");
const use = document.createElementNS("http://www.w3.org/2000/svg", "use");
use.setAttribute("href", "#SponsorBlockIcon");
svg.appendChild(use);
return svg;
}
// Inserts the icon svg definition, so it can be used elsewhere
function insertSBIconDefinition() {
const container = document.createElement("span");
// svg from /public/icons/PlayerStartIconSponsorBlocker.svg, with useless stuff removed
container.innerHTML = `
<svg viewBox="0 0 565.15 568" style="display: none">
<defs>
<g id="SponsorBlockIcon">
<path d="M282.58,568a65,65,0,0,1-34.14-9.66C95.41,463.94,2.54,300.46,0,121A64.91,64.91,0,0,1,34,62.91a522.56,522.56,0,0,1,497.16,0,64.91,64.91,0,0,1,34,58.12c-2.53,179.43-95.4,342.91-248.42,437.3A65,65,0,0,1,282.58,568Zm0-548.31A502.24,502.24,0,0,0,43.4,80.22a45.27,45.27,0,0,0-23.7,40.53c2.44,172.67,91.81,330,239.07,420.83a46.19,46.19,0,0,0,47.61,0C453.64,450.73,543,293.42,545.45,120.75a45.26,45.26,0,0,0-23.7-40.54A502.26,502.26,0,0,0,282.58,19.69Z"/>
<path d="M 284.70508 42.693359 A 479.9 479.9 0 0 0 54.369141 100.41992 A 22.53 22.53 0 0 0 42.669922 120.41992 C 45.069922 290.25992 135.67008 438.63977 270.83008 522.00977 A 22.48 22.48 0 0 0 294.32031 522.00977 C 429.48031 438.63977 520.08047 290.25992 522.48047 120.41992 A 22.53 22.53 0 0 0 510.7793 100.41992 A 479.9 479.9 0 0 0 284.70508 42.693359 z M 220.41016 145.74023 L 411.2793 255.93945 L 220.41016 366.14062 L 220.41016 145.74023 z "/>
</g>
</defs>
</svg>`;
document.body.appendChild(container.children[0]);
}
export function setupThumbnailListener(): void {
setThumbnailListener(labelThumbnails, () => {
insertSBIconDefinition();
}, () => Config.isReady());
}

Some files were not shown because too many files have changed in this diff Show More